あなたはどう思いますか
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を認識している場合は、それをロードしようとします。