Javascript 在boostrap插件中卸载惰性getter?

Javascript 在boostrap插件中卸载惰性getter?,javascript,firefox-addon,firefox-addon-restartless,Javascript,Firefox Addon,Firefox Addon Restartless,在我的bootstrap.js的顶部,我定义了一堆lazyGetters,而不是一个JSM: const myServices = {}; Cu.import('resource://gre/modules/XPCOMUtils.jsm'); XPCOMUtils.defineLazyGetter(myServices, 'sss', function(){ return Cc['@mozilla.org/content/style-sheet-service;1'].getService(Ci

在我的
bootstrap.js
的顶部,我定义了一堆
lazyGetter
s,而不是一个JSM:

const myServices = {};
Cu.import('resource://gre/modules/XPCOMUtils.jsm');
XPCOMUtils.defineLazyGetter(myServices, 'sss', function(){ return Cc['@mozilla.org/content/style-sheet-service;1'].getService(Ci.nsIStyleSheetService) });
我听说您必须卸载导入的模块。但是您为
lazyGetter
s创建的“模块”呢?我该如何卸下这些?我是否要执行
删除我的服务

如果我在
myServices
上执行
delete
,这是一个全局变量,这是否意味着我应该在卸载时删除所有全局变量

我在这里读到:

忘记卸载无重启加载项中的JavaScript模块 泄漏的另一个常见原因是忘记卸载JavaScript代码 引导加载项中的模块。这些泄漏无法通过计算机检测到 查看about:隔间或about:内存,因为这样的模块 在主系统隔室内进行充电

此外,当您的加载项更新并重新启用时,上一个 将使用仍然加载的模块版本,这可能会中断 您的附加组件完全是免费的

下面的示例显示如何再次卸载模块 (bootstrap.js):

注意:不属于外接程序的模块(如Services.jsm)不应由外接程序卸载,因为这可能会导致错误和/或性能下降,并且实际上会增加内存占用


您提供的代码没有导入模块,而是定义了一个服务getter,所以这很好

(旁白:还有一个…)

但是,如果您这样做:

XPCOMUtils.defineLazyGetter(myServices, 'SomeSymbol', function() {
   return Cu.import("chrome://myaddon/content/mymodule.jsm", {}).SomeSymbol;
});
然后您当然需要再次
Cu.unload()
该模块。这最好通过(IMO)在模块加载后立即注册卸载来完成,例如:

XPCOMUtils.defineLazyGetter(myServices, 'SomeSymbol', function() {
   let rv = Cu.import("chrome://myaddon/content/mymodule.jsm", {}).SomeSymbol;
   unload(function() {
     Cu.unload("chrome://myaddon/content/mymodule.jsm");
   });
   return rv;
});
其他人只是主动卸载所有可能已导入或未导入的模块。这样做很好,因为
Cu.unload()

PS:当你把东西插入另一个模块时,你仍然会遇到麻烦,比如

XPCOMUtils.defineLazyServiceGetter(Services /* other module */,
                                   'sss',
                                   '@mozilla.org/content/style-sheet-service;1',
                                   'nsIStyleSheetService');

在本例中,
XPCOMUtils.jsm
可能仍然引用从代码中作为参数传递的字符串,从而泄漏代码。(另外,将内容粘贴到非您自己的模块中是非常不礼貌的,并且可能会与执行相同操作的其他加载项产生冲突。)

Hmmm。我应该稍微更新一下文本:p模块可以在大约:内存中检测到,因为每个全局隔室和大约:隔室已不再受欢迎,或者现在大约:内存。不管怎样,其余的仍然是准确的。但在您的示例中,您实际上并没有导入模块,而是获取核心XPCOM服务?懒惰地获取
Cu.import
是无用的不是?作为
Cu.import
只需极少的开销?或者这只适用于最初导入的模块,比如
Cu.import(“…Services.jsm…
)啊,好的,谢谢。这意味着在引导作用域中设置的全局变量不需要卸载。酷男人thx。
XPCOMUtils.defineLazyServiceGetter(Services /* other module */,
                                   'sss',
                                   '@mozilla.org/content/style-sheet-service;1',
                                   'nsIStyleSheetService');