使用requirejs和grunt组合文件

时间:2014-05-30 11:01:23

标签: requirejs gruntjs grunt-contrib-requirejs

我正在尝试使用grunt插件为requirejs组合文件:

https://www.npmjs.org/package/grunt-contrib-requirejs

以下是配置:

requirejs:
      compile:
        options:
          #appDir: './'
          baseUrl: "client"
          mainConfigFile: "client/test1.js"
          name: "test1"
          out: "build/test.js"
          onModuleBundleComplete: (data) ->
            outputFile = data.path
            fs.writeFileSync(outputFile, amdclean.clean(
              'filePath': outputFile
            ))
          wrap:
            start: ""
            end: ""

以下是输入和输出javascript

输入: test1.js

var x = console;
require(['test2'], function() {
  return console.log('Hello');
});

test2.js

x.log('this is test2');

test.js

var test2, test1;
x.log("this is test2"), null, test2 = undefined;
var x;
x = console, function () {
    return console.log("Hello")
}(), test1 = undefined;

使用requirejs在浏览器中加载时,程序运行正常。但是在构建完成后,它不起作用。这是因为在使用requirejs加载模块时加载test2.js中的代码之前提供了定义x=console

但是,在构建之后,在加载test2.js的代码之后出现定义x=console - 这会产生错误 - 因为test2.js调用x,这是两个j之间的全局变量文件。

我需要确保requirejs将项目构建到单个.js文件中,同时确保不存在amd代码(require / define),并且代码以与浏览器中加载的requirejs相同的顺序执行。

1 个答案:

答案 0 :(得分:1)

我认为您可能需要更好地了解异步模块定义(AMD) API specification。在任何一种情况下,我都修改了你的代码以更好地遵守AMD的语法,我创建了第三个文件来定义x,如下所示:

  1. <强> test1.js

    // Require the 'test2' module (which is passing x; which is equal to console)
    require(['test2'], function(x){
      x.log('this is test1');
    });
    
  2. <强> test2.js

    // Define the 'test2' module which depends on the 'x' module
    define(['x'], function(x){
      x.log('this is test2');
      return x; // Return x; which is equal to console
    });
    
  3. <强> x.js

    // Define the 'x' module which has no dependencies
    define(function(){
      console.log('this is x');
      return console; // Return console
    });