1

私のアプリケーション構造は次のようになります。

 ...
 javascripts/
    - main.js
    lib/
        - jquery-1.9.0.min.js
        - require.js

次のような HTML ページがあります。

<script type="text/javascript" data-main='/assets/javascripts/main' src='/assets/javascripts/lib/require.js'></script>  

私のmain.jsは次のようになります:

//main.js
require.config({
    paths: {
    jquery: 'lib/jquery-1.9.0.min' }});

require(['jquery'], function($) {
    return $(function() {
        return console.log('dom ready');
    });
});  

これはすべて正常に機能し、コンソールの HTML ページには「dom ready」と表示されます。問題は、パス構成を削除して、次のように jquery をロードしようとしたときです。

//Updated main.js
require(['lib/jquery-1.9.0.min'], function($) {
    return $(function() {
        return console.log('dom ready');
    });
});  

パス構成を削除し、パスを指定してjqueryをロードしようとしました。これにより、$ 変数に関して「未定義は関数ではありません」と表示されます。奇妙なことに、require.js によって開始されたネットワーク経由で jquery-1.9.0.min が送信されているのを今でも確認できます。ここで何が起こっているのですか?これはバグですか?

4

2 に答える 2

4

バグではありません。jQuery は、それ自体を名前付きモジュールとしてエクスポートします。これは、パス構成オプションとしてそれを持たなければならないことを意味します。

// Expose jQuery as an AMD module, but only for AMD loaders that
// understand the issues with loading multiple versions of jQuery
// in a page that all might call define(). The loader will indicate
// they have special allowances for multiple jQuery versions by
// specifying define.amd.jQuery = true. Register as a named module,
// since jQuery can be concatenated with other files that may use define,
// but not use a proper concatenation script that understands anonymous
// AMD modules. A named AMD is safest and most robust way to register.
// Lowercase jquery is used because AMD module names are derived from
// file names, and jQuery is normally delivered in a lowercase file name.
// Do this after creating the global so that if an AMD module wants to call
// noConflict to hide this version of jQuery, it will work.
if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
    define( "jquery", [], function () { return jQuery; } );
}

https://github.com/jquery/jquery/blob/master/src/exports.js

そうしないと、ライブラリは引き続きロードされますが(ご覧のとおり)、正しく返されませんコールバックが必要/定義されます

于 2013-02-08T07:31:03.147 に答える
0

defineの代わりに に変更しますrequire

define(['lib/jquery-1.9.0.min'], function($) {
    return $(function() {
        return console.log('dom ready');
    });
}); 
于 2013-02-08T04:55:43.053 に答える