要求js从cdn加载脚本失败

时间:2013-02-07 13:13:56

标签: javascript jquery requirejs 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();

可以请某人指出我做错了吗?

P.S:我正在定义网站网址,因为我使用的是Laravel,没有该定义,它包含基本网址中的网址。

3 个答案:

答案 0 :(得分:4)

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

来自RequireJS Doc

  

不要在构建中混合使用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,你可以:

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

-OR -

  • 围绕'selected'创建一个包装器模块,将jQuery列为依赖项

就个人而言,我选择了第一选择。我认为通过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