Browserify - 如何包含非公开购买的第三方脚本?

10

虽然使用Browserify的好处似乎很有吸引力,但我对它的使用仍不是很清楚。

我有一些问题,希望有人可以澄清。

  1. 我看到过一些关于在package.json中使用browserify-shim来包含第三方库(例如jquery和bootstrap)的博客文章。我也看到过使用工具如gulp生成bundle文件的文章。如果像gulp这样的工具能够自动化这个过程,为什么还需要browserify-shim呢?有人能解释一下吗?为什么需要browserify-shim?我觉得gulp的解决方案更加简洁,尽管稍微麻烦一些。它不会用与构建相关的browserify特定内容污染package.json,而是与gulp一起使用(这只是我的个人意见)

  2. 如何处理那些既不在npm中,也不公开的第三方库?例如,我们从第三方购买脚本。该脚本不是通用js文件,而是一个普通的js文件,带有一些依赖项(例如,jquery和underscore)。

1个回答

17

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 等)。

回答您的具体问题:

  1. 只有当您需要通过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 流)。

非常好的回答。谢谢您先生!我有一个小问题要追问。为什么有人会在使用jQuery时使用b-shim,而我可以通过npm安装jQuery,然后将其require并分配给全局$变量。我看到两种方法都被使用。这是个人偏好,还是工具演进使得不需要shim也能实现呢? - sat
更多的是后者。我认为jQuery直到2.x版本才兼容CommonJS。所以如果可用,一定要使用CommonJS库/模块;否则请使用b-shim。祝好运! - superEb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接