为Browserify定义全局变量
我使用SpineJS(它导出一个commonjs模块),它需要在全球范围内使用,因为我在任何地方都使用它,但是似乎我必须对每个使用Spine的文件进行Spine = require('spine')
工作。
有没有什么方法可以定义Spine
一次,使其全球可用?
PS:我使用Spine作为例子,但是我一般都想知道如何在任何其他库上做到这一点。
在每个文件中写入Spine = require('spine')
是正确的方法。
然而,通过使用global
或window
对象(browserify将global
对象设置为window
,这是全局名称空间)有几种可能性:
global.Spine = module.exports
global.Spine = require('spine')
捆绑的任何其他.js文件中: global.Spine = require('spine')
window.Spine = require('spine')
首先,以你为例,大卫是正确的。 在你需要的每个模块中包含所有的依赖关系。它非常冗长,但没有编译时间的魔法,缓解了各种反模式和潜在的未来问题。
真正的答案。
这并不总是实际的。 Browserify接受一个名为insertGlobalVars
的选项。 在构建过程中,将扫描每个流式文件以找到与提供的键名相匹配的标识符,并将该模块封装在包含参数的IIFE中,这些参数用于解析未在模块内分配的每个标识符。 这一切都发生在依赖树最终完成之前,这允许您使用require来解析依赖关系。
TLDR
在Browserify中使用insertGlobalVars
选项。
browserify({
insertGlobalVars: {
spine: function(file, dir) {
return 'require("spine")';
}
}
});
对于每个扫描的文件,如果存在未分配的标识符spine
,则按照require("spine")
解析。