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')

results matching ""

    No results matching ""