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');