我正在使用 background.js
和 popup.js
脚本编写 Chrome 扩展程序。
在background.js
中:
function foo(){
// Does something
}
在popup.js
中:
var backgroundPage = chrome.extension.getBackgroundPage();
backgroundPage.foo();
单独编译这两个文件当然会破坏 backgroundPage.foo()
引用,因为 foo
在 background.js
中的重命名方式不同。 和 popup.js
。
我知道解决此问题的“正确”方法是使用 window["foo"] = foo;
background.js
导出 foo
/code>,但我想尽可能避免导出(以使代码尽可能不可读)。
我尝试在一次运行中编译这两个脚本,并使用 --module
将它们拆分为单独的输出文件:
java -jar compiler.jar
--compilation_level ADVANCED_OPTIMIZATIONS--js background.js popup.js
--module backgroundMin:1
--module popupMin:1:backgroundMin
毫不奇怪,这不起作用,因为编译器不知道 popup.js
中的 backgroundPage
与 window
相同在background.js
中。我尝试使用 @lends
、@borrows
和 @memberOf
进行注释,但未能使其正常工作。
所以我的问题是:是否可以同时编译 background.js
和 popup.js
以便重命名 foo()
- 无需导出 foo()
并且不破坏 popup.js
的引用?
最佳答案
使用 --module
选项可能是最好的路径 - 我想不出更好的路径。
为了使重命名正确工作,您应该能够扩展窗口类型:
/** @extends {Window} */
function MyWindow () {}
MyWindow.prototype = window.prototype;
/** @return {void} */
MyWindow.prototype.foo = function() {};
然后在background.js
var backgroundPage =
/** @type {MyWindow} */ (chrome.extension.getBackgroundPage());
backgroundPage.foo();
类型转换应该在这里起作用,因为 MyWindow
扩展了 Window
。
所有这些都将放置在您的实际代码中。不要使用 extern,否则会阻止重命名。
关于javascript - 关闭编译器: How to compile Chrome extension popup with background reference,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21459249/