Browserify 可以帮助将 Node 模块打包到浏览器中。 它了解通过 CommonJS require
语句定义依赖项的 Node 模块。
但是,如果您有一些JS代码或库,它们不是作为Node模块定义的,也不支持CommonJS,该怎么办呢? 这时就需要使用 browserify-shim,它可以提供一个包装器来封装任何脚本,例如您的私有第三方脚本,从而使其可以被定义为并用于 Browserify 理解的 Node 模块。
使用 browserify-shim 与执行 Browserify 的方式是完全独立的。基本上有两种选项: A) 使用Browserify的命令行API 或者 B) 使用 Browserify的 JS API。
如果使用构建工具(如 Gulp),则意味着使用第二个选项,因为您将在 Gulp 构建脚本(即 gulpfile.js)中使用 Browserify 的 JS API。很多人喜欢使用 Gulp,因为它有一个很好的插件生态系统,可以让您做更多事情,而不仅仅是调用 Browserify(例如编译 CoffeeScript、编译 SASS、运行 JSHint 等)。
回答您的具体问题:
只有当您需要通过Browserify捆绑并打包JS代码时,才需要使用 Browserify-shim,该JS代码 不是 作为 Node/CommonJS 模块编写的。要这样做,您需要在 package.json 中告诉 browserify-shim 哪些文件将被封装为模块(以及它们的依赖关系)。请注意,这与 Gulp 完全无关,因此无论您是否使用 Gulp,都需要使用它。
您所描述的情况正是使用browserify-shim的完美案例。将第三方脚本放入项目中,在 package.json 中按照 b-shim 的文档配置文件为模块,通过
require
在您的代码中引用它们,并执行 Browserify 将它们与您的代码一起打包。您也可以将它们单独打包、放在它们自己的项目中等等 - 无论您如何组织都可以。
需要注意的几点是:
- 您可以用这种方式使几乎任何 JS 库称为 shim。
- 将一个 JS 库 shim 成 Node 模块会将全局作用域更改为私有作用域。希望库中所有功能都有命名空间,以便将其所有功能作为单个模块导出,但如果没有,您可能需要修改被 shim 的代码以显式地将其附加到
window
(这很容易但不建议)或将代码拆分成单独的文件/模块。
- Browserify 和 Gulp 在其 JS API 中都使用流,但 Browserify 使用原生的 Node 流,而 Gulp 使用 Vinyl 流。由于它们不兼容,您可能需要使用
vinyl-source-stream 来适配 Gulp 到 Browserify(例如在 Browserify 管道中重命名文件),或使用
vinyl-transform 来适配 Browserify 到 Gulp(例如包装一个用于在 Gulp 管道中使用的 Browserify 流)。