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

时间:2015-04-16 16:10:17

标签: javascript node.js browserify browserify-shim

根据browserify-shim文档,您可以使用package.json中的以下语法指定browserify-shim需要从旧版模块公开的全局变量:

{
    "browserify-shim": {
        "legacyModule": "myVar"
    }
}

我希望可以通过require('legacyModule')window.myVar访问旧模块。

根据我的经验,如果我试图填充的非commonjs模块使用window.myVar = xmyVar = x,则该模块将全局公开,并可按预期通过require()获取。< / p>

,当旧版模块使用var myVar = x时,导致问题的原因是该模块只能通过require('legacyModule')访问,而不能通过window.myVar访问

browserify-shim documentation表示:

  

此外,它还处理以下现实边缘情况:

     
      
  • 只在脚本级别声明var foo = ...并假设它附加到window对象的模块。因为它们将被运行的唯一方式是在全球范围内 - &#34; ahem,...... NO?!&#34;
  •   

1 个答案:

答案 0 :(得分:5)

正如@EvanDull建议的那样,我认为browserify-shim实际上可能不会以这种方式工作,而且文档缺乏明确性。在我做的调试中,似乎没有看到browserify-shim设计为设置一个全局变量,当它处理&#34; var foo = ...。如果文档说它处理它,我相信它意味着它处理它尚未在全局对象上设置它仍然会导出该变量的值为CommonJS,例如var foo = ...; module.exports = foo;,以便它可以是require()&#39; d。虽然你希望它做var foo = ...; window.foo = module.exports = foo;而且当然因为它没有这样做而且浏览器将遗留代码包装在一个函数中,var foo只创建一个局部变量。

您现在可以使用多种可能的解决方法:

  • 如果您不介意编辑旧版脚本,只需删除var,即可完成此操作。

  • 您可以通过单独的<script>标记提取遗留脚本,而不是捆绑它们。

  • 您可以使用browserify转换将其他作业global.myVar = myVar添加到旧版脚本的末尾。这需要为您需要的每个特定脚本定制变换。

  • 您可以在捆绑包中创建一个脚本,该脚本可以执行以下操作:

    [['legacyModule, 'myVar'], ...].forEach(function (mod) {
      window[mod[1]] = require(mod[0]);
    });