要求js从cdn加载脚本失败

我是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(); 

请有人指出我做错了什么?

PS:我正在定义站点URL,因为我使用的是Laravel,没有该定义,它包含基本URL中的URL段。

布兰登是正确的,而我认为垫片无法解决问题

来自RequireJS Doc :

不要在构建中混合CDN加载和shim配置。 示例场景:您从CDN加载jQuery但使用shim配置加载类似于依赖于jQuery的Backbone的股票版本。 在进行构建时,请确保在构建的文件中内联jQuery,而不是从CDN加载它。 否则,Backbone将在内置文件中内联,并且将在加载CDN的jQuery之前执行。 这是因为shim配置只会延迟加载文件,直到加载依赖项,但不会对define进行任何自动换行。 在构建之后,依赖关系已经内联,shim配置不能延迟非define() ‘d代码的执行,直到稍后。 define() ‘d模块在构建之后可以使用CDN加载的代码,因为它们正确地将它们的源包装在定义工厂函数中,该函数在加载依赖项之前不会执行。 所以上课:shim config是非模块化代码遗留代码的一种权宜之计。 define() ‘d模块更好。

简而言之,我相信当你拥有不需要js的模块并且它们依赖于其他一些模块(jQuery)时,你将无法在RequireJS中使用CDN中的jQuery。

在这种情况下,我同意布兰登的建议,要求他们直接在页面上可能会更好。

这是因为您引用的“选择”库需要定义jQuery。 RequireJS不以保证顺序加载给定模块的依赖项。 它并行加载它们。 这是出于性能原因。 所以如果你想首先加载jQuery,你可以:

  • 需要在页面上直接使用jquery,因此它会在任何AMD内容启动之前加载

-要么-

  • 在’selected’周围创建一个包装器模块,它将jQuery列为依赖项

就个人而言,我选择了第一选择。 我认为通过AMD加载jQuery没有任何好处,因为每个页面都需要它,并且许多lib依赖于它。 没有理由懒得加载你总是需要的东西。

编辑:

看起来您也可以使用RequireJS的shimfunction来执行此操作:

http://requirejs.org/docs/api.html#config-shim

你需要为’selected’定义一个shim并列出jQuery以及其他任何库作为它的依赖项。

 $(document).ready({ //all your jquery code should go here }); 

想知道为什么? 看到这个