2013-02-25 53 views
4

我正在處理一個用戶腳本 - 特別是this userscript - 它被設計爲封裝模塊中的功能。爲了能夠進行一些自動化測試,我想將這些模塊分成它們自己的文件,並使用node.js的模塊導出,並要求將函數合併成一個文件以用於Greasemonkey或簡單的瀏覽器擴展。重構腳本以使用javascript模塊

我首先想到的是剛剛的模塊複製到自己的文件,這樣

module.js

var exportedModule = (function(){ 
    var Module = { 
     // public functions and members 
    }; 

    //private functions and members 

    return Module; 
}()); 

module.exports = exports = exportedModule; 

然後有需要每個模塊的中央一號文件,也許編譯他們有類似Browserify

的script.js

var importedModule = require(./module); 

importedModule.init(); 

這可能嗎?

+0

請注意,用戶腳本中的['require'是關鍵字](http://wiki.greasespot.net/Metadata_Block#.40require)。舊的標題有點混亂。 ...... PS:你應該使用'@ require'來處理AMAP這種東西,但目前它只能在Greasemonkey和Tampermonkey中完全支持。 – 2013-02-26 00:17:33

+0

@BrockAdams感謝您的澄清編輯。我們正在使用require,但正在努力將此腳本捆綁到瀏覽器擴展中。我主要研究nodejs和requirejs等方法來改進我們的開發過程。 – forwardslash 2013-02-26 21:05:01

回答

2

在我看來,使用Requirejs會更好,它使用AMD風格的模塊,本質上它更適合瀏覽器。節點commonjs風格的模塊是同步的,並且不適合瀏覽器模型。

當然,使用requirejs會稍微改變你的腳本。

+0

是的。我想補充的common.js風格模塊系統實際上是可怕的。 Ryan Dahl(Node.js的製造者)甚至感到遺憾。 – 2013-02-25 22:47:21

+0

真的嗎?當它被適當地使用時,我確實很喜歡它。 IMO的主要問題是缺乏與AMD的兼容性,這使得在客戶端和服務器上使用腳本變得非常棘手。但是......我不想在這裏參加宗教戰爭。 :-) 你能提供一個鏈接嗎? – 2013-02-26 00:25:37

+1

你去了哪裏:http://bostinno.com/2011/01/31/node-js-interview-4-questions-with-creator-ryan-dahl/ – 2013-02-26 00:59:42

1

這是可能的,而且Browserify很容易:

browserify src/my.user.js -o dist/my.user.js 

在源文件中的元數據可能會移動,但它仍然是正確的解析(由Greasemonkey的至少)。

有關編譯各種資產(包括CSS和圖像)的更復雜示例,請參閱here

類似的方法可以用來模塊化的jQuery插件,可能瀏覽器擴展,雖與Add-on SDK內置Firefox擴展,因爲他們支持require/NPM本身不需要這種方法。