Configuración de RequireJs condicional (¿Cargar requirejs-config.js mediante programación?)

15

Me gustaría reemplazar un componente RequireJs solo en ciertas condiciones (por ejemplo, según la configuración). ¿Hay alguna forma de evitar mediante programación la carga de mi módulo requirejs-config.jso una forma diferente de lograrlo?

Fabian Schmengler
fuente
1
¿Encontraste la solución a este problema?
stevensagaar
@stevensagaar desafortunadamente no
Fabian Schmengler
2
Si encuentro una,
agregaré
3
@ Alex si hay una solución para 2.2 o 2.3, yo también estaría feliz: D actualizó las etiquetas. Además, gracias por la recompensa!
Fabian Schmengler
2
¿Has intentado reescribir la función getConfig en vendor / magento / framework / RequireJs / Config.php o necesitas escribir complementos en requirejs requirejs.org/docs/plugins.html?
Arshad M

Respuestas:

5

Según el comentario de @Arshad M, puede agregar un di.xml con:

    <?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">

    <preference for="Magento\Framework\RequireJs\Config" type="<Vendor>\<ModuleName>\RequireJs\Config"/>

</config>

Y en <Vendor> \ <ModuleName> \ RequireJs \ Config.php anula la función getConfig agregando su condición y el nombre del módulo que no desea que se cargue el requirejs (probablemente desde ScopeConfigInterface):

   <?php

namespace <Vendor>\<ModuleName>\RequireJs;

use Magento\Framework\Filesystem\File\ReadFactory;
use Magento\Framework\View\Asset\Minification;
use Magento\Framework\View\Asset\RepositoryMap;

class Config extends \Magento\Framework\RequireJs\Config
{
    /**
     * @var \Magento\Framework\RequireJs\Config\File\Collector\Aggregated
     */
    private $fileSource;
    /**
     * @var ReadFactory
     */
    private $readFactory;
    /**
     * @var \Magento\Framework\Code\Minifier\AdapterInterface
     */
    private $minifyAdapter;
    /**
     * @var Minification
     */
    private $minification;
    /**
     * @var \Magento\Framework\View\DesignInterface
     */
    private $design;

    public function __construct(\Magento\Framework\RequireJs\Config\File\Collector\Aggregated $fileSource, \Magento\Framework\View\DesignInterface $design, ReadFactory $readFactory, \Magento\Framework\View\Asset\Repository $assetRepo, \Magento\Framework\Code\Minifier\AdapterInterface $minifyAdapter, Minification $minification, RepositoryMap $repositoryMap)
    {
        parent::__construct($fileSource, $design, $readFactory, $assetRepo, $minifyAdapter, $minification, $repositoryMap);
        $this->fileSource = $fileSource;
        $this->readFactory = $readFactory;
        $this->minifyAdapter = $minifyAdapter;
        $this->minification = $minification;
        $this->design = $design;
    }

    public function getConfig()
    {
        $distributedConfig = '';
        $customConfigFiles = $this->fileSource->getFiles($this->design->getDesignTheme(), self::CONFIG_FILE_NAME);
        foreach ($customConfigFiles as $file) {
            //Your condition
            if(true){
                if($file->getModule() == "Vendor_ModuleName"){
                    continue;
                }
            }

            /** @var $fileReader \Magento\Framework\Filesystem\File\Read */
            $fileReader = $this->readFactory->create($file->getFileName(), \Magento\Framework\Filesystem\DriverPool::FILE);
            $config = $fileReader->readAll($file->getName());


            $distributedConfig .= str_replace(
                ['%config%', '%context%'],
                [$config, $file->getModule()],
                self::PARTIAL_CONFIG_TEMPLATE
            );
        }

        $fullConfig = str_replace(
            ['%function%', '%usages%'],
            [$distributedConfig],
            self::FULL_CONFIG_TEMPLATE
        );


        if ($this->minification->isEnabled('js')) {
            $fullConfig = $this->minifyAdapter->minify($fullConfig);
        }

        return $fullConfig;
    }
}

ACTUALIZAR

Después de los comentarios de @Alex y @Daniel: puede crear un complemento posterior para getFiles desde Magento \ Framework \ RequireJs \ Config \ File \ Collector \ Aggregated, por lo que el nuevo di.xml con este enfoque sería:

 <?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">

    <type name="Magento\Framework\RequireJs\Config\File\Collector\Aggregated">
        <plugin name="requirejsConfigPlugin"
                type="<Vendor>\<ModuleName>\Plugin\RequireJs\AfterFiles"
                sortOrder="100"
        />
    </type>
</config>

Y en \ <Vendor> \ <ModuleName> \ Plugin \ RequireJs \ AfterFiles, puede establecer su condición y módulo para que los requirejs no se carguen:

<?php

namespace <Vendor>\<ModuleName>\Plugin\RequireJs;

class AfterFiles
{
    public function afterGetFiles(
        \Magento\Framework\RequireJs\Config\File\Collector\Aggregated $subject,
        $result
    ){
        //Your condition
        if(true) {
            foreach ($result as $key => &$file) {
                //Module to exclude
                if ($file->getModule() == "Vendor_OtherModuleName") {
                    unset($result[$key]);
                }
            }
        }
        return $result;
    }
}
gemig_hol
fuente
¡Agradable! Creo que podríamos mejorar eso con $ fullConfig = parent :: getConfig () y luego modificar $ fullConfig para copiar y pegar menos código. ¿Qué piensas? ¿Quizás deberíamos hacer un mini módulo FOSS en github para esto?
Alex
1
¿O puede $ this-> fileSource-> getFiles ser reescrito en su lugar? Solo para no copiar mucho código ...
Alex
3
@Alex También podría usar un complemento y un método aroundGetConfig()o afterGetConfig()para lograr la carga condicional, entonces no tenemos que sobrescribirlo
Daniel
Parece prometedor, gracias! Ya voté, lo intentaré lo antes posible antes de aceptar la respuesta
Fabian Schmengler
2
@Alex siguiendo su sugerencia, hice un pequeño módulo en github, donde puede seleccionar los módulos para deshabilitar los requirejs a través del backend de magento. Compruébalo y quizás contribuyas con github.com/MNGemignani/magento2_requirejs_disable
gemig_hol