ignoring and excluding
对于browserify来说, 忽略(ignore) 意味着: 用一个空的对象代替那个模块定义. 排除(exclude) 意味着将一个模块从依赖图中完全移除.
另外一种方法是使用 package.json 的 browser字段来实现ignore和exclude功能, 在本文中其他地方介绍了.
ignoring
忽略是一种为一些只在特定代码中工作的node模块提供空的定义而设计的积极策略. 例如, 一个模块依赖一个库, 这个库中一些代码只在node中能正常运行:
var fs = require('fs');var path = require('path');var mkdirp = require('mkdirp');exports.convert = convert;function convert (src) { return src.replace(/beep/g, 'boop');}exports.write = function (src, dst, cb) { fs.readFile(src, function (err, src) { if (err) return cb(err); mkdirp(path.dirname(dst), function (err) { if (err) return cb(err); var out = convert(src); fs.writeFile(dst, out, cb); }); });};
browserify 已经忽略了 fs 模块, 通过返回一个空的object, 但是上边代码中的 .write() 函数 在浏览器中如果没有进一步的操作是不能正常工作的, 进一步操作例如静态分析转换代码或者提供一个 fs模块抽象.
然而, 如果我们真的需要 convert() 函数, 但是不希望 mkdirp 这个模块出现在最后打包好的文件中, 我们可以忽略mkdirp这个模块, 通过 b.ignore('mkdirp') 或者 browserify --ignore mkdirp. 这份 代码在浏览器中依然可以正差工作, 如果我们不取调用 write() 函数的话. 因为 require('mkdirp') 不会 抛出异常, 只是返回值是一个空的object.
通常来说一些让算法模块(类似parsers, formatters)自己进行IO操作不是一个好主意. 但是 这个trick可以让你在浏览器中使用那些模块.
在命令行工具中忽略 foo:
browserify --ignore foo
在api中忽略 foo, 同时有一个bundle实例 b:
b.ignore('foo')
excluding
另一种我们希望的相关情况是从输出中完全移除某一个模块, 然后 require('modulename')在 运行时会失败. 这在我们项将代码打包成多个输出, 并形成级连至前面定义的 require() 定义中.
例如, 如果我们有一个独立的 jquery 打包文件, 我们并不想它出现在主打包输出中.
$ npm install jquery$ browserify -r jquery --standalone jquery > jquery-bundle.js
然后我们只是在 main.js 中 require('jquery'):
var $ = require('jquery');$(window).click(function () { document.body.bgColor = 'red' });
延迟到前面的jquery打包, 我们可以这样写:
<script src="jquery-bundle.js"></script><script src="bundle.js"></script>
已及在 bundle.js 中没有jquery的定义, 然后在编译 main.js 时, 可以 --exclude jquery
browserify main.js --exclude jquery > bundle.js
通过命令行程序来排除 foo:
browserify --exclude foo
通过api来排除 foo:
b.exclude('foo')