browerify: http://browserify.org/index.htmljavascript
browserify
能够看作浏览器端的又一个模块化工具,在ES6
模块规范在前端大规模落地以前更优雅的选择。html
browserfify
长处在于使用node-flavor
模块规范,而不是requirejs
使用的AMD
模块规范,以及seajs
使用的CMD
模块规范。打包处理后通常单页面仅为一个js文件(固然,文件size至关可观)。相对于其余规范,最直接的好处是能够直接使用Node
生态中先后端功用模块,例如uniq
, underscore
等不依赖Node
环境的包,以及superagent
这种作过浏览器适配的包。前端
关于命令行工具使用,请参照官方文档。在使用中,由于使用webstorm
,使用watch
的话,每次自动保存都会自动触发,加剧系统无谓的负担,因此在开发中,能够选择直接调用API的方式,以下使用koa
做为简单的server
,部分代码以下:java
javascript"use strict"; var util = require('util'); var through = require('through-gulp'); function streamToPromise(stream) { if (util.isUndefined(stream.pipe)) return Promise.reject('argument is not stream'); return new Promise(function(resolve, reject) { var destiny = new Buffer(''); stream.pipe(through(function(data, encoding, callback) { destiny = Buffer.concat([destiny, data]); callback(); }, function(callback) { resolve(destiny); callback(); })) }); } module.exports = streamToPromise;
此处代码将stream
转换为promise
。node
javascriptvar transform = require('./promise-stream'); app.use(function *(next) { if (this.path.startsWith('/browserify')) { var bundle = browserify(path.join(__dirname, 'static', this.path)).bundle(); bundle = yield transform(bundle); this.type = "application/javascript"; this.body = bundle.toString(); return null; } yield next; });
此处代码,将browserify
文件夹内部的js文件,都是用browserify
处理,返回处理后的数据。若是依赖文件较大的话,时间会比较长,视具体环境而定。git
模块重复依赖很容易理解,模块实现时可能分割为多个子文件实现,每一个子文件内部可能会引用同一个模块,如util
。在node
环境下很好理解,在browserify
处理后的浏览器环境下,该模块能够看作是个单例,不一样文件内部引用的同名模块,能够看作引用的同一个变量,简单示例全部文件均放置于browserify
文件夹下,代码以下:github
javascript// core.js var utils = { "age" : 12 }; utils.increase = function() { this.age += 1; }; module.exports = utils;
javascript// repeat.js var repeat = require('./core'); module.exports = repeat;
javascript// pristine.js var pristine = require('./core'); module.exports = pristine;
javascript// index.js var first = require('./pristine'); var second = require('./repeat'); first.increase(); second.increase(); console.log(first); console.log(second);
浏览器执行,输出结果result.age
均为14
,和预想结果匹配。web
须要用到文件预处理器,karma-browserify: https://www.npmjs.com/package/karma-browserify。npm
与karma
的AMD
模块测试文件组织结构与引入不一样,AMD
将测试文件以模块方式定义,配置中将待测试文件,测试文件设置为served
,而后由单一入口文件加载测试文件。使用browserify
做为模块化工具时,须要显式引入测试文件,配合karma-browerify
使用,示例以下:gulp
javascript// ./browserify/utils.js var uniq = require('uniq'); var utils = {}; utils.uniq = uniq; utils.sum = function(value) { return value.reduce(function(prev, next) { return prev + next; }, 0); }; module.exports = utils;
javascript// ./browserify_test/utils.spec.js var utils = require('../browserify/utils'); describe('browserify style module', function () { it('should uniq array with repeat value', function () { var source = [1, 2, 3, 2, 3, 4]; expect(utils.uniq(source)).toEqual([1, 2, 3, 4]); }); it('should sum array with number value', function () { var source = [1, 2, 3, 4]; expect(utils.sum(source)).toEqual(10); }); });
详情移步https://github.com/bornkiller/ModuleBoilerplate。
注意若是使用webstorm
,会出现https://github.com/nikku/karma-browserify/issues/23 BUG,修改测试文件,若是不重启karma server
的话,测试文件内容不会改变。
学习使用React
的过程当中,由于React ES-forward
的代码风格,略显不适应,因此选择先学习使用browserify
工具,而后延续React学习过程。