使用r.js和`empty:`

时间:2015-06-30 15:39:12

标签: javascript jquery requirejs r.js

我正在使用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`

但是以下代码可以工作,警报(“1.1.13”)然后警告(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"}
})

第一段代码出了什么问题?谢谢〜

1 个答案:

答案 0 :(得分:1)

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

  

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

(强调补充。)

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