使用Browserify进行多种构buildconfiguration的复杂骨干应用程序

我正在开发一个大的Backbone应用程序,这个应用程序由于是多租户devise,可以很好的configuration,可以在很多平台上运行。 目前这些应用程序是通过Grunt构build的,环境variables用于确定在应用程序的最终版本中包含哪些Backbone文件。

目前包含的一些文件正在扩展或覆盖之前包含的其他文件。

举个例子:

BaseHeader.js:

var BaseHeader = Backbone.View.extend({ // code }); 

Header.js:

 var Header = BaseHeader.extend({ // code }); 

目前,我的成品应用程序是用Grunt构build的,它使用一堆脚本标记创build一个.html文件,所有的文件都将被浏览器加载。

我想使用Browserify捆绑我的JS到一个单一的文件,所以现在我有:

BaseHeader.js:

 var Backbone = require("backbone"); var BaseHeader = Backbone.View.extend({ // code }); module.exports = BaseHeader; 

Header.js:

 var Backbone = require("backbone"); var BaseHeader = require("/path/to/BaseHeader.js"); var Header = BaseHeader.extend({ // code }); module.exports = Header; 

但我很困惑如何工作的事情。

所有我的应用程序的入口点是相同的App.js文件,它需要调用BaseHeader.js,但它不会对Header.js进行require调用,因为此文件是特定于平台/客户端的。

由于Browserify只是recursion通过需求为了查找和捆绑依赖关系,它将永远不会拿起Header.js所以,我怎样才能创build一个生成任务,以在需要时可选地需要Header.js?

您正在寻找浏览器的require选项 :

此选项将包含模块或文件作为捆绑包的一部分,即使它在入口应用程序中未被引用。 它还应该通过一个全局的require()函数将这个模块暴露给你的HTML页面。

从文档:

b.require(file, opts)

使用require(file)从bundle外部获取require(file)

文件参数是可以通过require.resolve()解决的任何事情。

文件也可以是一个stream,但你也应该使用opts.basedir,以便相对的要求将是可parsing的。

如果文件是一个数组,文件中的每个项目将是必需的。 在文件数组forms中,可以为每个项目使用一个string或对象。 对象项目应该有一个文件属性,其余的参数将被用于opts。

使用opts的expose属性来指定一个自定义的依赖项名称。 require('./vendor/angular/angular.js', {expose: 'angular'})启用require('angular')