2013-12-21 25 views
0

我想合并简单的requireJS解决方案中使用的js。用grunt合并requireJS文件

这是我main.js

require.config({ 
paths: { 
    'jquery': 'jquery-2.0.3.min', 
    'dataTable': 'jquery.dataTables'  
} 
}); 

define(['jquery','dataTable'], function($) { 
'use strict'; 
$(function() { 

    $('.tablesorter').dataTable(); 
}); 

}); 

而且我gruntFile.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'); 

}; 

,当我在这样的

<script src="optimized.js"></script> 

的HTML载入optimized.js我得到 ReferenceError:require is not defined

+0

您是否在optimize.js之前包含了requireJS? –

+0

是否这样?'。 –

回答

0

在包含optimized.js之前,您必须在页面上包含require.js

像这样:

<script src="/path/to/require.js"></script> 
<script src="/path/to/optimized.js"></script> 
0

我发现requireJS只接受 '主' 作为数据的src

所以不是

<script data-main="optimized" src="require.js"></script> 

<script data-main="prod/main" src="require.js"></script> 

并改变t他咕噜config来

requirejs: { 
    production: { 
    options: { 
    name: "main", 
    baseUrl: "", 
    mainConfigFile: "main.js", 
    out: "prod/main.js" 
    } 
    } 
} 
+0

您写道:“我发现requireJS只接受'main'作为data-main src”。 RequireJS只接受“data-main”的“main”是不正确的。 – Louis

0

望着除了问题的意见,首先我看到乔治·拉茨打一个问题,您的代码:您需要包括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" 
      } 
     } 
    } 
}); 

(我没有运行此代码,所以了望错别字)。你必须把你的require.js文件的路径requireLib。我们必须使用requireLib作为模块名称,因为require是保留的。使用这种配置,您应该只能加载您的optimized.js文件。

+0

$('。tablesorter')。dataTable()使用define执行正常。只要不合并到一个文件。当我在safari和chrome中看到页面时,在使用require时加载数据表之前会快速轻弹... – Newcoma

+0

1.在此评论中,您自相矛盾(即:“错误消失了,但是$('。 tablesorter')。dataTable();不执行“)。 2.你正在谈论的是与你在问题中显示的''main.js''不同的设置。在你的问题中,''define''调用不在一个单独的文件中。它在直接加载的''main.js''中。 3.你在这里提到的这个场景改变了我的解释绝对*非 - 事物*。它的工作原理只是因为你需要''''''定义''文件。这是''require''导致任何模块的工厂执行。 – Louis

相关问题