2013-02-25 54 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本身不需要这种方法。