Javascript RequireJS不';t使用CDN托管库(jQuery)处理多页项目
我在一个多页面项目中使用了RequireJS,它的Javascript文件夹结构看起来有点像这样(如何在Markdown中再次创建这些奇特的目录树?) 总之,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
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
似乎在运行