1

私の設定(main.js)は次のように定義されています:

require.config({
    urlArgs: "bust=" + (new Date()).getTime(),
    paths: {
        jquery: 'jquery-1.8.3.min',
        knockout: 'knockout-2.2.0',
        komapping: 'knockout.mapping-latest',
        token: 'jquery.tokeninput'
    },
    shim: {
        'token': ['jquery']
    }
});

EDIT main.js は共有構成です。すべて同じセットアップを使用するいくつかのページがあり、プロジェクト内のいたるところでバージョン固有のファイル名を変更する必要はありません。 /編集

次のようにページに含まれています。

<script src="/AnswersDev/Scripts/require.js" data-main="/AnswersDev/Scripts/main"></script>

add-report.js は次のように含まれています。

<script type="text/javascript">
    require(['Views/add-report']);
</script>

編集 それが原因である可能性が高いようです。インライン スクリプトは、main の前に実行されることがあります。そのため、見つかるはずのエイリアスが定義されていないため、単に .js を探します。 /編集

jquery.tokeninput は私の知る限り、私が使用している唯一の非 AMD モジュールです。作業中のリクエストは、次の一連のリクエストになります (Fiddler キャプチャ)。

  1. require.js
  2. main.js
  3. Views/add-report.js
  4. Views/add-report-wizard-model.js
  5. ノックアウト-2.2.0
  6. jquery-1.8.3.min.js
  7. Views/add-report-wizard-model-parameter.js
  8. Views/add-report-wizard-model-step.js
  9. knockout.mapping-latest.js

非稼働リクエストには、次のようなシーケンスがあります。

  1. require.js
  2. Views/add-report.js
  3. main.js
  4. Views/add-report-wizard-model.js
  5. ノックアウト.js
  6. jquery.js
  7. Views/add-report-wizard-model-step.js
  8. Views/add-report-wizard-model-parameter.js
  9. knockout.mapping-latest.js

add-report.js:

define(['jquery', 'knockout', 'Views/add-report-wizard-model'], function ($, ko, ViewModel) {
... snip ...
});

非動作シーケンスでは、require.js の前に add-report.js が要求され (require.js がロードされた後に非決定論的なロード順序が適用されると予想していました)、ノックアウトと jquery の両方 (両方とも AMD サポートが組み込まれています)に注意してください。間違ったファイル名でリクエストされています。add-report の前に require が要求され、ノックアウトと jquery のファイル名がまだ間違っている他のシーケンスを確認しました。リクエストの間に私が行っている唯一のことは、ブラウザーを更新することです (一度機能すると、機能し続ける傾向があり、壊れると壊れたままになる傾向があることにも注意してください)。外してみましたurlArgs構成から、まだ同じ問題を観察します。この特定のページでは、jquery.tokeninput は使用されていません。構成ファイルから削除しても、効果はないようです。

この時点で、RequireJS は私にとってまったく信頼できず、現在の状態でコードを本番環境にリリースすることはできません。RequireJS を非常にうまく使用しているように見える人の数を考えると、問題は私のコードのどこかにあるとしか思えませんが、それがどこにあるのかはわかりません。

私が間違っていた可能性のある提案はありますか?ありがとう。

編集: 要求に応じて、knockout.mapping-latest.debug.js からの抜粋:

// Module systems magic dance.

if (typeof require === "function" && typeof exports === "object" && typeof module === "object") {
    // CommonJS or Node: hard-coded dependency on "knockout"
    factory(require("knockout"), exports);
} else if (typeof define === "function" && define["amd"]) {
    // AMD anonymous module with hard-coded dependency on "knockout"
    define(["knockout", "exports"], factory);
} else {
    // <script> tag: use the global `ko` object, attaching a `mapping` property
    factory(ko, ko.mapping = {});
}
4

2 に答える 2

2

次のようにファイルをリクエストすると:

<script src="/AnswersDev/Scripts/require.js" data-main="/AnswersDev/Scripts/main"></script>
<script type="text/javascript">
    require(['Views/add-report']);
</script>

スクリプトの前にインラインのrequireが呼び出されるmain.js可能性があります(正しく理解できれば、構成はどこにありますか)。

したがって、すべてファイルからロードする必要がありmain.jsます。configdepsオプションを使用して、いくつかのファイルをロードできます。または、それらをすべてインラインで含めることもできますが、それでは目的が果たせません。

于 2013-01-15T19:52:25.347 に答える
0

これは私が今取り組んでいるものです (サイモンに感謝します)。

tl;dr バージョン: require<head> のグローバル var に構成を作成し、通常どおりページ固有の module/require.js を含めます。

main.js:

var require = {
    baseUrl: '/Scripts',
    paths: {
        jquery: 'jquery-1.8.3.min',
        knockout: 'knockout-2.2.0',
        komapping: 'knockout.mapping-latest',
        token: 'jquery.tokeninput'
    },
    shim: {
        'token': ['jquery']
    }
};

レポートを追加:

<head>
    ...
    <script src="/Scripts/main.js" type="text/javascript"></script>
</head>
<body>
    ...
    <script src="/Scripts/require.js" data-main="Views/add-report.js"></script>
于 2013-01-15T21:31:46.830 に答える