1

我正在使用background.jspopup.js腳本編寫Chrome擴展插件。Closure編譯器:如何編譯帶擴展名的Chrome擴展插件

background.js

function foo(){ 
    // Does something 
} 

popup.js

var backgroundPage = chrome.extension.getBackgroundPage(); 
backgroundPage.foo(); 

編譯這兩個文件分開的意志,當然,打破backgroundPage.foo()參考,因爲foo獲取background.jspopup.js不同改名。

我知道解決這個問題的「正確」方法是使用window["foo"] = foo;background.js中導出foo,但我希望儘可能避免出口(使代碼儘可能不可讀)。

我試過在一個運行編譯腳本和使用--module它們分割成單獨的輸出文件:

java -jar compiler.jar 
    --compilation_level ADVANCED_OPTIMIZATIONS--js background.js popup.js 
    --module backgroundMin:1 
    --module popupMin:1:backgroundMin 

毫不奇怪,這並不工作,因爲編譯器不知道backgroundPagepopup.jsbackground.js中的window相同。我嘗試使用@lends,@borrows@memberOf進行註釋,但無法使其正常工作。

所以我的問題是:是否有可能編譯既background.jspopup.js所以foo()被更名 - 沒有出口foo()並沒有打破從popup.js參考?

回答

1

使用--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,否則會阻止重命名。

+0

我假設你是指第一個代碼塊進入'background.js',第二個代碼塊進入'popup.js',對吧?我看到了這個想法,但是編譯器決定它可以在'popupMin.ks'裏面移動'foo()',這是行不通的,因爲'foo()'可以包含對'background.js'中其他變量的引用將不會從'background.js'中調用)。也許我只是做錯了。 – Woodgnome

+0

在'background.js'中,你必須有:var myWindow = new MyWindow(); myWindow.foo();'如果在兩個模塊中都使用它,編譯器將不會移動代碼,但是您必須始終引用該函數。 –

+0

如果'foo()'實際上從未在'background.js'中實際調用過(而且不應該),但是由於依賴於其他函數,必須在'background.js'中?如果你有'background.js'和'popup'。js'腳本文件,在編譯後爲您提供預期的輸出,我很感激您是否可以將它們編輯爲您的答案。 – Woodgnome