使用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. C#连接六类数据库的代码集

    本文列出了C#连接Access.SQL Server.Oracle.MySQL.DB2和SyBase六种不同数据库的程序源码和需要注意的点. 1.C#连接Access 程序代码: ;

  2. C语言的第一个程序 “hello world!”

    1,C语言的简介        C语言是一门通用计算机编程语言,应用广泛.C语言的设计目标是提供一种能以简易的方式编译.处理低级存储器.产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言. ...

  3. 【分享】纯jQuery实现星巴克官网导航栏效果

    前言 大冬天的没得玩,只能和代码玩. 所以就无聊研究了一下星巴克官网,在我看来应该是基本还原吧~ 请各位大神指教! 官网效果图 要写的就是最上方的会闪现的白色条条 效果分析 1.在滚动条往下拉到一定距 ...

  4. openstack安装在虚拟机上重启之后无法启动问题

    http://www.byywee.com/page/M0/S931/931767.html 运行rejoin-stack.sh脚本的核心: exec screen -c $TOP_DIR/stack ...

  5. JAVA基础面试(四)

    31.String s = new String("xyz");创建了几个StringObject?是否可以继承String类? 两个或一个都有可能,"xyz" ...

  6. Logger.getLogger和 LogFactory.getLog

    Logger.getLogger和 LogFactory.getLog Logger.getLogger LogFactory.getLogLogger来自log4j自己的包.如果用Logger.ge ...

  7. formData实现图片上传

    前言 在 上一篇 已经实现了图片预览,那么如何上传图片呢?有两种思路: 1.将图片转化为dataURL(base64),这样就成为了一串字符串,再传到服务端.不过这样缺点很多,数据量比转换之前增加1/ ...

  8. 维多利亚的秘密 golang入坑系统

    原文在gitbook,字字原创,版权没有,转载随意. 在写本文的前一天,2017维密在上海开始了. 为了纪念屌丝界的盛世,特为本节起名维多利亚的秘密.现在的社会,要想出名只有抓眼球.所以写份技术文章, ...

  9. js获取url地址栏参数

    前端开发中经常会遇到需要获取url地址栏参数问题 方法如下: function getQueryStringByName(name){ var src = "www.baidu.com?na ...

  10. 虚拟机Ubuntu无法上网问题解决过程

    查看了网上大部分经验贴,都没有解决问题,只好自己思考琢磨,以下是思考解决过程 1.查看文件配置 2.查看虚拟机网络配置方式 3.查看硬件驱动是否存在 4.配置完文件ifcfg-eth0后重启,无效(虚 ...