¿Qué hace la etiqueta "excluir" en el archivo view.xml de Magento 2?

17

El tema "en blanco" de Magento 2 incluye la siguiente jerarquía de etiquetas.

<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 qué es esto aquí? es decir, ¿qué se excluye de qué? ¿Dónde y cuándo accede el código del sistema Magento 2 a esta información?

Alan Storm
fuente
55
Se evalúa en el mismo lugar donde lo excluimos de esta información, Alan.
Benmarks
66
@benmarks Ser excluido de los detalles de implementación de un sistema en particular me hace sentir más cercano a la mayoría de los empleados de Magento Inc.;)
Alan Storm

Respuestas:

10

Magento 2 admite la agrupación de archivos js / html. <exclude>El nodo define la lista de recursos que no deben agruparse. ver \Magento\Framework\View\Asset\Bundle\Managerpara más detalles

Kandy
fuente
2
Paquete? Qué significa eso? ¿Magento admite un administrador de paquetes ruby?
Alan Storm
'Agrupar' significa combinar múltiples recursos en un solo paquete / archivo. Es una mejora del rendimiento de la interfaz al disminuir la cantidad de solicitudes al servidor.
KAndy
¿A qué paquete se aplica la exclusión? Parece que hay múltiples lugares donde Magento "agrupa" los activos frontend.
Alan Storm
Supongo que si es un archivo .js, lo cargará individualmente. Si no se excluye, se fusionará en un archivo JS como estamos acostumbrados con la opción JS Merge en M1. Si se excluye un directorio, todos los archivos en ese directorio se cargarán individualmente.
Peter Jaap Blaakmeer
Actualizar; Este método confirma mi sospecha; github.com/magento/magento2/blob/…
Peter Jaap Blaakmeer
9

Se accede a esta configuración cuando ejecuta el comando

bin/magento setup:static-content:deploy

En la función \Magento\Deploy\Model\Deployer::deployFile, las siguientes dos llamadas son de interés:

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

La primera llamada agregará el archivo de activos al sistema de archivos. No estoy seguro de qué hace exactamente la segunda llamada. Ahí es donde me estoy perdiendo.

Sin embargo, si sigue esta segunda llamada, encontrará algunas funciones de validación, que eventualmente conducen 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'] : [];
}

Pero, hay algunos problemas aquí.

Primero, la función \Magento\Framework\Config\View::getItemssiempre parece devolver una matriz vacía.

Segundo, la función \Magento\Framework\View\Asset\Bundle\Manager::isExcludedFilesiempre regresará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()es la ruta absoluta al archivo de activos, mientras que $filePathInfo['excludedPath']es una ruta relativa.

Entonces, hasta donde puedo ver, la <exclude>configuración no funcionará de todos modos. Pero si funcionara, el activo quedaría excluido de \Magento\Framework\View\Asset\Bundle.

Vicky
fuente