gpt4 book ai didi

javascript - browserify-shim 在 var 范围内时不导出隐式全局变量

转载 作者:数据小太阳 更新时间:2023-10-29 05:22:41 25 4
gpt4 key购买 nike

根据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 the window 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com