我正在尝试使用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相同的顺序执行。
答案 0 :(得分:1)
我认为您可能需要更好地了解异步模块定义(AMD) API specification。在任何一种情况下,我都修改了你的代码以更好地遵守AMD的语法,我创建了第三个文件来定义x
,如下所示:
<强> test1.js 强>
// Require the 'test2' module (which is passing x; which is equal to console)
require(['test2'], function(x){
x.log('this is test1');
});
<强> 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
});
<强> x.js 强>
// Define the 'x' module which has no dependencies
define(function(){
console.log('this is x');
return console; // Return console
});