browserify-shim在var范围内不导出隐式全局variables
根据browserify-shim文档,可以通过在package.json
使用以下语法来指定哪些全局variables需要通过传统模块公开:
{ "browserify-shim": { "legacyModule": "myVar" } }
我希望传统模块可以通过require('legacyModule')
和window.myVar
。
根据我的经验,如果我尝试填充的非commonjs模块使用window.myVar = x
或只是myVar = x
,则该模块将全局公开,并且可通过require()
按预期方式获得。
但是 ,当传统模块使用var myVar = x
,这是因为模块只能通过require('legacyModule')
而不是通过window.myVar
。
browserify-shim文档指出:
此外,它处理以下真实世界的边缘情况:
- 在脚本级别声明一个
var foo = ...
并假定它被附加到window
对象的模块。 因为他们唯一的办法是在全球范围内 – “啊哈,不…?
正如@EvanDullbuild议的那样,我认为browserify-shim可能实际上并不是按照这种方式devise的,文档缺乏清晰性。 在我所做的debugging中,并没有出现browserify-shim被devise为在“处理” var foo = ...
时设置一个全局variables。 在文档说处理的地方,我相信这意味着它不处理全局对象,它仍然会导出该variables的值为CommonJS,例如var foo = ...; module.exports = foo;
var foo = ...; module.exports = foo;
,所以它可以被require()
'd。 而你想它做var foo = ...; window.foo = module.exports = foo;
var foo = ...; window.foo = module.exports = foo;
当然,因为它不这样做,并且browserify将遗留代码包装在函数中,所以var foo
仅创build一个局部variables。
现在可以使用一些可能的解决方法:
-
如果你不介意编辑遗留脚本,你可以删除
var
,并且应该照顾它。 -
您可以通过单独的
<script>
标签来取代旧脚本,而不是绑定它们。 -
您可以使用
global.myVar = myVar
转换将附加的作业global.myVar = myVar
到旧脚本的末尾。 这将需要为您需要的每个特定脚本定制转换。 -
你可以使你的包中的第一个文件是一个脚本,它的function如下:
[['legacyModule, 'myVar'], ...].forEach(function (mod) { window[mod[1]] = require(mod[0]); });