Bạn đang tự hỏi làm thế nào
Module_Name/js/path/to/module
trở thành
//magento.example.com/static/frontend/Package/Theme/locale/Module_Name/js/path/to/module.js
Trước hết, điều quan trọng là phải hiểu rằng đây hoàn toàn là yêu cầuJS, không phải bất kỳ loại nước sốt đặc biệt nào của Magento (mặc dù có một số thứ khác ở nơi khác). Đối với hầu hết các phần, front-end chỉ sử dụng hành vi bình thường của RequireJS. Điều kỳ diệu thường là cách nó tạo ra pub/static
, cụ thể là cách liên view/area/web/js/path/to/module.js
kết với nhau pub/static/area/Package/theme/Module_Name/js/path/to/module.js
. Điều này được xử lý bởi quy trình biên dịch tài sản tĩnh của Magento và tôi không đi sâu vào đây.
requirejs-config.js
Hãy giới thiệu một tập tin mới mà bạn đề cập : requirejs-config.js
. Đây là một số nước sốt đặc biệt Magento 2, nhưng có lẽ không nhiều như bạn nghĩ.
Tệp này có thể là bất kỳ JavaScript nào, nhưng ít nhất nên khai báo một biến (toàn cầu) được gọi config
. Đối tượng bị ràng buộc config
được truyền trực tiếp đến requestJS để cấu hình nó.
Cách thức hoạt động này là Magento tìm thấy tất cả requirejs-config.js
trong một dự án. Đây có thể là trong một mô-đun, dưới view/area
, hoặc trong một chủ đề, trong thư mục gốc của nó, và trong override mô-đun của một chủ đề, ví dụ Magento_Catalog/requirejs-config.js
. Lưu ý rằng điều này không bao gồm bất kỳ con của một web
thư mục. Nói chung, tập tin này nên là anh chị em với một web
thư mục.
Sau khi được toàn cầu hóa, mỗi tệp được trang trí trong một bao đóng (vì vậy biến toàn cục của chúng ta thực sự không có) và một dòng ở cuối bao đóng chuyển config
biến cho require
đối tượng. Điều này có thể được nhìn thấy:
Đây là 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'
}
}
};
Khi đến mặt trước, nó sẽ trông như thế này:
(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);
})();
Trang trí này có thể được nhìn thấy trong Magento\Framework\RequireJs\Config
.
Mỗi tập tin được trang trí này được nối và đổ vào static/_requirejs/area/Package/theme/locale/secure/requirejs-config.js
. Vị trí này được thỏa thuận trước thời hạn, do đó HTML tải tập lệnh này khi nó yêu cầuJS:
<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>
Tôi xem xét cách cấu hình RequireJS ngoài phạm vi cho câu trả lời này, nhưng họ có tài liệu khá tốt về điều này . Có hai điều quan trọng cần lưu ý:
- Các cuộc gọi liên tiếp
require.config
sẽ xếp các đối tượng chồng lên nhau, do đó, lần viết cuối cùng sẽ thắng. Họ không thay thế, đó là rất quan trọng.
- Có một cấu hình ở đầu cấu hình này đặt baseUrl. Đây không phải là trong một
requirejs-config.js
. Điều này được chèn vào thời gian biên dịch bởi Magento\Framework\RequireJs\Config
.
Quên một lúc làm thế nào Magento làm việc mà các mô-đun RequireJS cần tải (một cuộc thảo luận tốt cho một lần khác, có lẽ; Như một gợi ý, hãy nhìn vào mage/apply/main.js
), giả sử chúng ta có mã:
require(['modulename'], function () {});
trong chân không ở đâu đó Làm thế nào để Magento biết phải làm gì?
Chà, điều đầu tiên đòi hỏiJS sẽ làm là tìm kiếm modulename
trong bản đồ của nó. Trong trường hợp của chúng tôi, nó sẽ học được rằng nó nên coi tất cả các yêu cầu modulename
là một yêu cầu Module_Name/js/path/to/module
. Nó chỉ làm điều này một lần. Ánh xạ không được đệ quy. Tôi lặp lại. Nếu bạn có một ánh xạ từ a
đến b
và từ b
đến a
, điều này sẽ trao đổi từng yêu cầu và sẽ không gây ra một vòng lặp vô hạn.
Khi chúng tôi đã trải qua bản đồ brouhaha, RequireJS xem xét những gì nó có. Nếu nó kết thúc .js
và không giống như một liên kết tuyệt đối hoặc một URL, nó sẽ thêm vào tập lệnh được cấu hình baseUrl
và tải tập lệnh đó thông qua các thủ tục thông thường của nó. Nếu nó không kết thúc .js
và không phải là một liên kết hoặc URL tuyệt đối, nó sẽ thêm .js
vào cuối, sau đó thêm vào cấu hình baseUrl
và tải thông qua các thủ tục thông thường của nó. Nếu requestJS cho rằng nó có URL, nó chỉ cố tải nó.