我正在创建一个 google chrome 扩展,当在选项卡上激活时,它会将一些自定义代码和一些新视图加载到该窗口的文档中。我想使用 requireJS 加载扩展调用的这些新代码模块。但是,我担心如果调用此扩展的应用程序/网站已经在运行 requireJS,则可能会发生冲突或名称冲突,并且我从头开始调用它会擦除网站本机 require.config 或以其他方式导致一些未知的恶作剧。这会导致每次我的扩展在其上激活时该网站都会崩溃。
那么有没有一种方法可以将 requireJS 和backboneJS 的全新且“独立”的实例加载到可能已经运行自己的实例的站点上?如果没有,有没有办法使我的要求和配置与目标应用程序的要求和配置相一致?
编辑更多细节:好的,我的扩展有更多细节:我正在页面上创建一个 iFrame,它有一个完全独特的文档空间。但我仍然需要 iFrame 了解原始文档中发生的某些事情(例如:当用户单击该文档中的某个 div 时,我希望将此事件传递给 iFrame)。为此,我通过原始文档的内容脚本传递各种对象,直到扩展,返回到 iframe 的内容脚本,最后(使用 window.onMessage)传递到 iFrame 的 javascript 环境。我开发的过程与所描述的过程大致相似here http://www.sitepoint.com/chrome-extensions-bridging-the-gap-between-layers/。是的,这让我很头疼。
不管怎样,最重要的是我在 iframe、扩展和原始源文档中进行了大量代码。因此,我希望在每个上下文中都有一个 require 实例。
内容脚本在与页面上下文隔离的上下文中运行 https://developer.chrome.com/extensions/content_scripts.html#execution-environment。 IE。如果页面声明了一个全局变量Backbone
,您的内容脚本无法直接读取或访问它。
将以下代码(刚刚编写)放入您的 Chrome 扩展程序中(将其放在require.js
),您将能够在内容脚本中使用 RequireJS。
require.load = function(context, moduleName, url) {
url = chrome.extension.getURL(url);
var x = new XMLHttpRequest();
// Append Math.random()... to bust the cache
x.open('GET', url + '?' + Math.random().toString(36).slice(-4));
x.onload = function() {
var code = x.responseText;
x += '\n//@ sourceURL=' + url; // Optional, for debugging.
window.eval(code);
context.completeLoad(moduleName);
};
x.onerror = function() {
// Log error if you wish. This is usually not needed, because
// Chrome's developer tools does already log "404 Not found"
// errors for scripts to the console.
};
x.send();
};
在开发过程中,这种方法非常理想,因为行号将与代码中的行相匹配。
在生产中,我建议使用r.js https://github.com/jrburke/r.js/连接(并缩小)你的代码,因为输出将是一个大的 JavaScript 文件。 Chrome 扩展程序中的资源通常会在几毫秒内加载,但如果您有相当多的模块,这些毫秒加起来就会很重要。每个请求都在给定选项卡的开发人员工具的“网络”选项卡中可见,这只是噪音,并且对于使用您的扩展的 Web 开发人员来说是不希望有的副作用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)