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();
我写了一个小的 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();