Javascript RequireJS不';t使用CDN托管库(jQuery)处理多页项目

Javascript RequireJS不';t使用CDN托管库(jQuery)处理多页项目,javascript,requirejs,bundling-and-minification,Javascript,Requirejs,Bundling And Minification,我在一个多页面项目中使用了RequireJS,它的Javascript文件夹结构看起来有点像这样(如何在Markdown中再次创建这些奇特的目录树?) 总之,common.js是我设置配置参数的主脚本文件。这就是它看起来的样子: common.js文件 // Configure RequireJS requirejs.config({ baseUrl: "assets/js/lib", paths: { page: '../page', jquer

我在一个多页面项目中使用了RequireJS,它的Javascript文件夹结构看起来有点像这样(如何在Markdown中再次创建这些奇特的目录树?)

总之,
common.js
是我设置配置参数的主脚本文件。这就是它看起来的样子:

common.js文件

// Configure RequireJS
requirejs.config({
    baseUrl: "assets/js/lib",
    paths: {
        page: '../page',
        jquery: [
            '//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min',
            //If the CDN location fails, load from this location
            'jquery-1.9.1.min'
        ],
        modernizr: [
            '//cdnjs.cloudflare.com/ajax/libs/modernizr/2.6.2/modernizr.min',
            //If the CDN location fails, load from this location
            'modernizr-2.6.2.min'
        ],
        underscore: [
            'underscore-amd.min'
        ]
    }
});
{
    appDir: '../www',
    baseUrl: 'js/lib',
    dir: '../www-built',
    mainConfigFile: '../www/assets/js/common.js',
    modules: [
        //First set up the common build layer.
        {
            //module names are relative to baseUrl
            name: '../common',
            include: ['jquery',
                      'modernizr',
                      'underscore'
            ]
        },
        // Now the page scripts
        {
            //module names are relative to baseUrl/paths config
            name: '../page-index',
            include: ['page/index'],
            exclude: ['../common']
        },
    ],
    paths: {
        jquery: "empty",
        modernizr: "empty"
    },
    optimize: "uglify2",
    removeCombined: true
}
所有的页面调用都按预期工作(CDN位置已加载),但我无法理解缩小部分。
r.js
优化器拒绝合作,抛出一个
错误:优化器不支持路径回退。请为下划线提供生成配置路径覆盖
,即使下划线未指定CDN

build.js文件

// Configure RequireJS
requirejs.config({
    baseUrl: "assets/js/lib",
    paths: {
        page: '../page',
        jquery: [
            '//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min',
            //If the CDN location fails, load from this location
            'jquery-1.9.1.min'
        ],
        modernizr: [
            '//cdnjs.cloudflare.com/ajax/libs/modernizr/2.6.2/modernizr.min',
            //If the CDN location fails, load from this location
            'modernizr-2.6.2.min'
        ],
        underscore: [
            'underscore-amd.min'
        ]
    }
});
{
    appDir: '../www',
    baseUrl: 'js/lib',
    dir: '../www-built',
    mainConfigFile: '../www/assets/js/common.js',
    modules: [
        //First set up the common build layer.
        {
            //module names are relative to baseUrl
            name: '../common',
            include: ['jquery',
                      'modernizr',
                      'underscore'
            ]
        },
        // Now the page scripts
        {
            //module names are relative to baseUrl/paths config
            name: '../page-index',
            include: ['page/index'],
            exclude: ['../common']
        },
    ],
    paths: {
        jquery: "empty",
        modernizr: "empty"
    },
    optimize: "uglify2",
    removeCombined: true
}
请帮助我了解如何构建此项目以创建
common.js
脚本以及各个页面脚本

(注意:我的
build.js
文件的结构基于

更新! 我已经更新了问题,包括
empty:
(谢谢Travis!)的正确语法,现在构建运行没有错误。但是,我的JS文件没有连接或丑陋。CSS文件在导入点处,所以发生了一些事情。下面完成
build.JS
文件(请原谅,但她是个高个子):

最终更新(耶!正在运行) 多亏了下面的Travis,一切都很顺利!(文件正在缩小和连接)。由于他的解决方案托管在Dropbox上,将来可能会丢失(谁知道amirite?),我将总结一下他所做的修复:

1.不要将
define
require
调用混合在一个文件中。 我有几个文件,我把它们混合在一起:

page/start.js

 define(['jquery','underscore'],function($,_) {
      ...
 });

 require(['jquery','page/start'], function($, Y) { // BAD!
      ...
 });
 require(['jquery','app/start_helper'], function($, Y) {
      ...
 });
 define(['jquery','underscore'],function($,_) {
      ...
 });
解决办法是这样做:

page/start.js

 define(['jquery','underscore'],function($,_) {
      ...
 });

 require(['jquery','page/start'], function($, Y) { // BAD!
      ...
 });
 require(['jquery','app/start_helper'], function($, Y) {
      ...
 });
 define(['jquery','underscore'],function($,_) {
      ...
 });
app/start\u helper.js

 define(['jquery','underscore'],function($,_) {
      ...
 });

 require(['jquery','page/start'], function($, Y) { // BAD!
      ...
 });
 require(['jquery','app/start_helper'], function($, Y) {
      ...
 });
 define(['jquery','underscore'],function($,_) {
      ...
 });
2.它是
“空的:
不是
“空的”
这是一个棘手的问题,尽管RequireJS文档提到了它们

3.因为 什么样的列表只有两个要点



awesomelicous-现在它就像一个符咒:)

看起来requireJs认为您试图为下划线提供一个路径回退,因为您将其路径值指定为数组。试着把它当作一个字符串来做

paths: {
    underscore: 'underscore-amd.min'
}
还要注意的是,
为空:
(带“:”)而不是
为空

最后,作为一个不相关的旁注,您可以随时查看哪个IMHO是一个更可定制、跨浏览器兼容、更快的下划线替换,具有相同的API,它托管在cdnjs上,并且是AMD兼容的

更新

根据评论中的对话,以下是我对您的项目的更新版本:

正如在评论中提到的,您的问题似乎是您正在
define
ing需要这些模块的同一个文件中的模块,我认为这导致r.js认为这些模块没有主入口点。约定是将模块定义从需要这些模块的文件中分离出来

请注意,现在在
assets/js
下有一个
app
文件夹,其中存储了页面模块中以前是
define
d的每个模块。您的页面模块现在需要中的这些模块。当我重新运行
r.js
(使用uglify2作为优化器)时,一切似乎都按照预期运行

此外,我还从build.js文件中删除了一些冗余(如果您在构建配置中也使用了baseUrl,则只需在mainConfigFile中指定baseUrl)。最后,如果希望将jQuery和引导全局附加到每个页面,您可能需要研究使用。否则,您应该在需要时将它们明确地列为依赖项


最后,作为最后一条建议,您可能希望减少每个文件中
require
的数量。对于大多数页面,您可以将所有内容包装在一个require调用中,然后将不同的逻辑分离到函数中,以节省事件队列上的一些空间,以及必须冗余调用
require
函数的一些周期

有人吗?这里很安静:(你试过为下划线添加CDN吗?这里有一个://cdnjs.cloudflare.com/ajax/libs/underline.js/1.4.4/underline-min。js@skishore问题是它没有包装(您不能像RequireJS中那样使用非AMD模块,如下划线,而不在
define
调用中包装它),您可以添加吗“不要将
define
require
调用混合在一个文件中。“作为一个单独的答案并选择它作为解决方案?@kaiser我的代码有几个问题,其中之一是混合了
define
require
调用。我编辑了Travis的答案来强调这一点。很高兴我能帮上忙!我们的javascript没有被连接优化:您使用的是什么版本的requireJs?”uglify2仅在2.1.2之后才可用。另外,如果您让我知道您的版本,我可以尝试复制您的问题。此外,您使用
removeCombined
是否有原因?如果此设置为true,则“合并到生成包中的任何文件都将从输出文件夹中删除,”我认为这听起来不像你想要的行为。(从上一条评论继续)尝试将
optimize
值改为“uglify”而不是“uglify2”然后去掉
removeCombined
行,看看这是否有帮助!否则,请告诉我您使用的是什么版本的requirejs,我将尝试复制这个问题。您的问题是您在顶级页面模块中定义模块,即混合调用
require
define
r.js
似乎在运行