O que a tag "excluir" no arquivo view.xml do Magento 2 faz

17

O tema "em branco" do Magento 2 inclui a seguinte hierarquia de tags.

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

Para que é isso aqui? ou seja, o que está sendo excluído do quê? Onde e quando o código do sistema Magento 2 acessa essas informações?

Alan Storm
fonte
5
É avaliado no mesmo local em que o excluímos desta informação, Alan.
benmarks
6
@benmarks ser excluído os detalhes da implementação de um sistema particular faz-me sentir mais perto da maioria dos funcionários de Magento Inc.;)
Alan Storm

Respostas:

10

O Magento 2 suportou o pacote de arquivos js / html. <exclude>O nó define a lista de recursos que não devem ser agrupados. veja \Magento\Framework\View\Asset\Bundle\Managerpara detalhes

KAndy
fonte
2
Agrupando? O que isso significa? Magento suporta um gerenciador de pacotes ruby?
Alan Storm
'Agrupar' significa combinar vários recursos em um único pacote / arquivo. É uma melhoria de desempenho de front-end, diminuindo a quantidade de solicitações para o servidor.
precisa saber é o seguinte
A qual pacote exclui se aplica? Parece haver vários lugares em que o Magento "agrupa" recursos de front-end.
Alan Storm
Suponho que se for um arquivo .js, ele será carregado individualmente. Se não for excluído, ele será mesclado em um arquivo JS como estamos acostumados com a opção JS Merge no M1. Se um diretório for excluído, todos os arquivos nesse diretório serão carregados individualmente.
Peter Jaap Blaakmeer
Atualizar; esse método confirma minha suspeita; github.com/magento/magento2/blob/…
Peter Jaap Blaakmeer
9

Essa configuração é acessada quando você executa o comando

bin/magento setup:static-content:deploy

Na função \Magento\Deploy\Model\Deployer::deployFile, as duas chamadas a seguir são interessantes:

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

A primeira chamada adicionará o arquivo do ativo ao sistema de arquivos. Não sei ao certo o que a segunda chamada faz exatamente. É aí que eu estou me perdendo.

No entanto, se você seguir esta segunda chamada, encontrará algumas funções de validação, que eventualmente levarão a

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

Mas, existem alguns problemas aqui.

Primeiro, a função \Magento\Framework\Config\View::getItemssempre parece retornar uma matriz vazia.

Segundo, a função \Magento\Framework\View\Asset\Bundle\Manager::isExcludedFilesempre retornará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;
}

Porque $asset->getSourceFile()é o caminho absoluto para o arquivo do ativo, enquanto $filePathInfo['excludedPath']é um caminho relativo.

Então, até onde eu posso ver, a <exclude>configuração não funcionará de qualquer maneira. Mas se funcionasse, o ativo seria excluído do \Magento\Framework\View\Asset\Bundle.

Vicky
fonte