gpt4 book ai didi

javascript - 限制使用 RequireJS 范围之外定义的脚本

转载 作者:行者123 更新时间:2023-12-03 12:43:50 25 4
gpt4 key购买 nike

我遇到了无法修复的范围(全局变量/命名空间)问题。问题是我在一个项目中有一些遗留代码,我在其中使用 Require.js 添加了新功能。此遗留代码是使用标准 <script> 加载的标签,但新代码加载了 Require。当我在 Require as AMD 中添加 Ractive.js 时,就会出现问题。由于遗留代码会加载 Prototype.js,因此它与 Ractive.js 存在一些冲突。

主要问题是观察数组的变化时。具体来说,当我用模式观察器观察数组时。

ractive.observe('dataArray.*', function(newValue, oldValue, keypath) {
alert(' status changed from ' + oldValue + ' to ' + newValue);
}, {debug: true, init: false});

如果我不将观察者添加到数组中,一切正常,但如果添加它,则会收到错误 undefined is not a function在prototype.js中(当我从全局变量中删除prototype.js时,不会发生这种情况)。

另一个问题是,当我不使用模式观察器时它实际上可以工作。

所以,我的问题是,有没有办法将 Require.js 配置为仅使用作为 AMD-s 加载的脚本?或者,换句话说,将 AMD 脚本的范围仅限于彼此,从而忽略全局脚本?

提前致谢。

最佳答案

通过将旧版本的 Prototype.js 添加到页面,我能够创建类似的错误。我怀疑是因为Prototype.js在Array.prototype中添加了非标准方法(除其他事项外)。这通常被认为是一件坏事,因为它使得大型代码库中很可能发生此类冲突。

具体来说,错误是 Ractive 调用 Array.prototype.map在处理模式观察者时在字符串上。 map function 在 ES5 中是标准的,但在旧版浏览器(例如 IE8)中不是标准的,因此 Prototype 添加了一个 polyfill - 但在旧版本的 Prototype 中,它是一个损坏的 polyfill。当您使用字符串而不是错误调用它时,损坏的 polyfill 会抛出错误(因为它使用自己的 this.each() 方法) - 这是 ES5 中不寻常但完全可以接受的操作。

幸运的是,最新版本的 Prototype 似乎并没有以同样的方式被破坏。我能够使用 1.6.1(其文档网站上的版本,来自 2009 年)重现该错误,但无法使用最新的 1.7.2 版本重现该错误。

所以你有两种可能的选择:

  • 将原型(prototype)升级到最新版本
  • 原型(prototype)加载后,覆盖损坏的 map()方法。您可以使用 this polyfill from MDN (请确保省略 if (!Array.prototype.map){...} 检查)。

其中,第二个可能最不可能破坏依赖于 Prototype 的代码!

关于javascript - 限制使用 RequireJS 范围之外定义的脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23414174/

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