UMD的Grunttesting

我试图找出使用UMD工厂testingJavascript模块定义的最佳方法,类似于: https : //github.com/umdjs/umd/blob/master/returnExportsGlobal.js

我不想testing模块本身,我想testing模块在各种环境中正确导出/创build:

  1. 如果CommonJS(节点),模块是否正确导出?
  2. 如果AMD,它的定义是否正确?
  3. 如果浏览器(没有requirejs),是否创build了正确的全局?

我想用grunt和jasmine来运行这些testing。 我可以使用grunt-contrib-jasmine来testing点2和3,但不能testing点1。

我想我可以使用grunt-contrib-jasmine和grunt-jasmine-node的混合来testing正确的模块定义(具体实现我仍然需要弄清楚),但是感觉非常混乱。

在高层次,有没有人知道任何现有的方法来实现这一点,而不使用多个grunt插件?

最后,我决定使用混合任务,使用grunt-contrib-jasmine进行浏览器全局和浏览器AMDtesting,并使用jasmine_node进行CommonJStesting。 我只有一个支持所有3个模块typestesting的spec文件。

这是我的gruntconfiguration:

grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), jasmine: { browserGlobal: { src: ['src/Foo.js'], options: { specs: 'spec/**/*.spec.js' } }, browserAMD: { src: ['src/Foo.js'], options: { specs: 'spec/**/*.spec.js', template: require('grunt-template-jasmine-requirejs') } } }, jasmine_node: { specNameMatcher: 'spec', projectRoot: 'spec/' } }); 

我的茉莉花spec文件现在支持UMD:

 (function (root, factory) { if (typeof module === 'object' && module.exports) { // Node/CommonJS factory( require('modulename') ); } else if (typeof define === 'function' && define.amd) { // AMD define([ 'modulename' ], factory); } else { // Browser globals factory(root.ModuleName); } }(this, function factory(ModuleName) { // Tests here })); 

这里是我用于模块的UMD工厂:

 (function (root, factory) { if (typeof module === 'object' && module.exports) { // Node/CommonJS module.exports = factory(); } else if (typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. define(factory); } else { // Browser globals root.ModuleName = factory(); } }(this, function factory() { // public API return { foo: 'bar' }; })); 

您还可以使用uRequire,并在使用声明性function的同时将所有模块中的所有UMD样板文件保存起来。

您只需简单地编写简单的AMD或简单的CommonJS模块(或两者混合),然后通过简单的构build步骤将其转换为UMD(或在nodejsWeb / AMDWeb / Script上运行的rjs优化的combined.js ) config ,无论是在CLI中还是在grunt中 。

制作的UMD基于像https://github.com/umdjs/umd/blob/master/returnExportsGlobal.js这样众所周知的模板,有各种各样的调整,其中之一是你可以声明性地导出到window / global

然后,您可以将普通的AMD或commonJS规格转换为UMD和/或“combined.js”,并在浏览器或grunt-mocha中同时打开。 看uBerscore许多琐碎和更高级的例子。