提问人:Tomasz Banasiak 提问时间:9/6/2013 更新时间:11/18/2023 访问量:44233
Chrome 扩展程序中的多个 JS 文件 - 如何加载它们?
Multiple JS files in Chrome Extension - how to load them?
问:
我写了一个Chrome扩展程序。我的 background.js 文件非常大,所以我想将其拆分为更小的部分,并在需要时加载指定的方法(某种延迟加载)。
我已经用Firefox完成了这个:
// ( call for load specified lib )
var libPath = redExt.basePath + 'content/redExt/lib/' + redExt.browser + '/' + libName + '.js';
var service = Components.classes["@mozilla.org/moz/jssubscript-loader;1"].getService(Components.interfaces.mozIJSSubScriptLoader);
service.loadSubScript("chrome://" + libPath);
// ( executing loaded file )
在基于 Webkit 的浏览器中是否有可能以类似的方式执行此操作?我已经找到了如何将多个 JS 文件注入匹配页面的解决方案(使用 ),但找不到仅用于扩展的包含 JS 文件的方法。manifest.json
答:
也许,您可以尝试使用 Web Worker。在后台.js中,包括:
var worker = new Worker('new-script.js');
Web Worker 可以生成新的 Worker,甚至有一个 importScript(“new-script.js.js”) 方法。
然而,Web 工作者往往非常有限。在这里查看一篇关于 Web Worker 的精彩文章。
但是,我不知道它们是否有效。另一个选项是使用 XMLHTTPRequest (AJAX) 动态检索脚本并对其进行评估。但是,在非 HTTPS 连接上,这可能是由于中间人攻击而被阻止的。
或者,您可以通过将以下内容添加到以下位置来强制 Chrome 从非加密连接评估脚本(但不要这样做):manifest.json
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'",
"permissions": ["http://badpractic.es/insecure.js"]
有关 AJAX 方法的更深入讨论,请参阅在后台页面加载远程网页:Chrome 扩展程序。
所以你的选择似乎是有限的。
这当然会一次加载它们:
{
"name": "My extension",
...
"background": {
"scripts": ["background.js","background2.js","background3.js"] //and so on
},
...
}
评论
use
storage = myExtension.use('storage')
/lib/storage.js
找到了可能的解决方案。RequireJS main 方法 require 的简单实现,它使用 JavaScript 回调跟踪来查找加载主扩展文件的事件,并使用扩展上下文绑定执行它。https://github.com/salsita/browser-require/blob/master/require.js
它似乎有效,但此解决方案有一些缺点:
- 错误报告在“第 1 行第 1 列”中报告,因为此解决方案将代码直接注入到 - 调试非常困难
func.call
- 加载的 JS 文件未出现在控制台/chromebug 中
- 如果当前选项卡使用 HTTPS,Chrome 将禁止评估脚本,尤其是来自本地上下文 () 的脚本,因此它有时无法按预期工作
file:///
评论
如果您想在后台页面的上下文中加载 javascript 文件并希望避免使用 ,您只需在后台页面的 DOM 中添加一个标签即可。例如,如果您的文件存在于扩展的文件夹中,则此方法有效:eval
script
lib
function loadScript(scriptName, callback) {
var scriptEl = document.createElement('script');
scriptEl.src = chrome.extension.getURL('lib/' + scriptName + '.js');
scriptEl.addEventListener('load', callback, false);
document.head.appendChild(scriptEl);
}
评论
更新:仅当您使用清单 V2 时,此解决方案才有效。
您也可以使用此处描述的极其简单的方法执行此操作:https://developer.chrome.com/extensions/background_pages#manifest
{
"name": "My extension",
...
"background": {
"scripts": [
"lib/fileone.js",
"lib/filetwo.js",
"background.js"
]
},
...
}
你不会进行延迟加载,但它确实允许你将代码分解为多个文件,并指定它们加载到后台页面的顺序。
评论
scripts
我所做的不是延迟加载,而是在单击我的 chrome 扩展程序图标时先加载一些文件。就我而言,我希望我的 util 文件先于使用它们的其他人:
chrome.browserAction.onClicked.addListener(function() {
chrome.tabs.executeScript(null, {file: "src/utils/utilFunction1.js"});
chrome.tabs.executeScript(null, {file: "src/utils/utilFunction2.js"});
chrome.tabs.executeScript(null, {file: "src/main.js"});
chrome.tabs.executeScript(null, {file: "src/otherFeature.js"});
});
Manifest v3 发生了很大变化
developer.chrome.com:Extension Service Worker 基础知识
TL;博士
importScripts('script-1.js','script-2.js');
或更完整
var err;
try{
importScripts('nmhost/ext-nmhost.js');
}
catch(err2){
err = err2;
}
if(err){ //handle error
console.error(err);
}
我有一个有用的示例浏览器扩展,它利用了,该扩展允许使用本机消息传递协议从浏览器启动提升和非提升的程序,请参阅 github : simple-nativemessaging - 示例目录importScripts
关于此主题的进一步阅读
chrome 开发者 : 迁移到 Service Worker
对于那些希望使用旧清单 v2 进行开发的人,可以从以下位置下载以前版本的 Chromium chromium.org : 下载 Chrome / Chromium 的旧版本,Chrome 88(2021 年 1 月 19 日)或更高版本通常支持 manifest V3。
评论