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]); });