Dans Magento 2, vous pouvez utiliser RequireJS pour inclure un module javascript avec du code qui ressemble à ceci.
#File: app/code/Package/Name/view/frontend/requirejs-config.js
var config = {
map: {
'*': {
modulename: 'Package_Name/js/path/to/file'
}
}
}
Bien que le requirejs-config.js
fichier soit un peu de magie Magento 2, cela semble être le RequireJS standard. Vous mappez essentiellement le nom court modulename
au module javascript nommé Package_Name/js/path/to/file
.
Ce qui n'est pas clair, c'est où ou comment Magento 2 convertit le nom du module javascript ci-dessus
Package_Name/js/path/to/file
Dans l'URL HTTP (S)
//magento.example.com/static/frontend/Magento/luma/en_US/Package_Name/js/path/to/file.js
Dans un système Stock RequireJS, RequireJS essaierait de charger l'URL suivante
//magento.example.com/Package_Name/js/path/to/file.js
Il est donc clair que Magento fait quelque chose pour s'assurer que l'URL ci-dessus est convertie en URL frontend Magento. Ce qui n'est pas clair, c'est
- Où cela se produit (couche PHP? Couche Javascript?)
- Quelle est la règle pour cette conversion. Le module RequireJS ne ressemble pas à un identifiant de fichier Magento standard (
Package_Name::js/path/to/file
)
Alors, comment / où Magento 2 / RequireJS convertit-il le module en chemin.
la source
baseUrl
- requirejs.org/docs/api.html#config-baseUrl et pour le faire fonctionner correctement, ilbaseUrl
est égal à//magento.example.com/static/frontend/Magento/luma/en_US/
la page. RequireJS le concatène simplement avec le chemin du module://magento.example.com/static/frontend/Magento/luma/en_US/ + Package_Name/js/path/to/file -> //magento.example.com/static/frontend/Magento/luma/en_US/Package_Name/js/path/to/file
et ajoute.js
.baseUrl
est généré - github.com/magento/magento2/blob/develop/app/code/Magento/Theme/…//magento.example.com/static/frontend/Magento/luma/en_US/
. Ajoutez-Package_Name/js/path/to/file.js
y et vous aurez l'URL complète. Je pense que c'est ce que vous recherchez; github.com/magento/magento2/blob/develop/lib/web/requirejs/…Vous vous demandez comment
Module_Name/js/path/to/module
devient
//magento.example.com/static/frontend/Package/Theme/locale/Module_Name/js/path/to/module.js
Tout d'abord, il est important de comprendre que c'est entièrement nécessaire JS, pas de sauce spéciale Magento (bien qu'il y en ait ailleurs). Pour la plupart, le front-end utilise uniquement le comportement normal de RequireJS. La magie réside généralement dans la façon dont elle génère
pub/static
, à savoir commentview/area/web/js/path/to/module.js
est lié à un lien symboliquepub/static/area/Package/theme/Module_Name/js/path/to/module.js
. Ceci est géré par le processus de compilation des actifs statiques de Magento, et je ne vais pas y entrer ici.requirejs-config.js
Introduisons un nouveau fichier, que vous mentionnez:
requirejs-config.js
. Il s'agit d'une sauce spéciale Magento 2, mais probablement pas autant que vous ne le pensez.Ce fichier peut être n'importe quel JavaScript, mais devrait au moins déclarer une variable (globale) appelée
config
. L'objet lié àconfig
est transmis directement à requireJS pour le configurer.La façon dont cela fonctionne est que Magento trouve tout
requirejs-config.js
dans un projet. Ceux-ci peuvent être dans un module, sousview/area
ou dans un thème, dans son répertoire racine, et dans la substitution de module d'un thème, par exempleMagento_Catalog/requirejs-config.js
. Notez que cela n'inclut aucun enfant d'unweb
répertoire. Ce fichier devrait en général être le frère d'unweb
répertoire.Une fois globlé, chaque fichier est décoré dans une fermeture (donc notre variable globale ne l'est pas), et une ligne à la fin de la fermeture transmet la
config
variable à l'require
objet. Cela se voit:C’est
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' } } };
Quand il arrive au front-end, il ressemblera à ceci:
(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); })();
Cette décoration peut être vue dans
Magento\Framework\RequireJs\Config
.Chacun de ces fichiers décorés est concaténé et jeté
static/_requirejs/area/Package/theme/locale/secure/requirejs-config.js
. Cet emplacement est convenu à l'avance, de sorte que le code HTML charge ce script comme il charge 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>
Je considère comment configurer RequireJS hors de portée pour cette réponse, mais ils ont une assez bonne documentation à ce sujet . Il y a cependant deux choses importantes à noter:
require.config
superposeront les objets les uns sur les autres, donc la dernière écriture l'emportera. Ils ne remplacent pas, ce qui est crucial.requirejs-config.js
. Il est inséré au moment de la compilation parMagento\Framework\RequireJs\Config
.Oubliant un instant comment Magento détermine quels modules RequireJS doivent être chargés (une bonne discussion pour une autre fois, peut-être; comme indice, regardez dans
mage/apply/main.js
), supposons que nous avons le code:require(['modulename'], function () {});
quelque part dans le vide. Comment Magento sait-il quoi faire?
Eh bien, la première chose que requireJS fera sera de rechercher
modulename
dans son mappage. Dans notre cas, il apprendra qu'il doit traiter toutes les demandesmodulename
comme une demandeModule_Name/js/path/to/module
. Il ne fait cela qu'une seule fois. Les mappages ne sont pas récursifs. Je répète. Si vous avez un mappage dea
àb
et deb
àa
, cela permutera chaque demande et ne provoquera pas de boucle infinie.Une fois que nous avons parcouru la cartographie brouhaha, RequireJS regarde ce qu'il a. S'il se termine
.js
et ne ressemble pas à un lien absolu ou à une URL, il ajoutera lebaseUrl
script configuré et chargera ce script via ses procédures normales. S'il ne se termine pas.js
et n'est pas un lien ou une URL absolu, il ajoutera.js
à la fin, puis ajoutera la configurationbaseUrl
et chargera ses procédures normales. Si requireJS estime qu'il a une URL, il essaie simplement de la charger.la source
Il utilise les composants plus en détail, vous vérifiez la classe Magento \ Framework \ View \ Element \ Js \ Components et le fournisseur de fichiers de module par défaut \ magento \ module-catalog \ view \ frontend \ layout \ default.xml
la source