À quoi sert la balise «exclude» dans le fichier view.xml de Magento 2

17

Le thème "vierge" de Magento 2 comprend la hiérarchie de balises suivante.

<exclude>
    <item type="file">Lib::jquery/jquery-ui-1.9.2.js</item>
    <item type="file">Lib::jquery/jquery.ba-hashchange.min.js</item>
    <item type="file">Lib::jquery/jquery.details.js</item>
    <item type="file">Lib::jquery/jquery.details.min.js</item>
    <item type="file">Lib::jquery/jquery.hoverIntent.js</item>
    <item type="file">Lib::jquery/jquery.min.js</item>
    <item type="file">Lib::mage/captcha.js</item>
    <item type="file">Lib::mage/dropdown_old.js</item>
    <item type="file">Lib::mage/list.js</item>
    <item type="file">Lib::mage/loader_old.js</item>
    <item type="file">Lib::mage/webapi.js</item>
    <item type="file">Lib::moment.js</item>
    <item type="file">Lib::requirejs/require.js</item>
    <item type="file">Lib::date-format-normalizer.js</item>
    <item type="file">Lib::legacy-build.min.js</item>
    <item type="directory">Lib::modernizr</item>
    <item type="directory">Lib::tiny_mce</item>
    <item type="directory">Lib::varien</item>
    <item type="directory">Lib::jquery/editableMultiselect</item>
    <item type="directory">Lib::jquery/jstree</item>
    <item type="directory">Lib::jquery/fileUploader</item>
    <item type="directory">Lib::css</item>
    <item type="directory">Lib::lib</item>
    <item type="directory">Lib::extjs</item>
    <item type="directory">Lib::prototype</item>
    <item type="directory">Lib::scriptaculous</item>
    <item type="directory">Lib::mage/requirejs</item>
    <item type="directory">Lib::mage/adminhtml</item>
    <item type="directory">Lib::mage/backend</item>
    <item type="directory">Magento_Swagger::swagger-ui</item>
</exclude>

Qu'est-ce que c'est ici? c'est-à-dire ce qui est exclu de quoi? Où et quand le code système de Magento 2 accède-t-il à ces informations?

Alan Storm
la source
5
C'est évalué au même endroit où nous vous avons exclu de ces informations, Alan.
benmarks
6
@benmarks Être exclu des détails de mise en œuvre d'un système particulier me fait me sentir plus proche de la plupart des employés de Magento Inc.;)
Alan Storm

Réponses:

10

Magento 2 a pris en charge le regroupement de fichiers js / html. <exclude>le nœud définit la liste des ressources qui ne doivent pas être regroupées. voir \Magento\Framework\View\Asset\Bundle\Managerpour plus de détails

KAndy
la source
2
Regroupement? Qu'est-ce que ça veut dire? Magento prend en charge un gestionnaire de packages ruby?
Alan Storm
«Regroupement» signifie la combinaison de plusieurs ressources en un seul package / fichier. Il s'agit d'une amélioration des performances frontales en diminuant la quantité de requêtes vers le serveur.
KAndy
À quel groupement l'exclusion s'applique-t-elle? Il semble y avoir plusieurs endroits où Magento regroupe les ressources frontales.
Alan Storm
Je suppose que si c'est un fichier .js, il se chargera individuellement. S'il n'est pas exclu, il sera fusionné dans un fichier JS comme nous en avons l'habitude avec l'option JS Merge dans M1. Si un répertoire est exclu, tous les fichiers de ce répertoire seront chargés individuellement.
Peter Jaap Blaakmeer
Mise à jour; cette méthode confirme ma suspicion; github.com/magento/magento2/blob/…
Peter Jaap Blaakmeer
9

Cette configuration est accessible lorsque vous exécutez la commande

bin/magento setup:static-content:deploy

Dans la fonction \Magento\Deploy\Model\Deployer::deployFile, les deux appels suivants sont intéressants:

$this->assetPublisher->publish($asset);
$this->bundleManager->addAsset($asset);

Le premier appel ajoutera le fichier d'actif au système de fichiers. Je ne sais pas exactement ce que fait le deuxième appel. C'est là que je me perds.

Cependant, si vous suivez ce deuxième appel, vous trouverez quelques fonctions de validation, qui conduiront éventuellement à

// \Magento\Framework\Config\View

/**
 * Get excluded file list
 *
 * @return array
 */
public function getExcludedFiles()
{
    $items = $this->getItems();
    return isset($items['file']) ? $items['file'] : [];
}

/**
 * Get excluded directory list
 *
 * @return array
 */
public function getExcludedDir()
{
    $items = $this->getItems();
    return isset($items['directory']) ? $items['directory'] : [];
}

/**
 * Get a list of excludes
 *
 * @return array
 */
protected function getItems()
{
    $this->initData();
    return isset($this->data['exclude']) ? $this->data['exclude'] : [];
}

Mais, il y a quelques problèmes ici.

Tout d'abord, la fonction \Magento\Framework\Config\View::getItemssemble toujours renvoyer un tableau vide.

Deuxièmement, la fonction \Magento\Framework\View\Asset\Bundle\Manager::isExcludedFilereviendra toujoursfalse

/**
 * Check if asset file is excluded
 *
 * @param string $filePath
 * @param LocalInterface $asset
 * @return bool
 */
protected function isExcludedFile($filePath, $asset)
{
    /** @var $asset LocalInterface */
    $filePathInfo = $this->splitPath($filePath);
    if ($filePathInfo && $this->compareModules($filePathInfo, $asset)) {
        return $asset->getSourceFile() == $filePathInfo['excludedPath'];
    }
    return false;
}

Car $asset->getSourceFile()est le chemin absolu du fichier d'actif, tandis que $filePathInfo['excludedPath']est un chemin relatif.

Donc, pour autant que je puisse voir, la <exclude>configuration ne fonctionnera pas de toute façon. Mais si cela fonctionnait, l'actif serait exclu du \Magento\Framework\View\Asset\Bundle.

Vicky
la source