gpt4 book ai didi

javascript - 为什么在 Firefox Addon 中导入的对象无法访问导入器导入的模块?

转载 作者:行者123 更新时间:2023-12-02 17:12:08 25 4
gpt4 key购买 nike

为了清楚起见,请考虑以下简化示例:

one.js

Components.utils.import('resource://gre/modules/Services.jsm');

let obj = {

init: function() {

Components.utils.import('chrome://myaddon/modules/two.jsm', this);
}

// code here has access to Services.jsm
}

two.js

this.EXPORTED_SYMBOLS = ['abc'];

this.abc = {

// abc is imported into obj()
// however as part of obj (), abc{} does not have access to Services.jsm
}

我知道它是这样工作的,但问题是为什么?
结果是,例如 Services.jsm 必须在每个模块中传递。
虽然Firefox会缓存模块,性能上没有太大差异,但我想知道是否可以避免重复导入?

最佳答案

就像 @felix-kling 已经提到的那样,这是由于模块级别隔离造成的,如果您仔细考虑一下,它就很有意义。否则,不仅 Services 会被其他模块看到,abc 也会被其他模块看到。

还有另一个重要原因:由于 JS 代码模块启动一次并在之后缓存,如果您导入 two.jsm 两次,一次从已经导入 Services.jsm 的模块导入,一次从另一个模块没有这样做?现在,two.jsm“看到”Services 将取决于首先导入哪个其他模块!这将是非常令人讨厌的。

在这种情况下,您关于“abc 被导入 obj()”的评论是错误的。您的代码实际上将 abc 导入到顶级范围中。 Cu.import 将始终导入到顶级范围,除非您明确指定要导入到的另一个范围。

"abc" in this; // false
"abc" in obj; // false
obj.init();
"abc" in this; // true
"abc" in obj; // false!

如果您想将 two.jsm 导入 obj,您需要使用第二个参数调用 Cu.import

let obj = {
init: function() {
Components.utils.import('chrome://myaddon/modules/two.jsm', this);
}
};
"abc" in this; // false
"abc" in obj; // false
obj.init();
"abc" in this; // false
"abc" in obj; // true

当然,这不会影响服务的可见性。

我想,如果 Cu.import 只是自动导入一些您无论如何都会导入的模块,例如 Services.jsmXPCOMUtils,这会很有帮助.jsm。但由于遗留原因和向后兼容性限制,这种情况不会也可能永远不会发生。 (例如,我遇到了导入 const {Promise} = Cu.import(..., {}); 的代码中断,因为 ES6 添加了默认的 Promise 全局...;那种向后兼容性问题/限制)。

替代方案?

嗯,显而易见的是不要将 Cu.import 用于您自己的东西,而是使用其他东西。一堆附加组件,包括。当然,所有 SDK 附加组件都有自己的 CommonJS 风格 require() 实现。

  • 实际上,您可以在不使用 SDK 的情况下重复使用 SDK 加载程序,或者如果您愿意,也可以仅使用 SDK 的选定部分。请参阅loader文档。我知道 Erik 在其他非 SDK Scriptish 中创建了一个加载程序附加组件。
  • 您可以基于下标加载器以及Sandbox编写自己的自定义加载器。例如。我在我的 extSDK 中这样做了样板文件(loader.jsm == loader.jsm::exports 中的所有全局符号将对每个 required 模块可见)。

但这样做可能需要大量额外的工作、额外的知识和精力,将现有的 JS 代码模块移植到基于 require() 的模块。

关于javascript - 为什么在 Firefox Addon 中导入的对象无法访问导入器导入的模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24740920/

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