gpt4 book ai didi

javascript - Firefox SDK 附加组件中的 OS.File

转载 作者:行者123 更新时间:2023-11-29 17:06:42 32 4
gpt4 key购买 nike

这是我第一次尝试编写 Firefox 附加组件。

我正在尝试读取我正在编写的 Firefox 附加组件中包含的文本文件。

我正在按照示例 from MDN

let decoder = new TextDecoder();      // This decoder can be reused for several reads
let array = OS.File.read("file.txt"); // Read the complete file as an array
let text = decoder.decode(array); // Convert this array to a text

在我的 main.js 中,我有以下代码片段:

Components.utils.import("resource://gre/modules/osfile.jsm");

var pathFile = OS.Path.join("_locales", "en", "messages.json");

let decoder = new TextDecoder('utf-8');

let promise = OS.File.read(pathFile);
promise = promise.then(
function onSuccess(array) {
return decoder.decode(array);
},
function onReject(array) {
console.log("onReject read: ");
}
);

当我使用 cfx run 命令运行插件时,出现以下错误:

Message: ReferenceError: TextDecoder is not defined

我目前使用的是 Firefox 30 和 Firefox Add-on SDK 1.16。

我不应该在附加组件的 main.js 中使用 OS.File 吗?

我应该改用 FileUtils 吗,即 Components.utils.import("resource://gre/modules/FileUtils.jsm");

最佳答案

首先,您为 Workers-docs 链接了 OS.File。您不会在工作线程(任何地方都没有 new Worker)中使用它,而是在主线程中使用它,因此您需要引用 OS.File for the main thread -文档。

不幸的是,SDK 模块现在不能自动获取 TextEncoder/TextDecoder。正如@erikvold 所建议的,您可以:

const { Buffer, TextEncoder, TextDecoder } = require('sdk/io/buffer');

甚至直接从 osfile.jsm 获取它:

const { Cc, Ci, Cu } = require("chrome");
const { OS, TextEncoder, TextDecoder } = Cu.import("resource://gre/modules/osfile.jsm", {});

现在回到你原来的问题:

一般来说,OS.File 可以用在 SDK 插件中,是在文件系统中读写任意文件的好方法。

但是 OS.FileFileUtilssdk/io/... 不适合在您的附加组件中读取文件,因为通常这些文件不会直接位于用户的文件系统中,而是位于已安装的 XPI 文件(这只是一个 zip 文件)中,并且这些 API 允许您逐字读取文件,但不解析容器zip 文件 (XPI)。

不过,您有几个选择:

  • 文件名似乎表明您想本地化某些内容。 SDK 附带 l10n module正是为了这个目的。
  • 位于data/ 文件夹中的内容也可以用self.data.load() 读取。 ,但您仍然需要解码/解析数据。
  • 您可以使用 XMLHttpRequest 读取加载项 (XPI) 中打包的文件,SDK 在 net/xhr 中可用模块。作为额外的好处,您可以通过设置适当的 .responseType 值让 XHR 对象为您解码和/或解析文件。

如果要读取的文件位于附加组件的 data/ 文件夹中,则为 XHR 构建 URI 很容易,例如

cont self = require("sdk/self");
var uri = self.data.url("en/messages.json");
// would map to data/en/messages.json

否则,实际上并没有官方支持的获取 URI 的方法,但是例如以下将适用于 lib/(目前,但将来可能会失败)。

cont self = require("sdk/self");
var uri = self.data.url("../lib/main.js");
// would map to data/../lib/main.js -> lib/main.js

将您自己的文件放在其他地方很棘手,因为 SDK 在构建 XPI 时只会打包某些路径;一般lib/, data/, locale/ (see l10n), chrome/(参见 XUL Migration Guide)

这是一个使用 XHR 的最小示例(但请记住,对于本地化,已经有 l10n 模块):

const self = require("sdk/self");
const { XMLHttpRequest } = require("sdk/net/xhr");

// Assume data/some.json is:
// {"abc":123}
var req = new XMLHttpRequest();
req.onload = function() {
// req.response is an object containing the parsed JSON.
console.log(req.response.abc); // 123
};
req.open("GET", self.data.url("some.json"));
req.responseType = "json";
req.send();

PS:特别是使用 OS.File 和一般的 promises 时,请考虑使用 Task.jsm这可以使编写和重读(维护)代码变得更加容易。

关于javascript - Firefox SDK 附加组件中的 OS.File,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24174046/

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