将requireJS文件与grunt合并
我想结合在一个简单的requireJS解决方案中使用的js 这是我的main.js将requireJS文件与grunt合并,requirejs,gruntjs,Requirejs,Gruntjs,我想结合在一个简单的requireJS解决方案中使用的js 这是我的main.js require.config({ paths: { 'jquery': 'jquery-2.0.3.min', 'dataTable': 'jquery.dataTables' } }); define(['jquery','dataTable'], function($) { 'use strict'; $(function () { $('.tablesorter').da
require.config({
paths: {
'jquery': 'jquery-2.0.3.min',
'dataTable': 'jquery.dataTables'
}
});
define(['jquery','dataTable'], function($) {
'use strict';
$(function () {
$('.tablesorter').dataTable();
});
});
还有我的Grunfile.js
module.exports = function(grunt) {
grunt.initConfig({
requirejs: {
production: {
options: {
name: "main",
baseUrl: "",
mainConfigFile: "main.js",
out: "optimized.js"
}
}
}
});
grunt.loadNpmTasks('grunt-contrib-requirejs');
grunt.registerTask('default', 'requirejs');
};
当我像这样在html中加载optimized.js时
<script src="optimized.js"></script>
我明白了
引用错误:未定义require在包含
优化的.js
之前,必须在页面上包含require.js
像这样:
<script src="/path/to/require.js"></script>
<script src="/path/to/optimized.js"></script>
我发现requireJS只接受“main”作为数据主src 所以不是
<script data-main="optimized" src="require.js"></script>
除了这个问题之外,我还看了一些评论,首先我看到George Raith提到了代码中的一个问题:您需要包含
require.js
然后您说没有执行$('.tablesorter').dataTable()。这是因为您使用的是define
而不是require
。使用以下命令:
require(['jquery','dataTable'], function($) {
'use strict';
$(function () {
$('.tablesorter').dataTable();
});
});
调用define
仅向RequireJS注册模块。它不执行模块。因此,$('.tablesorter').dataTable()
不会执行也就不足为奇了。您必须使用require
的形式,它接受回调来完成您想要做的事情
至于将项目中的RequireJS包含到单个文件中,您必须明确地请求它。优化器的文档提供了以下示例:
node ../../r.js -o baseUrl=. paths.requireLib=../../require name=main include=requireLib out=main-built.js
您的配置(根据问题中的配置更新)将如下所示:
grunt.initConfig({
requirejs: {
production: {
options: {
name: "main",
baseUrl: "",
mainConfigFile: "main.js",
paths: {
requireLib: <path to require js>
},
out: "optimized.js",
include: "requireLib"
}
}
}
});
grunt.initConfig({
要求:{
制作:{
选项:{
名称:“主要”,
baseUrl:“”,
mainConfigFile:“main.js”,
路径:{
requireLib:
},
out:“optimized.js”,
包括:“requireLib”
}
}
}
});
(我没有运行此代码,所以请注意拼写错误。)您必须为requireLib
输入require.js
文件的路径。我们必须使用requireLib
作为模块名称,因为require
是保留的。使用这种配置,您应该只能加载您的optimized.js
文件。您在optimized.js之前包含过requireJS吗?像这样?错误已消失,但$('.tablesorter').dataTable()已被删除;不是执行<除非包含require.js
,否则code>require
不存在。。。至于你的另一个问题,你应该用更多的信息来回答另一个问题。请关闭你的标签,比如so
。但我的问题是我想合并一个requireJS解决方案中的所有js文件,这样我就只有一个js文件…检查一下指南你写道“我发现requireJS只接受'main'作为数据主src”。RequireJS只接受datamain
$('.tablesorter')的“main”不是真的。dataTable()使用define可以很好地执行。只是当合并到一个文件中时不是这样。当我在safari和chrome中看到页面时,在使用require…1加载dataTables之前会有一个快速切换。在这个评论中,您自相矛盾(也就是说:“错误消失了,但是$('.tablesorter').dataTable();没有执行”)。2.您所说的设置与问题中显示的main.js
不同。在您的问题中,define
调用不在单独的文件中。它位于直接加载的main.js
中。3.你在这里提到的这个场景改变了我的解释。它之所以有效,只是因为在某个地方,您需要包含定义的文件。正是require
导致任何模块的工厂执行。
node ../../r.js -o baseUrl=. paths.requireLib=../../require name=main include=requireLib out=main-built.js
grunt.initConfig({
requirejs: {
production: {
options: {
name: "main",
baseUrl: "",
mainConfigFile: "main.js",
paths: {
requireLib: <path to require js>
},
out: "optimized.js",
include: "requireLib"
}
}
}
});