我正在使用jquery 1.11.3,require.js 2.1.18和r.js 2.1.18

我想将jquery.js放在外部,以便使用浏览器缓存。

//file js/main.js
require.config({
        baseUrl: 'js',
        paths: {
                'jquery': '//cdn.bootcss.com/jquery/1.11.3/jquery.js'
        },
        shim: {
                'p': ['jquery']
        }
});

require(['jquery', 'p'], function($) {
        alert(222);
});


//file js/p.js
//this is an jquery plugin which does not support AMD
alert($().jquery);


//file build.js
({
        baseUrl: "js",
        name: "main",
        out: "app.js",
        paths: {jquery: "empty:"}
})


会导致错误

`Uncaught ReferenceError: $ is not defined(anonymous function) @ app.js:1`


但是以下代码可以工作,alert(“ 1.1.13”)然后Alert(222)

//file js/main.js
require.config({
        baseUrl: 'js',
        paths: {
                'jquery': 'jquery.js'
        },
        shim: {
                'p': ['jquery']
        }
});

require(['jquery', 'p'], function($) {
        alert(222);
});


//file js/p.js
alert($().jquery);


//file build.js
({
        baseUrl: "js",
        name: "main",
        out: "app.js",
        paths: {jquery: "jquery"}
})


代码的第一部分怎么了?谢谢〜

最佳答案

RequireJS不允许您做您想做的事情。 notes on shim拼出:


  不要在构建中将CDN加载与shim config混合使用。示例方案:从CDN加载jQuery,但使用shim配置加载类似于jQuery的Backbone的普通版本。在进行构建时,请确保在内建文件中内联jQuery,并且不要从CDN加载它。否则,Backbone将内联到生成的文件中,并在CDN加载的jQuery加载之前执行。这是因为shim config只是延迟文件的加载,直到加载依赖项为止,但不对define进行任何自动包装。构建后,依赖关系已经内联,shim配置无法将non-define()代码的执行推迟到以后。 define()的模块在构建后即可处理CDN加载的代码,因为它们将其源代码正确包装在define工厂函数中,直到加载依赖项后,这些函数才会执行。因此,课程:shim config是非模块化代码,传统代码的权宜之计。 define()的模块更好。


(已添加重点。)

除非将p重写为适当的AMD模块,否则必须放弃CDN。

09-20 07:55