【问题标题】:Combining files using requirejs and grunt使用 requirejs 和 grunt 组合文件
【发布时间】:2014-05-30 11:01:23
【问题描述】:

我正在尝试使用 requirejs 的 grunt 插件合并文件:

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

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

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

【问题讨论】:

    标签: requirejs gruntjs grunt-contrib-requirejs


    【解决方案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
      });
      

    【讨论】:

    • 我当然需要那个!这就是为什么我在quora上问了一个问题。 quora.com/…。感谢您的帮助。
    • 虽然我已将控制台分配给x,但实际上x 包含一个对象的实例,我希望它可以作为我所有的javascript 文件和模块的全局变量来访问。以您定义它的方式,x 的新实例将在每次被某些 javascript 调用时创建,如下所示:define(['x'], function(x){。我想在我的应用中使用单个实例。
    • 还有一点!我希望解决的真正问题是实际的 grunt 配置——它应该构建项目,以便编译的文件与使用 requirejs 单独加载的文件的工作方式完全相同。您提供的解决方案没有提供。
    • @EternallyCurious 无论您分配给x 的对象是什么,它总是会引用同一个实例,无论您在哪里需要它。 javascript 中的所有非原始数据类型都是通过引用传递的。无论哪种情况,如果您想要一个全局对象,为什么不直接使用window.x = { … }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 2016-05-07
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    相关资源
    最近更新 更多