javascript - Chrome扩展能否动态添加JS文件到本地扩展目录?用户上传还是从网络保存?

标签 javascript google-chrome firefox google-chrome-extension firefox-addon-webextensions

我想知道以后是否可以将某些 JS 文件添加到 Web 扩展目录中?

就像我有一个应用程序,用户可以从应用程序内选择某些设置,并且这些文件(js 和 html 文件、图像或 blob)以某种方式从网络添加到扩展中。就像某种不使用任何 native 应用程序的按需更新程序,但似乎升级是由应用程序商店自动完成的。

我正在使用 ajax 读取文件并将它们添加到 indexeddb,但因为它可能是多个文件,因此变得困惑。

假设用户想要扩展程序上的某个功能,并且有一个 html 页面、js 文件和图像,那么这些功能就会下载到已安装扩展程序内的某个文件夹中。

function download() { //only saves to downloads directory
  var imgurl = "https://www.google.com.hk/images/srpr/logo11w.png";
  console.log('download');
  browser.downloads.download({url:imgurl},function(downloadId){
      console.log("download begin, the downId is:" + downloadId);
  });
}

我还尝试了上面的 chrome 下载功能,但该功能仅适用于下载文件夹,不适用于扩展文件夹。

有没有办法制作自定义更新程序?!我知道我们无法保存到磁盘,但对扩展文件夹有任何宽大处理或解决方法吗?!甚至一些愚蠢的事情,比如对某些 dos(和 linux/mac)进行 shell 调用,将文件保存到扩展文件夹中。我可以获取文件,但不能保存它们。

最佳答案

好的,我会把它作为答案。这是我所依赖的适合我的场景的解决方案,我在下面列出了一些替代方案:

  • 将其他文件作为单独的扩展程序,并为用户提供一个安装链接,而不是他们可以安装该扩展程序的位置,然后这些子扩展程序与母扩展程序通信,并且它们知道其子扩展程序文件夹中资源的地址,因此母亲从 child 那里获取文件位置,以从该文件夹加载这些资源。子扩展就像这些 html 和 js 的 bundle ,带有后台脚本,该脚本将这些项目的地址发送给母扩展。

https://developer.chrome.com/extensions/messaging#external

缺点是我必须看看这会如何影响 url,就像如果我使用 ajax 将子扩展文件夹中的 html 页面注入(inject)到主界面中,那么我就不能使用相对 url 来访问该 ' 中的任何图像。因为 URL 是相对于母扩展文件夹的。我必须使用 html 页面的绝对路径重写子扩展 url,以从具有相对 url 的子扩展 html 代码加载图像和 js。

优点:

  • 比indexeddb更干净、更持久。

  • 可以从磁盘正常加载文件。

缺点:

  • 用户必须安装单独的扩展。

  • URL结构可能有点困惑,如果从child加载html则需要重写url。然而,这仅适用于图像源以及 JavaScript 的加载位置,因此这并不是什么大问题。

其他可能的解决方案:

  • 我已经在做的 Indexeddb 似乎是执行此操作的首选方法,但我真的不想将每个 html 资源存储在 indexeddb 中。好处是,虽然需要安装扩展,但这种方法可以在没有用户交互的情况下默默地获取和添加文件,并且 indexeddb 似乎有些持久。可能最终仍然会使用它,因为它是无声的,但必须从数据库加载每个 Assets 听起来像是一场噩梦。

  • 如果我只在 Firefox 上工作,文件句柄 Api 可能会起作用 https://wiki.mozilla.org/WebAPI/FileHandleAPI

  • 我还没有尝试过shell复制,也许如果我用ajax获取然后使用一些dos函数保存到磁盘,然后为不同的操作系统执行不同的保存函数。

  • 文件系统 Api 仅保存下载内容,无论如何都不适用于扩展,因此毫无用处。

更新

在 Windows 中没有任何 sudo,但这不需要子文件夹的管理员权限(但不在 C:\根目录上)。它非常适合仅适用于 Linux 的应用程序。如果我只是想将文件保存到 Windows 计算机上,这可能可行。

Shell复制方法是使用ajax从本地或远程位置抓取文件内容,以流的形式输出到DOS以保存到Windows上的文件中。并使用 shell exec 命令对每个操作系统执行此操作,或者检测操作系统并执行该命令。这样我什至可以将文件放在确切的文件夹位置。

就像我从内容中发出这种命令一样:

//To append you can use >> instead of >
//folder seems necessary, can't save to root without admin
echo the content I want to save > C:\folder\textfile.txt

我想使用仅适用于 Nodejs 的 shell exec 来调用它,因此请深入研究其他答案

How to execute shell command in Javascript

//full code to save file using javascript on windows
var shell = WScript.CreateObject("WScript.Shell");
shell.Run("echo content to save > C:\folder\textfile.txt");

shell 命令似乎不起作用。我找不到这个的用途。 Windows 的常规 javascript 中似乎没有 shell 命令。好像需要IE ActiveX。不适用于 Firefox 或 Chrome。

关于javascript - Chrome扩展能否动态添加JS文件到本地扩展目录?用户上传还是从网络保存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59384329/

相关文章:

html - 我无缘无故收到 Firefox 安全警告

java - 呈现 HTML(w/javascript)并转换为图像

javascript - 如何在Javascript中将JSON字符串解析为数组

javascript - 立即调用箭头函数表达式

html - 流体宽度在 Firefox 中不起作用

javascript - 如何捕获 Firefox 中未保存更改的 "Stay on Page"按钮?

javascript - githubs api 搜索参数是什么来将结果限制为仅前 X?

javascript - 如果没有 chrome devtools,ace 编辑器不会显示

javascript - Jasmine spy 返回空的mostRecentCall 对象

CSS 元素过渡高度不适用于 chrome