Magento 2: erfordernjs-config.js in Themes?

19

Ist es möglich, eine requirejs-config.jsDatei über ein Magento-Design einzuschließen (oder RequireJS anderweitig zu konfigurieren)? Oder ist die Fähigkeit für Magento-Module reserviert? Die dev docs-Informationen zur Themenstruktur sind in diesem Punkt nicht eindeutig.

In den Entwicklerdokumenten wird nichts über RequireJS erwähnt. In den Designs ist jedoch ein enthalten web, sodass Javascript mit ihnen gebündelt werden kann. Wenn Javascript mit einem Thema gebündelt werden kann, bedeutet dies, dass ein RequireJS-Modul mit einem Thema gebündelt werden kann, und wenn ein RequireJS-Modul mit einem Thema gebündelt werden kann, erfordert dieses Modul möglicherweise eine bestimmte RequireJS-Konfiguration.

Ich gehe naiv davon aus, dass Themen über diese Fähigkeit verfügen würden , aber ich konnte auf die eine oder andere Weise keine Dokumentation finden und habe keinen Nachmittag frei, um das erforderliche Code-Spelunking für Magentos requirejs-config.jsDatei durchzuführen, einschließlich.

Alan Storm
quelle
Hi @Alan. Können Sie das bitte untersuchen? => magento.stackexchange.com/questions/253507/…
Rohan Hapani
1
@RohanHapaniNicht wirklich M2-Entwicklung in diesen Tagen, so kann ich nicht Top of Head sagen.
Alan Storm

Antworten:

10

Sie können tatsächlich eine require-config.js in Ihre Themen-Modulverzeichnisse aufnehmen.

Das Problem ist (eigentlich für unser Frontend-Team), dass es anscheinend keine Möglichkeit gibt, die Konfiguration zu überschreiben, sondern die Konfiguration zu erweitern.

Um das Magento_Theme-Modul hier als Beispiel zu betrachten: Wenn Sie eine require-config.js unter <theme_base_dir>/Magento_Themedir hinzufügen , wird die config zur generierten require-config.js-Datei hinzugefügt und auch die config aus dem Magento_Theme-Modul wird hinzugefügt.

Um Ihre Frage zu beantworten, habe ich auch versucht, eine require-config.js unter dem Themes-Verzeichnis <theme_base_dir>/webund auch unter dem Themes-Root -Verzeichnis hinzuzufügen . Beides hat nicht funktioniert. Update: Tatsächlich ist es gemäß der Antwort unten möglich, es in das Basisverzeichnis des Themas zu platzieren

Die Antwort wäre also im Grunde ja, da Sie jede js-Anforderung unter jedem Modul hinzufügen könnten (themenbezogene js-Dateien können am besten unter dem Verzeichnis platziert werden <theme_base_dir>/Magento_Theme).

Obwohl ich sagen würde, sollte es die Möglichkeit geben, ein themenbezogenes require-config.js außerhalb eines Moduls hinzuzufügen (vielleicht deaktivieren Sie das angegebene Modul) und es sollte auch möglich sein, ein Modul require-config.js zu überschreiben.

Beides scheint atm nicht möglich.

=== UPDATE ===

Tatsächlich scheint es möglich zu sein, eine themenspezifische require-config.js zu haben. Siehe die Antwort von @Gareth Daine weiter unten

David Verholen
quelle
Betreff: "under the Magento_Theme" könnten Sie expliziter sein - es ist nicht 100% klar, auf welchen Ordner in einem Thema und / oder Modul Sie sich beziehen. Explizite Bedeutungpath/to/theme/files/[etc/Magento_Theme
Alan Storm
Ich meinte, das aktuelle Modul überschreiben in Ihrem Thema. Für das Modul Magento / Theme wäre die require-config.js <theme_base_dir> /Magento_Theme/require-config.js, wobei Magento_Theme der tatsächliche Modulname ist
David Verholen
schön, aktualisiert die Antwort, um es klarer zu machen
David Verholen
Also, habe ich Recht, wenn ich denke, dass eine requirejs-config.js-Datei unter app / design / frontend / <Vendor> / <theme> / web / js nicht funktioniert?
Gareth Daine
In den Dokumenten heißt es, dass JavaScript-Ressourcen für alle Bibliotheken in app / design / {area} / {Vendor} / {theme} / web auf Designebene angegeben werden können.
Gareth Daine
15

OK, ich glaube, ich habe es möglicherweise gelöst und bin der Meinung, dass die Dokumentation nicht eindeutig ist und aktualisiert werden muss, um den Prozess zu verdeutlichen.

Ich habe meine requirejs-config.jsaus den Verzeichnissen web/jsund webjeweils für beide Magento_Themeund das Stammverzeichnis meines Themas um verschoben <Vendor>/<theme>und jetzt wird meine RequireJS-Konfiguration requirejs-config.jsmit allen anderen Includes in die Hauptkonfiguration eingebunden .

Es scheint also, dass Sie die requirejs-config.jsDatei an den folgenden Speicherorten einschließen müssen, basierend auf den Themen- / Modulanforderungen.

Themenebene

app/design/frontend/<Vendor>/<theme>/requirejs-config.js

Modulebene

app/design/frontend/<Vendor>/<theme>/<Module_Name>/requirejs-config.js

In Ihrem requirejs-config.jsfür Ihr Thema sollten Sie Ihre Komponente einem Pfad zuordnen und dann verwenden, shimum Abhängigkeiten zu deklarieren:

var config = {
    map: {
        'component': 'js/component'
    },
    shim: {
        'component': {
            deps: ['jquery']
        }
    }
};

Dann müssen Sie eine Vorlage erstellen, um die Initialisierung der Komponenten über ein <script>Tag zu speichern (es sei denn, Sie hängen sie direkt an ein Element in einer .phtml-Datei an).

<script type="text/x-magento-init">
    {
        "*": {
            "js/component": {} // Not entirely sure what {} is and what I'm passing here
        }
    }
</script>

Alternativ binden Sie es an ein Element:

<script type="text/x-magento-init">
    {
        "#element": {
            "js/component": {} // Not entirely sure what {} is and what I'm passing here
        }
    }
</script>

Dann einfach die .phtml Vorlage in Ihrem Layout Anweisungen enthalten zum Beispiel stellte ich Mine innerhalb der default.xmlsich an app/design/frontend/<Vendor>/<theme>/Magento_Theme/layoutunter dem Körperknoten und verwiesen:

<block class="Magento\Framework\View\Element\Template" name="theme.js" template="Magento_Theme::html/js.phtml" />

Gareth Daine
quelle
Das {} in "js / component": {} wird verwendet, um Optionen an die Komponente zu übergeben
Vincent Hornikx,
2

Ich hatte nicht genügend Repräsentanten, um dies zu kommentieren, aber nur um zu bemerken, dass Gareths Antwort für mich nicht ganz funktionierte.

var config = {
    map: {
        '*': {
            'component': 'js/component'
        }
    },
    shim: {
        'component': {
            deps: ['jquery']
        }
    }
};

Das Umschließen der 'Komponente': 'js / Komponente' mit '*':{}hat den Trick gemacht.

Anstatt eine Vorlagendatei zu erstellen, habe ich den folgenden Code oben hinzugefügt app/design/frontend/<Vendor>/<theme>/Magento_Theme/layout/default.xml

    <referenceContainer name="after.body.start">
        <block class="Magento\Framework\View\Element\Text" name="jquery.bootstrap">
            <arguments>
                <argument translate="true" name="text" xsi:type="string"><![CDATA[<script type="text/x-magento-init">{"*":{"jquery.bootstrap":{}}}</script>]]></argument>
            </arguments>
        </block>
    </referenceContainer>
Justin
quelle
1

Ja requirejs-config.jskann wie folgt zum Thema hinzugefügt werden. So füge ich eine dotdotdot-Bibliothek in mein Magento2-Design ein.

1. Laden Sie die Js Library herunter und fügen Sie sie in Ihr Design ein. Gehen Sie dabei wie folgt vor:

// app/design/frontend/Namespace/themename/web/js/jquery.dotdotdot.min.js

2. Erstellen Sie die RequirementJS-Datei eines Themas wie folgt und teilen Sie den RequirementJS die neu hinzugefügte Bibliothek mit.

// app/design/frontend/Namespace/themename/requirejs-config.js
var config = {
   map: {
       '*': {
           dotdotdot: 'js/jquery.dotdotdot.min',
       }
   }
};

3. Verwenden Sie die hinzugefügte Bibliothek in der Haupt-JS-Datei Ihres Themas wie folgt:

// app/design/frontend/Namespace/themename/web/js/main.js
require([ 'jquery' , 'dotdotdot' , 'domReady!'],function($){
    $(window).load(function() {
        //custom js code
        /* $(".product-item-name").each(function(){
            $(this).dotdotdot(); 
        }); */
    });
});

4. und fügen Sie die js-Datei Ihres Themas wie folgt in den Kopf Ihrer Site ein:

// app/design/frontend/Namespace/themename/Magento_Theme/layout/default_head_blocks.xml
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <head>
        <link src="js/main.js"/> 
    </head>
</page>

Sie können jede externe JS-Bibliothek und benutzerdefinierte Datei auf jeder Seite in magento2 hinzufügen.

sagte
quelle
Auf requirejs-config.jsdiese Weise habe ich versucht, eine Bibliothek hinzuzufügen . RequireJS versucht dann jedoch, js/some.library.jsaus dem Stammverzeichnis statt aus dem Themenverzeichnis zu laden .
Freitag
Ah, du musst die .jsErweiterung weglassen ... albern :)
fritzmg