使用Browserify打包js时如果项目变得越来越大,编译时间就会相应变得越来越长。使用官方的插件watchify是个比较有效的提高速度方案。

提速原理

watchify的用法和gulp的watch方法比较类似,都是监控文件的改动来触发一些操作。在gulp中我们可以把一个完整的任务拆分成很多个局部任务,然后使用gulp.watch对这些局部任务进行监听,例如:

gulp.task('build-js1', ...);
gulp.task('build-js2', ...);
gulp.task('build-all-js', ['build-js1', 'build-js2']); gulp.task('watch-js1', function () {
gulp.watch('./src/models/**/*.js', ['build-js1']);
}); gulp.task('watch-js2', function () {
gulp.watch('./src/views/**/*.js', ['build-js2']);
}); //gulp.task('watch-js', function () {
// gulp.watch('./src/**/*.js', ['build-all-js']);
//});

如上例所示,在监测不同局部位置的js文件发生改动后,则只会自动执行相应的build-js1或build-js2等局部任务;而如果直接监测所有的js文件,就必须每次执行build-all-js任务了。

watchify的提速原理和这个思路有点类似,它可以监测个别文件的改动,从而触发只将需要更新的文件打包。它须要先执行一次完整的打包,首次打包的速度和正常速度是一样的;然后每次用户改变某个和browserify关联的js文件时,会自动执行打包,而这次打包的速度却非常快。

具体实例

watchify结合gulp的实例如下:

var gulp = require('gulp'),
browserify = require('browserify'),
source = require('vinyl-source-stream'),
buffer = require('vinyl-buffer'),
watchify = require('watchify'),
concat = require('gulp-concat'),
gulpif = require('gulp-if'),
argv = require('yargs').argv,
...; function getJsLibName() {
...
} //初始化browserify
var b = browserify({
entries: './src/base.js'
})
.plugin(...)
.transform(...); //执行打包js
function bundle() {
var jsLibName = getJsLibName(); return b.bundle()
.pipe(source(jsLibName))
.pipe(buffer())
.pipe(gulp.dest('./dist/js').on('end', function() { //打包js后继续进行一些后续操作
gulp.src(['./vendor/babelHelpers.js', './dist/js/' + jsLibName])
.pipe(concat(jsLibName))
.pipe(gulpif(argv.min, uglify()))
.pipe(gulp.dest('./dist/js'))
}));
} //定义打包js任务
gulp.task('build-all-js', bundle); //启动watchify监测文件改动
gulp.task('watch-js', function() {
b.plugin(watchify); //设置watchify插件
b.on('update', function(ids) { //监测文件改动
ids.forEach(function(v) {
console.log('bundle changed file:' + v); //记录改动的文件名
}); gulp.start('build-all-js'); //触发打包js任务
}); return bundle(); //须要先执行一次bundle
});
  • 例中可以在gulpfile.js中将browserify的实例定义在全局,这样在browserify实例的update事件中就可以正常调用到bundle方法了。

  • 定义通常的打包js任务build-all-js,例如需要整个项目打包执行它即可。

  • 单独定义监测文件改动的任务watch-js,使用gulp启动这个任务后,就可以启动watchify的文件改动监测功能了。需要为browserify实例注册update事件,在该事件中触发build-all-js任务即可。另外在这个任务中须要先执行一次browserify实例的bundle方法,但这次打包的速度和直接执行build-all-js是一样的。

关于watchify的更多细节大家可以参考官方文档及这篇文章:Fast browserify builds with watchify

测试打包速度

首先在启动watch-js任务时,会执行首次打包:

本次打包共花费了6.2秒。

然后在用户改动某个browserify关联的js文件时,都会自动触发build-all-js任务:

可以看出,这次打包只花费了203毫秒,速度提高了很多。

更多细节大家可参考实例的源代码

如何在Gulp中提高Browserify的打包速度的更多相关文章

  1. vuecli中配置webpack加快打包速度

    webpack4中webpack 的DllPlugin插件可以将常见的库文件作为dll文件来,每次打包的时候就不用再次打包库文件了. 但是游鱼西在vuecli中已经去除这个选项,意识到带来的打包速度提 ...

  2. browserify 不打包某些文件或者把公共文件提取出来教程

    var gulp = require('gulp') var fs = require("fs") var babelify = require('babelify') var b ...

  3. 我是如何在SQLServer中处理每天四亿三千万记录的

    首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...

  4. 【转】我是如何在SQLServer中处理每天四亿三千万记录的

    原文转自:http://blog.jobbole.com/80395/ 首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文 ...

  5. 如何在SQLServer中处理每天四亿三千万记录

    首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...

  6. 如何在MySQL中获得更好的全文搜索结果

    如何在MySQL中获得更好的全文搜索结果 很多互联网应用程序都提供了全文搜索功能,用户可以使用一个词或者词语片断作为查询项目来定位匹配的记录.在后台,这些程序使用在一个SELECT 查询中的LIKE语 ...

  7. (转)我是如何在SQLServer中处理每天四亿三千万记录的

    首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...

  8. 如何在VC++ 中调试MEX文件

    MEX文件对应的是将C/C++文件语言的编写之后 得到的相关文件加载到Matlab中运行的一种方式, 现对于Matlab 中的某些程序运行效率而言, C/C++ 代码某些算法的领域上面执行效率很高,若 ...

  9. gulp 中的增量编译

    最近花一点时间学了下 gulp,顺便学了下 sass,因为工作中并不需要用(我比较希望学习是需求驱动),所以一直拖到现在才学.突然觉得学习这类工具性价比很高,半天一天即可上手,技能树丰富了(尽管可能只 ...

随机推荐

  1. 教你五步制作精美的HTML时钟

    学了一段时间的HTML.CSS和JS后,给大家做一款漂亮的不像实力派的HTML时钟,先看图:涉及到的知识点有: CSS3动画.DOM操作.定时器.圆点坐标的计算(好多人是不是已经还给自己的老师了~)  ...

  2. Java多线程学习之Lock与ReentranLock详解

    synchronized 是内置锁,而Lock 接口定义的是显示锁,Lock 提供了一种可重入的.可轮询的.定时的以及可中断的锁获取操作. ReenTranLock实现了Lock接口,并提供了与syn ...

  3. javascript 的继承

    我们的JavaScript比较特别了,主要通过原型链实现继承的. 下面介绍各种实现继承的方式:原型链继承,借用构造函数,组合继承,原型式继承,寄生式继承,寄生组合式继承. 二.实现继承方式 1.原型链 ...

  4. bzoj1015星球大战

    1015: [JSOI2008]星球大战starwar Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝 ...

  5. NetFlow学习笔记

    NetFlow学习笔记 标签: netflow 由于工作需要,对NetFlow做了一些学习和调研,并总结成文档以供学习分享. 背景:随着系统的升级与漏洞的修补,入侵主机进而进行破坏的病毒攻击方式在攻击 ...

  6. mybatis逆向工程之配置

    逆向工程1.什么是逆向工程mybaits需要程序员自己编写sql语句,mybatis官方提供逆向工程 可以针对单表自动生成mybatis执行所需要的代码(mapper.java,mapper.xml. ...

  7. input[type='file']样式美化及实现图片预览

    前言 上传图片是常见的需求,多使用input标签.本文主要介绍 input标签的样式美化 和 实现图片预览. 用到的知识点有: 1.input标签的使用 2.filelist对象 和 file对象 3 ...

  8. axios跨域

    参考:http://www.ruanyifeng.com/blog/2016/04/cors.html 遇到前后分离情况 前端 a.com 后端 server.a.com 环境 vue全家桶前端 ph ...

  9. dSYM文件分析

    什么是 dSYM 文件 Xcode编译项目后,我们会看到一个同名的 dSYM 文件,dSYM 是保存 16 进制函数地址映射信息的中转文件,我们调试的 symbols 都会包含在这个文件中,并且每次编 ...

  10. Less合并

    合并是LESS的一个特性,它允许通过指定的语法来为某个属性添加使用逗号或空格分隔的值的列表.对于文本阴影.盒阴影.背景.变换等允许使用值的列表的属性,合并非常有用. 合并的语法,就是在属性名称和冒号之 ...