Apa yang dilakukan oleh tag "kecualikan" dalam file view.xml Magento 2

17

Tema Magento 2 "kosong" mencakup hierarki tag berikut.

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

Untuk apa ini. yaitu apa yang dikecualikan dari apa? Di mana dan kapan kode sistem Magento 2 mengakses informasi ini?

Alan Storm
sumber
5
Itu dievaluasi di tempat yang sama di mana kami mengecualikan Anda dari informasi ini, Alan.
Tanda
6
@benmarks Dikecualikan dari detail implementasi sistem tertentu membuat saya merasa lebih dekat dengan sebagian besar karyawan Magento Inc.;)
Alan Storm

Jawaban:

10

Magento 2 mendukung bundling file js / html. <exclude>simpul menentukan daftar sumber daya yang tidak boleh dibundel. lihat \Magento\Framework\View\Asset\Bundle\Managerdetailnya

KAndy
sumber
2
Bundling? Apa artinya? Magento mendukung manajer paket ruby?
Alan Storm
'Bundling' berarti menggabungkan banyak sumber daya ke dalam satu paket / file. Ini adalah peningkatan kinerja frontend dengan mengurangi jumlah permintaan ke server.
KAndy
Bundling mana yang tidak termasuk berlaku untuk? Tampaknya ada beberapa tempat Magento "bundel ke atas" aset frontend.
Alan Storm
Saya menduga jika ini file .js, ini akan memuatnya secara individual. Jika tidak dikecualikan, itu akan digabung dalam file JS seperti kita terbiasa dengan opsi JS Merge di M1. Jika dir tidak termasuk, semua file dalam dir itu akan dimuat secara individual.
Peter Jaap Blaakmeer
Memperbarui; metode ini menegaskan kecurigaan saya; github.com/magento/magento2/blob/…
Peter Jaap Blaakmeer
9

Konfigurasi ini diakses ketika Anda menjalankan perintah

bin/magento setup:static-content:deploy

Dalam fungsi ini \Magento\Deploy\Model\Deployer::deployFile, dua panggilan berikut ini menarik:

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

Panggilan pertama akan menambahkan file aset ke sistem file. Saya tidak yakin apa yang dilakukan panggilan kedua dengan tepat. Di situlah saya tersesat.

Namun, jika Anda mengikuti panggilan kedua ini, Anda akan menemukan beberapa fungsi validasi, yang akhirnya mengarah ke

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

Tapi, ada beberapa masalah di sini.

Pertama, fungsi ini \Magento\Framework\Config\View::getItemssepertinya selalu mengembalikan array kosong.

Kedua, fungsi \Magento\Framework\View\Asset\Bundle\Manager::isExcludedFileakan selalu kembalifalse

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

Karena $asset->getSourceFile()adalah jalur absolut ke file aset, sedangkan $filePathInfo['excludedPath']jalur relatif.

Jadi, sejauh yang saya bisa lihat <exclude>konfigurasi tidak akan berhasil. Tetapi jika itu akan berhasil, aset akan dikeluarkan dari \Magento\Framework\View\Asset\Bundle.

Vicky
sumber