我是RequireJS的新手,由于某种原因,我无法通过CDN加载脚本。
我的代码:
// site full url
var siteUrl = window.location.protocol+"//"+window.location.host + "/fresh/";
// requirejs config
requirejs.config({
baseUrl: siteUrl + "assets/js/",
paths: {
"plugins": "plugins",
"scripts": "scripts",
"jquery": "https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min",
"jquery-ui": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.10.0/jquery-ui.min",
"bootstrap": "https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.2/js/bootstrap.min",
}
});
require(['jquery', 'jquery-ui', 'bootstrap', 'plugins/chosen'], function($, chosen){
/*
loading global selectors and variables
*/
//chosen for select boxes
$(".chzn-select").chosen();
});
并且jquery无法加载。我收到以下错误:
ReferenceError: jQuery is not defined
[Megszakítás ennél a hibánál]
...h"):this.container.removeClass("chzn-container-single-nosearch")),e="",s=this.re...
chosen.js (1. sor)
ReferenceError: jQuery is not defined
TypeError: $(...).chosen is not a function
$(".chzn-select").chosen();
可以请某人指出我做错了吗?
P.S:我正在定义网站网址,因为我使用的是Laravel,没有该定义,它包含基本网址中的网址。
答案 0 :(得分:4)
布兰登是正确的,而我认为垫片无法解决问题
不要在构建中混合使用CDN加载和shim配置。示例场景:您从CDN加载jQuery但使用shim配置加载类似于依赖于jQuery的Backbone的股票版本。在进行构建时,请确保在构建的文件中内联jQuery,并且不要从CDN加载它。否则,Backbone将在构建文件中内联,并且将在加载CDN的jQuery之前执行。这是因为shim配置只会延迟加载文件,直到加载依赖项,但不会对define进行任何自动换行。在构建之后,依赖关系已经内联,shim配置不能延迟非
define()
'代码的执行,直到以后。define()
'd模块在构建之后可以使用CDN加载的代码,因为它们正确地将它们的源包装在定义工厂函数中,该函数在加载依赖项之前不会执行。所以上课:shim config是非模块化代码,遗留代码的一种权宜之计。define()
'd模块更好。
简而言之,我相信当你的模块不是requirejs而且它们依赖于其他一些模块(jQuery)时,你将无法在RequireJS中使用CDN中的jQuery。
在这种情况下,我同意布兰登的建议,直接在页面上要求他们可能会更好。
答案 1 :(得分:2)
这是因为您引用的'selected'库需要定义jQuery。 RequireJS不以保证顺序加载给定模块的依赖项。它并行加载它们。这是出于性能原因。所以如果你想首先加载jQuery,你可以:
-OR -
就个人而言,我选择了第一选择。我认为通过AMD加载jQuery没有任何好处,因为每个页面都需要它,并且许多lib依赖于它。没有理由懒得加载你总是需要的东西。
编辑:
看起来您也可以使用RequireJS的垫片功能来执行此操作:
http://requirejs.org/docs/api.html#config-shim
你需要为'selected'定义一个shim并列出jQuery和其他任何库作为它的依赖。
答案 2 :(得分:-6)
$(document).ready({
//all your jquery code should go here
});
想知道为什么?见this