Что делает тег «исключить» в файле view.xml Magento 2

17

«Пустая» тема Magento 2 включает следующую иерархию тегов.

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

Для чего это здесь. то есть что исключено из чего? Где и когда системный код Magento 2 получает доступ к этой информации?

Алан Сторм
источник
5
Это оценивается там же, где мы исключили вас из этой информации, Алан.
отметки
6
@benmarks Отстранение от деталей реализации конкретной системы заставляет меня чувствовать себя ближе к большинству сотрудников Magento Inc.;)
Алан Сторм

Ответы:

10

Magento 2 поддерживает пакетирование файлов js / html. <exclude>узел определяет список ресурсов, которые не должны быть связаны. смотрите \Magento\Framework\View\Asset\Bundle\Managerдля деталей

Канди
источник
2
Пакетирование? Что это обозначает? Magento поддерживает менеджер пакетов ruby?
Алан Шторм
«Объединение» означает объединение нескольких ресурсов в один пакет / файл. Это улучшение производительности внешнего интерфейса за счет уменьшения количества запросов к серверу.
Канди
К какой комплектации относится исключение? Кажется, есть несколько мест, где Magento «связывает» внешние ресурсы.
Алан Шторм
Я предполагаю, что если это файл .js, он будет загружаться отдельно. Если это не исключено, оно будет объединено в JS-файл, как мы привыкли с опцией JS Merge в M1. Если каталог исключен, все файлы в этом каталоге будут загружены по отдельности.
Питер Яап Блаакмир
Обновить; этот метод подтверждает мое подозрение; github.com/magento/magento2/blob/…
Питер Яап Блаакмир
9

Эта конфигурация доступна при выполнении команды

bin/magento setup:static-content:deploy

В функции \Magento\Deploy\Model\Deployer::deployFileинтерес представляют следующие два вызова:

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

Первый вызов добавит файл ресурсов в файловую систему. Я не уверен, что именно делает второй звонок. Вот где я заблудился.

Однако, если вы выполните этот второй вызов, вы найдете некоторые функции проверки, которые в конечном итоге приводят к

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

Но здесь есть несколько вопросов.

Во-первых, \Magento\Framework\Config\View::getItemsкажется , что функция всегда возвращает пустой массив.

Во-вторых, функция \Magento\Framework\View\Asset\Bundle\Manager::isExcludedFileвсегда вернетfalse

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

Так как $asset->getSourceFile() это абсолютный путь к файлу ресурса, а $filePathInfo['excludedPath']это относительный путь.

Итак, насколько я вижу, <exclude>конфигурация не будет работать в любом случае. Но если это сработает, актив будет исключен из \Magento\Framework\View\Asset\Bundle.

Vicky
источник