Backbone 没有 iframe 的沙箱

Backbone sandbox without iframe

我写了一个小的 ES6 脚本,并使用 webpack(UMD 目标)将其与 babel 编译。我希望将 Backbone(和下划线)捆绑到脚本中,这样用户就不必再导入它了。

// src/index.js
import Backbone from 'backbone';
(function(){
    return Backbone.VERSION;
})

不幸的是,当编译的脚本被导入到一个HTML文件中时,Backbone也被导入到全局范围中。例如,当脚本导入到使用不同版本 BB 的页面时,这可能会导致各种问题。

<script src="/script.min.js"></script>
<script>
    console.log(Backbone.VERSION); // Backbone is defined :(
</script>

我知道一个解决方案是在 iframe 中执行脚本。有没有其他方法可以有效地完全隔离这个BB脚本?

这种行为是因为 this line in backbone.js 所以你有两种选择,要么

  • 执行 something like this 以阻止 Webpack 处理 AMD 定义内部 Backbone,这将使其回退到 CommonJS,它没有设置全局。
  • 使用.noConflict()清除意外的全局,例如

    import Backbone from "backbone";
    Backbone.noConflict();