- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
根据browserify-shim文档,您可以通过在 package.json
中使用以下语法来指定 browserify-shim 需要从遗留模块公开哪些全局变量:
{
"browserify-shim": {
"legacyModule": "myVar"
}
}
我希望可以通过 require('legacyModule')
和 window.myVar
访问遗留模块。
根据我的经验,如果我尝试填充的非 commonjs 模块使用 window.myVar = x
或仅使用 myVar = x
,则该模块会全局公开并且可按预期通过 require()
获得。
但是,当遗留模块使用 var myVar = x
时,这就是导致问题的原因,因为该模块只能通过 require('legacyModule ')
而不是通过 window.myVar
。
browserify-shim documentation指出:
Additionally, it handles the following real-world edge cases:
- Modules that just declare a
var foo = ...
on the script level and assume it gets attached to thewindow
object. Since the only way they will ever be run is in the global context — "ahem, ... NO?!"
最佳答案
正如@EvanDull 所建议的那样,我相信 browserify-shim 实际上可能并非设计为以这种方式工作,并且文档对此缺乏明确说明。在我进行的调试中,browserify-shim 似乎没有被设计为在“处理”var foo = ...
时设置 一个全局变量。 .在文档说它处理的地方,我相信这意味着它处理它还没有在全局对象上设置并且它仍然会为 CommonJS 导出该变量的值,例如var foo = ...; module.exports = foo;
, 这样它就可以是 require()
'd。而你希望它做 var foo = ...; window.foo = module.exports = foo;
当然,因为它不这样做并且 browserify 将遗留代码包装在一个函数中,var foo
仅创建局部变量。
您现在可以使用多种可能的解决方法:
如果您不介意编辑遗留脚本,您可以删除 var
这应该会处理好它。
您可以通过单独的 <script>
提取遗留脚本标签而不是捆绑它们。
您可以使用 browserify 转换来添加额外的赋值 global.myVar = myVar
到遗留脚本的末尾。这将需要为您需要它的每个特定脚本定制转换。
您可以将您的包中的第一个文件作为执行类似以下操作的脚本:
[['legacyModule, 'myVar'], ...].forEach(function (mod) {
window[mod[1]] = require(mod[0]);
});
关于javascript - browserify-shim 在 var 范围内时不导出隐式全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29680352/
我是一名优秀的程序员,十分优秀!