あなたはどう思いますか
Module_Name/js/path/to/module
なる
//magento.example.com/static/frontend/Package/Theme/locale/Module_Name/js/path/to/module.js
まず第一に、これは完全にrequireJSであり、Magentoの特別なソースではないことを理解することが重要です(他にもいくつかあります)。ほとんどの場合、フロントエンドはRequireJSの通常の動作のみを使用します。魔法は通常、それがどのように生成されるかpub/static、つまりどのようview/area/web/js/path/to/module.jsにシンボリックリンクされるかにありpub/static/area/Package/theme/Module_Name/js/path/to/module.jsます。これはMagentoの静的アセットのコンパイルプロセスで処理されるため、ここでは説明しません。
requirejs-config.js
あなたが言及する新しいファイルを紹介しましょう:requirejs-config.js。これはMagento 2の特別なソースですが、おそらくあなたが思うほど多くはありません。
このファイルは任意のJavaScriptにすることができますが、少なくとも(グローバル)変数を宣言する必要がありますconfig。バインドされたオブジェクトconfigは、それを構成するためにrequireJSに直接渡されます。
これが機能する方法は、Magentoがrequirejs-config.jsプロジェクト内のすべてを見つけることです。これらは、モジュール内、の下view/area、またはテーマ内、ルートディレクトリ内、テーマのモジュールオーバーライド内などにありMagento_Catalog/requirejs-config.jsます。これにはwebディレクトリの子は含まれないことに注意してください。このファイルは、通常、webディレクトリの兄弟である必要があります。
globされると、各ファイルはクロージャーで装飾され(そのため、グローバル変数は実際にはそうではありません)、クロージャーの最後の行はconfig変数をrequireオブジェクトに渡します。これを見ることができます:
これはMagento_Checkout::view/frontend/requirejs-config.js:
/**
* Copyright © 2015 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
var config = {
map: {
'*': {
discountCode: 'Magento_Checkout/js/discount-codes',
shoppingCart: 'Magento_Checkout/js/shopping-cart',
regionUpdater: 'Magento_Checkout/js/region-updater',
opcOrderReview: 'Magento_Checkout/js/opc-order-review',
sidebar: 'Magento_Checkout/js/sidebar',
payment: 'Magento_Checkout/js/payment',
paymentAuthentication: 'Magento_Checkout/js/payment-authentication'
}
}
};
フロントエンドに到達すると、次のようになります。
(function() {
/**
* Copyright © 2015 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
var config = {
map: {
'*': {
discountCode: 'Magento_Checkout/js/discount-codes',
shoppingCart: 'Magento_Checkout/js/shopping-cart',
regionUpdater: 'Magento_Checkout/js/region-updater',
opcOrderReview: 'Magento_Checkout/js/opc-order-review',
sidebar: 'Magento_Checkout/js/sidebar',
payment: 'Magento_Checkout/js/payment',
paymentAuthentication: 'Magento_Checkout/js/payment-authentication'
}
}
};
require.config(config);
})();
この装飾はにありますMagento\Framework\RequireJs\Config。
これらの装飾された各ファイルは連結され、にダンプされstatic/_requirejs/area/Package/theme/locale/secure/requirejs-config.jsます。この場所は事前に合意されているため、HTMLはrequireJSを読み込むときにこのスクリプトを読み込みます。
<script type="text/javascript" src="https://magento.example.com/static/area/Package/theme/locale/requirejs/require.js"></script>
<script type="text/javascript" src="https://magento.example.com/static/_requirejs/area/Package/theme/locale/secure/requirejs-config.js"></script>
この回答の範囲外でRequireJSを構成する方法を検討していますが、これについてはかなり良いドキュメントがあります。ただし、注意すべき重要な点が2つあります。
- を連続して呼び出すと、
require.configオブジェクトが互いの上に重ねられるため、最後の書き込みが優先されます。それらは置き換えられません、これは重要です。
- この構成の上部には、baseUrlを設定する構成が1つあります。これはにありません
requirejs-config.js。これは、コンパイル時にによって挿入されますMagento\Framework\RequireJs\Config。
MagentoがどのRequireJSモジュールをロードする必要があるかを少しの間忘れてしまいます(別の機会に良い議論になるかもしれません。ヒントとして、を見てくださいmage/apply/main.js)、次のコードがあるとします。
require(['modulename'], function () {});
どこかに真空で。Magentoはどうすればよいかをどのようにして知るのですか?
まあ、requireJSが最初に行うことはmodulename、そのマッピングを調べることです。私たちのケースでは、へのすべてのリクエストをへのリクエストmodulenameとして扱う必要があることがわかりますModule_Name/js/path/to/module。これを行うのは1回だけです。マッピングは再帰的ではありません。繰り返します。あなたからのマッピングを持っている場合aにb、そしてからbのa、これは各要求を交換し、無限ループを引き起こすことはありません。
マッピング問題を通過すると、RequireJSはそれが何であるかを調べます。末尾がで.js、絶対リンクまたはURLのように見えない場合は、構成済みの先頭に追加され、baseUrl通常の手順でそのスクリプトをロードします。末尾.jsがなく、絶対リンクまたはURLでない場合.js、末尾に追加され、構成済みの先頭に追加されbaseUrlて、通常の手順で読み込まれます。requireJSがURLを認識している場合は、それをロードしようとします。