조건부 RequireJs 구성 (프로그래밍 방식으로 requirejs-config.js를로드 하시겠습니까?)


15

특정 조건 (예 : 구성 기반)에서만 RequireJs 구성 요소를 교체하고 싶습니다. 프로그래밍 방식으로 모듈로드를 막 requirejs-config.js거나 다른 방법으로 모듈을로드하지 못하게하는 방법이 있습니까?


1
이 문제에 대한 해결책을 찾았습니까?
stevensagaar

@stevensagaar 불행히도 아닙니다
Fabian Schmengler

2
하나를 찾으면 여기에 답변을 추가하겠습니다
Fabian Schmengler

3
@Alex 2.2 또는 2.3에 대한 해결책이 있다면 기뻐할 것입니다 : D 태그를 업데이트했습니다. 현상금에 감사드립니다!
Fabian Schmengler 님이

2
vendor / magento / framework / RequireJs / Config.php에서 getConfig 함수를 다시 작성하거나 requirejs requirejs.js / docs / plugins.html
Arshad M

답변:


5

@Arshad M 주석을 기반으로 다음을 사용하여 di.xml을 추가 할 수 있습니다.

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

그리고 <Vendor> \ <ModuleName> \ RequireJs \ Config.php에서 getConfig 함수를 재정 의하여 requirejs를로드하지 않으려는 모듈 이름과 조건을 추가하십시오 (아마도 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;
    }
}

최신 정보

@Alex 및 @Daniel의 주석 후 : Magento \ Framework \ RequireJs \ Config \ File \ Collector \ Aggregated에서 getFiles에 대한 플러그인을 만들 수 있으므로이 접근법을 사용하는 새로운 di.xml은 다음과 같습니다.

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

\ <Vendor> \ <ModuleName> \ Plugin \ RequireJs \ AfterFiles에서 requirejs가로드되지 않도록 조건과 모듈을 설정할 수 있습니다.

<?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;
    }
}

좋은! $ fullConfig = parent :: getConfig ()를 통해 개선 할 수 있고 $ fullConfig를 수정하여 적은 코드를 복사하여 붙여 넣을 수 있다고 생각합니다. 어떻게 생각해? 아마도 우리는 이것을 위해 github에서 미니 FOSS 모듈을 만들어야합니까?
Alex

1
아니면 대신 $ this-> fileSource-> getFiles을 다시 쓸 수 있습니까? 많은 코드로 복사하지 않으려면 ...
Alex

3
@Alex 조건부로드를 달성하기 위해 플러그인을 사용하거나 aroundGetConfig()또는 afterGetConfig()메소드를 사용할 수도 있습니다. 그러면 덮어 쓸 필요가 없습니다.
Daniel

유망 해 보인다, 고마워! 나는 이미 upvoted, 답변을 수락하기 전에 최대한 빨리 그것을 시도합니다
Fabian Schmengler

2
@Alex 제안에 따라 github에서 작은 모듈을 만들었습니다. 여기서 magento 백엔드를 통해 requirejs를 비활성화 할 모듈을 선택할 수 있습니다. 그것을 확인하고 어쩌면 공헌 github.com/MNGemignani/magento2_requirejs_disable
gemig_hol
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.