GithubHelp home page GithubHelp logo

hugulp's Introduction

DEPRECATION NOTICE

I'll archive the repo by the end of August 2021.

The main reason is Hugo pipes are built-in and pretty much cover what Hugulp does.

I think the only part missing is image optimization, but I think you can build a pipe to do it.

The other reason is it badly needs an update to gulp 4 and although it doesn't seem like that hard a task, I don't have the appetite to do it.

hugulp 2

v2 Breaking changes

If you're using hugulp v1, please take note of the following changes:

  • hugo is no longer invoked by hugulp

    use hugo as per its docs, then invoke hugulp build

  • put your assets in the static folder

    for example, static/styles, static/images, static/scripts

  • themes are supported out of the box

Note: If you need sass/less/js pre-processing, read v2 docs below

Description

hugulp is a tool to optimize the assets of a Hugo website.

The main idea is to recreate the famous Ruby on Rails Asset Pipeline, which minifies, concatenates and fingerprints the assets used in your website.

This leads to less and smaller network requests to your page, improving overall user experience.

Read this blog post and this article for additional context.

Note: These articles refer to v1

It's internally driven by Gulp.

This project Includes the following tools, tasks and workflows:

Installation

Node needs to be installed in your system.

Then just

$ npm install -g hugulp

Or you can build and run using docker:

# Default docker setup:
$ ./scripts/create-docker-machine-and-run-it

# -- OR --

# Run with custom machine name, specific hugo version, specific node version and run docker in detached mode:
$ ./scripts/create-docker-machine-and-run-it -a app-devel -g 0.20.6 -n 6.10.0 -d

Note: You only run the ./scripts/create-docker-machine-and-run-it if you want to create a new docker machine. Once the docker machine is created, you have to use docker commands to manage it. Please be familiar with docker in this regard.

Getting Started

The most common usage scenario would be:

$ hugo new site yoursite
$ cd yoursite
$ hugulp init
# create content
# add images (static/images), css (static/styles) and javascript (static/scripts)
$ hugo server -D # for development
# development is done, ready to publish
$ rm -rf public # clean up public folder, it will be re-generated by hugo
$ hugo # for release/production/deployment
$ hugulp build # optimize the site by running the asset pipeline

Another scenario would be to include sass/less pre-processing:

$ hugo new site yoursite
$ cd yoursite
$ hugulp init
# create content
# add images (static/images), and javascript (static/scripts)
# add sass/less (assets/styles)
$ hugo server -D # for development
$ hugulp watch # to convert sass/less (assets/styles) into css (static/styles)
# development is done, ready to publish
$ rm -rf public # clean up public folder, it will be re-generated by hugo
$ hugo # for release/production/deployment
$ hugulp build # optimize the site by running the asset pipeline

In both cases, you could chain the last 3 commands:

$ rm -rf public && hugo && hugulp build

hugulp requires a configuration file (.hugulprc), which is created by the hugulp init command (you can create the file manually if you want).

This is the default .hugulprc:

{
  "version": 2,
  "pipeline": ["images", "styles", "scripts", "fingerprint", "html"],
  "path": {
    "styles": "styles",
    "images": "images",
    "scripts": "scripts"
  },
  "watch": {
    "source": "assets",
    "target": "static"
  },
  "build": {
    "source": "public",
    "target": "public"
  },
  "autoprefixer": {
    "browsers": ["last 2 versions"]
  },
  "cleancss": {
    "advanced": false
  },
  "htmlmin": {
    "collapseWhitespace": true
  },
  "gifsicle": { "interlaced": true },
  "jpegtran": { "progressive": true },
  "optipng": { "optimizationLevel": 5 },
  "svgo": {
    "plugins": [{ "removeViewBox": true }, { "cleanupIDs": false }]
  }
}

You can easily customize hugulp's behavior, by modifying this configuration file, as described below.

Available Commands

hugulp watch

hugulp will assist you if you're using sass/less (and javascript), which require pre-processing.

It will watch for changes to styles or script files, process them and write them to hugo's static folder, according to the following table

In Folder Looks for Operation Written to
assets/styles s[a|c]ss, less, css Convert sass/less to css static/styles
assets/scripts js Lint javascript code (soon babelify) static/scripts

Note: It searches the folders recursively

The table above applies to hugulp run with a default .hugulprc.

You can customize the folder names: resources instead of assets, js instead of scripts and so on.

This is described in the .hugulprc section below.

hugulp build

It optimizes the site that hugo built, by running the asset pipeline as defined in .hugulprc (field pipeline).

Additionally, files are not watched for changes

hugulp version

Display installed version.

hugulp init

Create a default .hugulprc.

Configuration

By editing the .hugulprc configuration file, you can customize almost anything about hugulp.

Description of each field follows:

pipeline

Defines which tasks of the asset pipeline will be executed (hugulp build command)

Type: array
Default:

"pipeline": ["images", "styles", "scripts", "fingerprint", "html"]
Task Description
images minify images with imagemin
styles pre-process sass/less/css, then clean-css
scripts jshint, then uglify
fingerprint fingerprint with rev, then replace references with rev-replace
html minify html with htmlmin

Let's say you don't want to fingerprint the assets. Just set pipeline to

"pipeline": ["images", "styles", "scripts", "html"]

By removing the fingerprint task, it will not be executed.

Note that tasks are executed sequentially.

path

Defines the name of the folders where your assets are located/will be transferred to.

Type: object
Default:

"path": {
  "styles": "styles",
  "images": "images",
  "scripts": "scripts"
}

So if you prefer your styles folder to be called css, and scripts to be called js, you would change it to:

"path": {
  "styles": "css",
  "images": "images",
  "scripts": "js"
}

watch

Define which folders to watch for changes, for the hugulp watch command.

Type: object
Default:

"watch": {
  "source": "assets",
  "target": "static"
}

This field works together with the path field.

With a default .hugulprc, it will watch assets/styles and assets/scripts (recursively).

If you customized path as per above, it will watch assets/css and assets/js.

If you additionally want the assets folder to be called resources, change source to resources

"watch": {
  "source": "resources",
  "target": "static"
}

then it will watch resources/css and resources/js

Finally, the changes will be written to the well-known hugo static folder.

With a default .hugulprc, files will be written to static/styles and static/scripts.

build

Defines the folders referenced during the hugulp build command

Type: object
Default:

"build": {
  "source": "public",
  "target": "public"
}

This should generally be left unchanged.

hugo will output to the public folder by default, so hugulp build will process the files in-place.

autoprefixer

Options for autoprefixer. Check gulp-autoprefixer for documentation.

Task: styles

Type: object
Default:

"autoprefixer": {
  "browsers": ["last 2 versions"]
}

cleancss

Options for clean-css. Check gulp-clean-css for documentation.

Task: styles

Default:

"cleancss": {
  "advanced": false
}

htmlmin

Options for htmlmin. Check gulp-htmlmin for documentation.

Task: html

Default:

"htmlmin": {
  "collapsedWhitespace": true
}

gifsicle

Options for gifsicle. Check gulp-imagemin for documentation.

Task: images

Default:

"gifsicle": {
  "interlaced": true
}

jpegtran

Options for jpegtran. Check gulp-imagemin for documentation.

Task: images

Default:

"jpegtran": {
  "progressive": true
}

optipng

Options for optipng. Check gulp-imagemin for documentation.

Task: images

Default:

"optipng": {
  "optimizationLevel": 5
}

svgo

Options for svgo. Check gulp-imagemin for documentation.

Task: images

Default:

"svgo": {
  "plugins": [{ "removeViewBox": true }, { "cleanupIDs": false }]
}

How to update

Whenever a new hugulp version becomes available, you can update it by running

$ npm install -g hugulp

PR

Pull Requests are welcome 👍.

Share

Made by Juan B. Rodriguez, with a MIT License.

Please share the article or leave your comments.

hugulp's People

Contributors

autoferrit avatar eyedol avatar jamesmcmahon avatar jaydreyer avatar jbrodriguez avatar lichtner avatar mgladdish avatar saschalalala avatar stijnsymons avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

hugulp's Issues

Optional asset fingerprinting?

Could this be made optional without a fork? I use s3_website to deploy my Hugo site and it simply sets cache headers during the CDN deployment, enabling instant cache invalidation without altering the structure of my static files.

JavaScript Concatenation?

The README says:

The main idea is to recreate the famous Ruby on Rails Asset Pipeline, which minifies, concatenates and fingerprints the assets used in your website.

I can't seem to figure out how to get JavaScript concatenation working. Compressing and fingerprinting are working fine but not concatenation. Is there something undocumented that allows this?

why doesn't 'watch' include autoprefixer?

Autoprefixer doesn't appear to run during watch, only during build.
While building the site, I have to do a full build to see what the site will look like. We're also using forestry.io so, for now atleast, we check-in the artifacts in the static folder, which means our previews are also incorrect.
Is this intentional?

CSS and JS not minified

rm -rf public && hugo && hugulp build

                   | EN   
+------------------+-----+
  Pages            |  19  
  Paginator pages  |   0  
  Non-page files   |  50  
  Static files     |  31  
  Processed images | 195  
  Aliases          |   0  
  Sitemaps         |   1  
  Cleaned          |   0  

Total in 322 ms
[19:37:11] hugulp v2.0.5
[19:37:12] building site ... (["images","styles","scripts","fingerprint","html"])
[19:37:13] gulp-imagemin: Minified 3 images (saved 7.47 kB - 7%)
[19:37:13] html:  all files 135.16 kB

My CSS and JS files aren't minified.
I'm using the default settings in .hugulprc.
CSS and JS files are fingerprinted though, and references to fingerprinted images are updated inside the CSS, but nothing more.
Comments etc. remain.

I installed via npm install -g hugulp on MacOS.

hugo-cli integration

Love the tool! So much easier than setting it all up from scratch.

Have you considered integration hugo-cli? I'm on Windows and it's the only link in the chain that requires manual set up.

Something's not right

Hi! Thanks for buiding this.

I've got it installed, but I think I'm missing something, because running hugulp build doesn't seem to be minifying anything.

I'm using a theme. Is that an issue? is the assets folder supposed to be in the root of the website? So, /website/assets ? Am I supposed to move all of my images/js/css to these assets folders? If so, how does that work with the theme?

Anyway, it runs, but I'm doing something wrong. At least I think I am. The output I receive is:

[21:15:13] gulp-imagemin: Minified 0 images
[21:15:13] src: /Users/z035002/Documents/personal-git/myearworms dst: /Users/z035002/Documents/personal-git/myearworms/public
[21:15:13] hugo: 
Started building sites ...
Built site for language en:
0 draft content
0 future content
0 expired content
4 regular pages created
16 other pages created
0 non-page files copied
13 paginator pages created
9 tags created
3 categories created
total in 39 ms

[21:15:14] all files 555.46 kB

Thanks for your help. It's probably something dumb I've done.

Unable to minify Javascript error

When I run hugulp the following error is encountered.

Do I need to modify the gulp settings so that I can minify javascript in ES6 syntax?

`crabs-MBP:KARAI cr.ab2$ hugulp build
[23:53:13] gulp-imagemin: Minified 0 images
assets/scripts/radio.js: line 20, col 11, 'template literal syntax' is only available in ES6 (use 'esversion: 6').
assets/scripts/radio.js: line 22, col 28, 'template literal syntax' is only available in ES6 (use 'esversion: 6').

2 errors

events.js:183
throw er; // Unhandled 'error' event
^
GulpUglifyError: unable to minify JavaScript
at createError (/usr/local/lib/node_modules/hugulp/node_modules/gulp-uglify/lib/create-error.js:6:14)
at wrapper (/usr/local/lib/node_modules/hugulp/node_modules/gulp-uglify/node_modules/lodash/_createHybrid.js:87:15)
at trycatch (/usr/local/lib/node_modules/hugulp/node_modules/gulp-uglify/minifier.js:26:12)
at DestroyableTransform.minify [as _transform] (/usr/local/lib/node_modules/hugulp/node_modules/gulp-uglify/minifier.js:79:19)
at DestroyableTransform.Transform._read (/usr/local/lib/node_modules/hugulp/node_modules/readable-stream/lib/_stream_transform.js:182:10)
at DestroyableTransform.Transform._write (/usr/local/lib/node_modules/hugulp/node_modules/readable-stream/lib/_stream_transform.js:170:83)
at doWrite (/usr/local/lib/node_modules/hugulp/node_modules/readable-stream/lib/_stream_writable.js:406:64)
at writeOrBuffer (/usr/local/lib/node_modules/hugulp/node_modules/readable-stream/lib/_stream_writable.js:395:5)
at DestroyableTransform.Writable.write (/usr/local/lib/node_modules/hugulp/node_modules/readable-stream/lib/_stream_writable.js:322:11)
at DestroyableTransform.ondata (/usr/local/lib/node_modules/hugulp/node_modules/readable-stream/lib/_stream_readable.js:612:20)`

.hugulprc

Wouldn't it be nice to have a hugulp config file? Some things that could be configured on a project base from my point of view:

  • linter: eslint/jshint/standard
  • minifyhtml: true/false
  • uncss: true/false(see #27, would also need general uncss support)

Allow json extension for config file

Currently .hugulprc is the only allowed name for the config file. But must text editors dont recognise it as a json file because of the lack of a file extension. I propose to also allow the config file to be named hugulprc.json. For backwards compatibility .hugulprc should be the default case and only if this file is not found, we should look for a other file.

UnCSS support

While looking at Foundation framework I see that it uses UnCSS to trim the final CSS from the unused CSS selectors which looks quite nice when optimizing assets' size, so I wonder what do you think about including support for UnCSS in Hugulp or it is already possible to do it easily?

hugulp next

This is the proposal for the next version of hugulp.

Currently, hugulp depends on node.js, isn't easily configurable and doesn't play nice with themes.

I looked into having a binary built in Go, to run all the tasks, so that no dependencies were required.

But the fact remains that nodejs has the best ecosystem of readily available plugins/libraries for sass/less preprocessing, image optimization, etc., so it's difficult to move away.

Nevertheless, while looking into the matter, I became aware that a better architecture would be to make hugulp a post-processor of hugo !

Do whatever you want with hugo, install/customize any themes, use hugo built-in watching for hot reloading.

When you're ready to publish the site invoke hugo, then hugulp to optimize the site hugo built. Something like:

  • hugo && hugulp build

hugulp will process the public folder, running the asset pipeline.

This pipeline is defined in the config file (.hugulprc as per @saschalalala suggestion), so if maybe you don't want to fingerprint the assets, just remove the corresponding task(s) from the pipeline field of the config.

This would work extremely well, weren't for sass/lees and probably babel/js pre-processing.

So, hugulp watch needs to live on, to make those conversions.

The hugulp next branch is an implementation of this concept.

This is a sample .hugulprc

{
	"pipeline": ["images", "styles", "revision", "reference", "minifyhtml"],
	"path": {
		"styles": "css",
		"images": "img",
		"scripts": "js"
	},
	"watch": {
		"source": "assets",
		"target": "static"
	},
	"build": {
		"source": "public",
		"target": "public"
	},
	"autoprefixer": { "browsers": ["last 2 versions"] },
	"cleancss": { "advanced": false },
	"htmlmin": { "collapseWhitespace": true, "removeEmptyElements": true }
}

Some thought needs to be given to alternate plugins: uncss instead of cleancss, etc.

Although it works pretty well, as per my tests, still needs more polishing, remove some duplication, delete public folder before invocation and probably review a couple of decisions.

Let me know what you think !

@saschalalala @jhabdas @eyedol @autoferrit @jaydreyer

Ref #28 #32 #27 #35 #20 #15

Source Map

Hi!
Is there some way to enable source maps? I would it use for for CSS/SCSS.

Best Regards

Are subfolders of assets/img processed?

For most of my js/css/img files, I have subfolders. So in assets/img I have assets/img/main and img/posts or whatever. When I run hugulp build are these files in subfolders being processed? Is it expecting a flat structure?

Looking at the code I see return gulp.src('assets/img/*.*'), which leads me to think it would just take everything at root. I'm wondering if it was assets/img/**/*.* if that would take care of grabbing all files in subdirectories.

Support .sass files in addition to .scss

The Hugulp styles task only watches for .less, .scss, and .css files.

I'm using Bulma, which is built on .sass files. It'd be great if Hugulp watched those properly and incorporated them into a styles file.

There is a workaround, which is to define a single .scss file that imports the .sass components that I care about:

assets/styles/
|_main.scss    # Imports 'bulma/bulma'
|_bulma/
  |_bulma.sass
  |_sass/
      ... etc

This feels hacky and I'd rather not do it :)

Stuck in infinite loop on Ubuntu

selection_253

Probably my fault, since “root” doesn’t have access to node-sass for some reason… But for good measure, I’m still reporting the issue, in case it has something to do with hugulp.

No stylesheets generated?

I'm trying to use scss with my project and have followed the installation process line by line and my page is still not being styled correctly.

  "path": {
    "styles": "styles",
    "images": "images",
    "scripts": "scripts"
  },
  "watch": {
    "source": "resources",
    "target": "static"
  },

Nothing is being written to the static folder, it is remaining empty. I thought it takes my scss from my resources/styles folder and turns it into css to my static folder. Why is it not doing this?

https://i.imgur.com/vUW9E2B.jpg

[discussion] Dropping LESS support

Why have both? libsass is a rockstar. and libs like susy and breakpoint make authoring CSS with SASS a dream come true. plus most Jekyll sites use SASS, so there's a good reason to bring the opinion IMHO.

Update code and variables

Move to const and let and be consistent with coding style (What exactly is preferred? https://github.com/standard/standard?). I am going to start implementing this and create a PR as soon as I have something done. Want to read through the sourcecode anyway so I can start replacing var.

build process uses localhost for publishing

Hi,

this project is exactly what I was looking for since a couple of months. It is great for development, but once I want to build the site for the production server, it still uses --baseURL=localhost:3000.

I am not a gulp expert, but I guess that the gulp task is always invoked with the drafts=true param causing the above issue. I tried to directly start other gulp tasks like hugulp build:publish, but that does not do the trick. Nothing happens at all.

I don't get any errors, so the install seems to be fine. It is mainly the baseURL that makes some trouble.

gulp and gulp publish error out on hugo:all

Installed as described in the README. Everything seemed to go smoothly, but when I ran gulp or gulp publish I get these errors:

'hugo:all' errored after 1.24 ms
TypeError: undefined is not a function
    at hugo (/[path]/gulp/hugo.js:18:18)
    at Gulp.<anonymous> (/[path]/gulp/hugo.js:27:5)
    at module.exports (/[path]/node_modules/gulp/node_modules/orchestrator/lib/runTask.js:34:7)
    at Gulp.Orchestrator._runTask (/[path]/node_modules/gulp/node_modules/orchestrator/index.js:273:3)
    at Gulp.Orchestrator._runStep (/[path]/node_modules/gulp/node_modules/orchestrator/index.js:214:10)
    at /[path]/node_modules/gulp/node_modules/orchestrator/index.js:279:18
    at finish (/[path]/node_modules/gulp/node_modules/orchestrator/lib/runTask.js:21:8)
    at /[path]/node_modules/gulp/node_modules/orchestrator/lib/runTask.js:52:4
    at f (/[path]/node_modules/gulp/node_modules/orchestrator/node_modules/end-of-stream/node_modules/once/once.js:17:25)
    at DestroyableTransform.onend (/[path]/node_modules/gulp/node_modules/orchestrator/node_modules/end-of-stream/index.js:31:18)

All the other gulp tasks completed successfully; it's something about the hugo task, and I think specifically the hugo(drafts) function.

This looks like a great project, but I'm not sure how to proceed from here. Let me know if there's any more information I can provide!

having problem with reference task

I suspect this is me failing to understand something, but my styles.css isn't being replaced with styles-.css in any of my generated html.

The hugo task runs, and the styles-.css is created, but the references in the HTML are not changed. Not sure how to debug this further, please assist.

Add support for watching/building hugo theme

So, I am workign on a theme for my hugo site. And the files aren't watched by hugulp. I had started adding support for it but then realized you were parsing a config file already based on if someone specified an alternate config. I started with this in reference.js:

var toml = require('toml-require').install({});
var configpath = path.join(path.resolve('./'), 'config.toml');
var tomlconfig = require(configpath);
var hugotheme = tomlconfig.theme

but you try to parse config files in hugo.js in the hugo() function.

The code above will properly get the config.toml in the root dir of the hugo app which is the default. And will properly get the theme. But I wanted to get your thoughts on how you would like to do this. Preferably I would like to have access to the theme name in the files that would handle those files. to watch the html/css/less/scss/js/whatever.

Add docker support

Spinning this off a docker image will ease a lot of setup and deployment efforts. I don't have to install node and npm stuff on my host machine. Would help hugely with teams when it comes to development collaboration. Alas, but it's working on my machine!

I opened a PR a few days ago in a similar project but the maintainers find it not aligning with the project's goal of keeping it simple( which I understand ). Reading through the comments on #18 it seems there's an interest in adding docker support. Let me know if you welcome a PR for this. I'll open one right away.

Hugo stage of gulp process causing 'Command failed' error

I tried this (Windows 7 x64) but could not get gulp to complete the build script.

It fails when the hugo command is run.

What makes it super confusing (I'm also new to gulp) is that the hugo project is called hugo (so it's hard to know what refers to hugo and what to the project).

Also I don't know if this is a gulp thing, but there are layers of dependency which make modifying it hard. If this is how gulp works, its not for me.

Example: reference:all links to hugo:all and build:all looks for reference:all. I tried to remove the hugo part of the gulp process but it got messy.

Personally I think running Hugo from within the gulp file is unnecessary, and better to enable the user to run the command they want foor that project at whatever stage.

imagemin bombs

.pipe(imagemin()) in gulp/images.js is the culprit

~/hugulp » gulp
[07:31:21] Using gulpfile ~/hugulp/gulpfile.js
[07:31:21] Starting 'styles'...
[07:31:21] Starting 'scripts'...
[07:31:21] Starting 'images'...
[07:31:21] Starting 'svg'...
[07:31:21] Finished 'styles' after 63 ms
[07:31:21] Finished 'svg' after 27 ms

events.js:141
throw er; // Unhandled 'error' event
^
Error: spawn /home/ybg/hugulp/node_modules/gulp-imagemin/node_modules/imagemin/node_modules/imagemin-jpegtran/node_modules/jpegtran-bin/vendor/jpegtran ENOENT
at exports._errnoException (util.js:874:11)
at Process.ChildProcess._handle.onexit (internal/child_process.js:178:32)
at onErrorNT (internal/child_process.js:344:16)
at doNTCallback2 (node.js:439:9)
at process._tickCallback (node.js:353:17)
~/hugulp »

hugulp reprocesses images already compressed or optimized by hugulp

When running hugulp, if selecting or setting:

"pipeline": [
"images",
"styles",
"scripts",
"fingerprint",
"html"
],

in the .hugulprc config file than, every time you build the site it will reprocess the images, even if they have not changed. Since this is quite cpu intensive and non-trivial for a large amount of images I suggest that the image should be hashed with shasum -a 512 image.jpg and the image stored in a processed folder that is checked when rerunning hugulp. This might be a better process for all the minification steps. Process once, reuse the results which should be bit for bit accurate if starting with the same input file.

HTML minifying

Hugo creates some artifacts (for example empty <p> elements) and a lot of unnecessary whitespace (can be deleted using {{- foo -}}) when compiling HTML. I created an additional task and command that uses https://github.com/jonschlinkert/gulp-htmlmin for cleaning the html. I am going to create a pull request soon.

In order not to not interfere with existing scripts I did not integrate it in the default build process. This way a user can do the following:

hugulp build && hugulp minifyhtml

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.