4

私は 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: 私は Laravel を使用しているため、サイト URL を定義しています。その定義がないと、ベース URL に URL セグメントが含まれます。

4

3 に答える 3

4

ブランドンは正しいが、シムは問題を解決できなかったと思う

RequireJS Docから:

ビルドで CDN の読み込みと shim 構成を混在させないでください。シナリオ例: CDN から jQuery をロードしますが、shim 構成を使用して、jQuery に依存するバックボーンのストック バージョンのようなものをロードします。ビルドを行うときは、必ずビルド ファイルに jQuery をインライン化し、CDN からロードしないでください。それ以外の場合、バックボーンはビルドされたファイルにインライン化され、CDN で読み込まれた jQuery が読み込まれる前に実行されます。これは、シム構成が依存関係がロードされるまでファイルのロードを遅らせるだけで、定義の自動ラップを行わないためです。ビルド後、依存関係は既にインライン化されており、shim 構成は、非define()'d コードの実行を後まで遅らせることはできません。define()モジュールは、依存関係が読み込まれるまで実行されない define factory 関数でソースを適切にラップするため、ビルド後に CDN で読み込まれたコードで動作します。したがって、教訓: shim config は、非モジュール コード、レガシー コードの応急処置です。define()モジュールの方が優れています。

つまり、requirejs ではないモジュールがあり、それらが他のモジュール (jQuery) に依存している場合、RequireJS 内で CDN から jQuery を使用することはできないと思います。

この場合、ブランドンが提案したことに同意します。ページに直接要求する方が良いかもしれません.

于 2013-06-29T13:45:27.423 に答える
2

これは、参照している「選択された」ライブラリでjQueryを定義する必要があるためです。RequireJSは、特定のモジュールの依存関係を保証された順序でロードしません。それらを並行してロードします。これはパフォーマンス上の理由によるものです。したがって、jQueryを最初にロードする場合は、次のことができます。

  • ページ上で直接jqueryが必要なため、AMDのものが開始する前にロードされます

-また-

  • jQueryを依存関係としてリストする「chosen」の周りにラッパーモジュールを作成します

個人的に、私は最初の選択肢を選びます。すべてのページでjQueryが必要であり、多くのライブラリがそれに依存しているため、AMDを介してjQueryをロードするメリットはありません。常に必要なものを遅延ロードする理由はありません。

編集:

RequireJSのshim機能を使用してこれを行うこともできるようです。

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

'chosen'のシムを定義し、jQueryとその他のライブラリを依存関係としてリストする必要があります。

于 2013-02-20T22:22:35.740 に答える
-6
$(document).ready({

   //all your jquery code should go here
});

理由を知りたいですか?これを見る

于 2013-02-07T13:34:40.307 に答える