Was bewirkt das "exclude" -Tag in der view.xml-Datei von Magento 2?

17

Das "leere" Thema von Magento 2 enthält die folgende Tag-Hierarchie.

<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>

Wofür ist das hier? dh was wird von was ausgeschlossen? Wo und wann greift der Magento 2-Systemcode auf diese Informationen zu?

Alan Storm
quelle
5
Es wird an derselben Stelle ausgewertet, an der wir Sie von diesen Informationen ausgeschlossen haben, Alan.
Benmarks
6
@benmarks Ausgenommen von den Implementierungsdetails eines bestimmten Systems fühle ich mich den meisten Mitarbeitern von Magento Inc. näher;)
Alan Storm

Antworten:

10

Magento 2 unterstützte das Bündeln von js / html-Dateien. <exclude>Knoten definiert eine Liste von Ressourcen, die nicht gebündelt werden sollen. siehe \Magento\Framework\View\Asset\Bundle\Managerfür weitere Einzelheiten

KAndy
quelle
2
Bündelung? Was bedeutet das? Magento unterstützt einen Ruby-Paketmanager?
Alan Storm
Bündelung bedeutet, dass mehrere Ressourcen in einem Paket / einer Datei zusammengefasst werden. Dies ist eine Verbesserung der Frontend-Leistung, indem die Anzahl der Anfragen an den Server verringert wird.
KAndy
Für welche Bündelung gilt Ausschluss? Es scheint mehrere Stellen zu geben, an denen Magento Frontend-Assets "bündelt".
Alan Storm
Ich vermute, wenn es eine .js-Datei ist, wird sie einzeln geladen. Wenn dies nicht ausgeschlossen ist, wird es in einer JS-Datei zusammengeführt, wie wir es von der JS-Merge-Option in M1 gewohnt sind. Wenn ein Verzeichnis ausgeschlossen wird, werden alle Dateien in diesem Verzeichnis einzeln geladen.
Peter Jaap Blaakmeer
Aktualisieren; diese Methode bestätigt meinen Verdacht; github.com/magento/magento2/blob/…
Peter Jaap Blaakmeer
9

Auf diese Konfiguration wird zugegriffen, wenn Sie den Befehl ausführen

bin/magento setup:static-content:deploy

In der Funktion \Magento\Deploy\Model\Deployer::deployFilesind folgende zwei Aufrufe von Interesse:

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

Beim ersten Aufruf wird die Asset-Datei zum Dateisystem hinzugefügt. Ich bin nicht sicher, was der zweite Anruf genau macht. Dort verliere ich mich.

Wenn Sie jedoch diesem zweiten Aufruf folgen, werden Sie einige Validierungsfunktionen finden, die letztendlich dazu führen

// \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'] : [];
}

Hier gibt es jedoch einige Probleme.

Erstens \Magento\Framework\Config\View::getItemsscheint die Funktion immer ein leeres Array zurückzugeben.

Zweitens \Magento\Framework\View\Asset\Bundle\Manager::isExcludedFilekehrt die Funktion immer zurückfalse

/**
 * 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;
}

Denn $asset->getSourceFile()ist der absolute Pfad zur Asset-Datei, während $filePathInfo['excludedPath']es sich um einen relativen Pfad handelt.

Also, soweit ich das sehe wird die <exclude>Konfiguration sowieso nicht funktionieren. Aber wenn es funktionieren würde, würde der Vermögenswert aus dem ausgeschlossen werden \Magento\Framework\View\Asset\Bundle.

Vicky
quelle