6

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

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

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

根据我的经验,如果我尝试填充的非 commonjs 模块使用window.myVar = xor just myVar = x,则该模块将在全球范围内公开,并且可以require()按预期通过。

但是,当使用遗留模块时var myVar = x,这就是导致问题的原因,因为该模块只能通过 viarequire('legacyModule')而不是 via访问window.myVar

browserify -shim 文档指出:

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

  • 仅在脚本级别声明 avar foo = ...并假设它附加到window对象的模块。因为它们运行的​​唯一方式是在全球范围内——“咳咳,……不?!”
4

1 回答 1

5

正如@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>而不是捆绑它们。

  • global.myVar = myVar您可以使用 browserify 转换在旧脚本的末尾添加额外的分配。这将需要为您需要的每个特定脚本定制转换。

  • 您可以将捆绑包中的第一个文件设为执行以下操作的脚本:

    [['legacyModule, 'myVar'], ...].forEach(function (mod) {
      window[mod[1]] = require(mod[0]);
    });
    
于 2015-04-16T17:38:47.927 回答