Gulp is a tool that helps us write a number of tasks to speed up the Web development process.
It is often used to
- Spinning up web server
- Reload browser when the file is saved.
- Use SASS or LESS
- Optimizing assets such as CSS, JS, images
Proficient in Gulp will help us to become more active in web development.
However, because I do not have to use it often, I only use it to code front-end quickly.
In this article, I will build a template for quick use by front-end side-projects
Install Gulp
To be able to instal Gulp, Nodejs is required already installed on your computer. If you have not installed Nodejs, you can install it on the Nodejs homepage.
After installing Nodejs, install gulp. Flag -g to install gulp global, more convenient for running tasks.
1 2 | $ sudo npm install gulp -g |
Create projects and install dependencies
1 2 | $ npm init |
1 2 | $ npm install gulp --save-dev |
- Folder stucture will be as follows
1 2 3 4 5 6 7 8 9 10 11 12 | |- app/ |- css/ |- fonts/ |- images/ |- index.html |- js/ |- scss/ |- dist/ |- gulpfile.js |- node_modules/ |- package.json |
A brief explanation of this folder structure.
Folder App for storing source files, while dist / for storing compressed files for production.
Gulfile.js is the file for configuring gulp.
Writing first gulp task
By definition, gulp is an async function, which can be created simply as follows
1 2 3 4 5 6 | <span class="token keyword">var</span> gulp <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'gulp'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">Promise</span> <span class="token punctuation">(</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token parameter">resolve <span class="token punctuation">,</span> reject</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">"HTTP Server Started"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">resolve</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
When running gulp hello will print out log.
Specifically, the gulp task has the form
1 2 3 4 5 6 | gulp <span class="token punctuation">.</span> <span class="token function">task</span> <span class="token punctuation">(</span> <span class="token string">'task-name'</span> <span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> gulp <span class="token punctuation">.</span> <span class="token function">src</span> <span class="token punctuation">(</span> <span class="token string">'source-files'</span> <span class="token punctuation">)</span> <span class="token comment">// Get source files with gulp.src</span> <span class="token punctuation">.</span> <span class="token function">pipe</span> <span class="token punctuation">(</span> <span class="token function">aGulpPlugin</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token comment">// Sends it through a gulp plugin</span> <span class="token punctuation">.</span> <span class="token function">pipe</span> <span class="token punctuation">(</span> gulp <span class="token punctuation">.</span> <span class="token function">dest</span> <span class="token punctuation">(</span> <span class="token string">'destination'</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token comment">// Outputs the file in the destination folder</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> |
gulp.src specifies the file will run that task, gulp.pipe is the plugin that will be run on the file, gulp.dest specifies the output
Preprocess with gulp
Sass, LESS can compile via csss with gulp as follows
1 2 3 4 5 6 7 8 9 10 11 | $ npm install gulp <span class="token operator">-</span> sass <span class="token operator">--</span> save <span class="token operator">-</span> dev <span class="token keyword">var</span> gulp <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'gulp'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Requires the gulp-sass plugin</span> <span class="token keyword">var</span> sass <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'gulp-sass'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> gulp <span class="token punctuation">.</span> <span class="token function">task</span> <span class="token punctuation">(</span> <span class="token string">'sass'</span> <span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> gulp <span class="token punctuation">.</span> <span class="token function">src</span> <span class="token punctuation">(</span> <span class="token string">'app/scss/styles.scss'</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">pipe</span> <span class="token punctuation">(</span> <span class="token function">sass</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token comment">// Converts Sass to CSS with gulp-sass</span> <span class="token punctuation">.</span> <span class="token function">pipe</span> <span class="token punctuation">(</span> gulp <span class="token punctuation">.</span> <span class="token function">dest</span> <span class="token punctuation">(</span> <span class="token string">'app/css'</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Specifically, this gulp task will compile styles.scss and translate it through app / css / styles.css
Glob in gulp
Gulp uses its own pattern to match files. Patterns are commonly used in gulp
- * .scss All .scss files in root folder
- ** / .scss Match all scss files in the root folder and in subfolders
- ! not-me.scss: Removes not-me.scss from the list of selected files
- *. + (scss | sass): All files ending with scss or sass in root folder
Our task can be updated as follows
1 2 3 4 5 6 | gulp <span class="token punctuation">.</span> <span class="token function">task</span> <span class="token punctuation">(</span> <span class="token string">'sass'</span> <span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> gulp <span class="token punctuation">.</span> <span class="token function">src</span> <span class="token punctuation">(</span> <span class="token string">'app/scss/**/*.scss'</span> <span class="token punctuation">)</span> <span class="token comment">// Gets all files ending with .scss in app/scss and children dirs</span> <span class="token punctuation">.</span> <span class="token function">pipe</span> <span class="token punctuation">(</span> <span class="token function">sass</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">pipe</span> <span class="token punctuation">(</span> gulp <span class="token punctuation">.</span> <span class="token function">dest</span> <span class="token punctuation">(</span> <span class="token string">'app/css'</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> |
Currently, when we want to compile sass through css, we must call gulp sass . Gulp allows us to compile the file every time the file is modified with gulp.watch
Watching file
Note that I use gulp 3.x so the syntax will be different from 4.x. With 4.x you need to fix the syntax.
Here is the method of watch file using gulp
1 2 3 | <span class="token comment">// Gulp 3.x watch syntax</span> gulp <span class="token punctuation">.</span> <span class="token function">watch</span> <span class="token punctuation">(</span> <span class="token string">'files-to-watch'</span> <span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token string">'tasks'</span> <span class="token punctuation">,</span> <span class="token string">'to'</span> <span class="token punctuation">,</span> <span class="token string">'run'</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
And we can write watch task with sass as follows
1 2 3 4 5 | gulp <span class="token punctuation">.</span> <span class="token function">task</span> <span class="token punctuation">(</span> <span class="token string">'watch'</span> <span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> gulp <span class="token punctuation">.</span> <span class="token function">watch</span> <span class="token punctuation">(</span> <span class="token string">'app/scss/**/*.scss'</span> <span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token string">'sass'</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Other watchers</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> |
Reloading page with browsersync
Now we can automatically compile sass -> css every time we change the file. However, if it just stops here, it still hasn’t really speed up the development process. Gulp combined with browsersync will help us to reload the page every time we change the sass file
1 2 | $ npm install browser-sync --save-dev |
Config
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <span class="token keyword">var</span> browserSync <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'browser-sync'</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">create</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Run server với basePAth là app</span> gulp <span class="token punctuation">.</span> <span class="token function">task</span> <span class="token punctuation">(</span> <span class="token string">'browserSync'</span> <span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> browserSync <span class="token punctuation">.</span> <span class="token function">init</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> server <span class="token operator">:</span> <span class="token punctuation">{</span> baseDir <span class="token operator">:</span> <span class="token string">'app'</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> gulp <span class="token punctuation">.</span> <span class="token function">task</span> <span class="token punctuation">(</span> <span class="token string">'sass'</span> <span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> gulp <span class="token punctuation">.</span> <span class="token function">src</span> <span class="token punctuation">(</span> <span class="token string">'app/scss/**/*.scss'</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">pipe</span> <span class="token punctuation">(</span> <span class="token function">sass</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">pipe</span> <span class="token punctuation">(</span> gulp <span class="token punctuation">.</span> <span class="token function">dest</span> <span class="token punctuation">(</span> <span class="token string">'app/css'</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">pipe</span> <span class="token punctuation">(</span> browserSync <span class="token punctuation">.</span> <span class="token function">reload</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> <span class="token comment">// Reload lại </span> stream <span class="token operator">:</span> <span class="token boolean">true</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Now we need to do is can start browsersync, Compile again every time there is a change on the file, then reload the page again. We can do as follows
1 2 3 4 5 | gulp.task('watch', ['browserSync', 'sass'], function (){ gulp.watch('app/scss/**/*.scss', ['sass']); // Other watchers }); |
Task Watch will need 2 tasks ‘browserSync’, ‘sass’ to run first.
If we learn a little more, we can do the same thing with JS, html
1 2 3 4 5 6 7 8 | gulp <span class="token punctuation">.</span> <span class="token function">task</span> <span class="token punctuation">(</span> <span class="token string">'watch'</span> <span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token string">'browserSync'</span> <span class="token punctuation">,</span> <span class="token string">'sass'</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> gulp <span class="token punctuation">.</span> <span class="token function">watch</span> <span class="token punctuation">(</span> <span class="token string">'app/scss/**/*.scss'</span> <span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token string">'sass'</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Reloads the browser whenever HTML or JS files change</span> gulp <span class="token punctuation">.</span> <span class="token function">watch</span> <span class="token punctuation">(</span> <span class="token string">'app/*.html'</span> <span class="token punctuation">,</span> browserSync <span class="token punctuation">.</span> reload <span class="token punctuation">)</span> <span class="token punctuation">;</span> gulp <span class="token punctuation">.</span> <span class="token function">watch</span> <span class="token punctuation">(</span> <span class="token string">'app/js/**/*.js'</span> <span class="token punctuation">,</span> browserSync <span class="token punctuation">.</span> reload <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
We can definitely do more with Gulp like that
- Compress Css, JS into one file before it is put into production
- Compress images
- Clean auto-generated file
Since my original purpose was to create a side-templte to code FE, I will stop here. The above sections can be found at https://css-tricks.com/gulp-for-beginners/ . And there’s so much more that can be done with gulp to speed up software development.
One note that you should use gulp 3.x. I tried to migrate to 4.x, but due to the lack of familiarity, I got a lot of syntax errors, but the current guide to migrate to 4.x is still quite sketchy
OK. Thank you for watching