Requirejs Shim-Option funktioniert nicht

11

Ich entwickle ein Modul für Magento2 und verwende requirejs, um benutzerdefiniertes Javascript zu laden, das von jquery abhängt. Ich verwende die Shim-Option in requirejs-config.js, um diese Abhängigkeit zwischen den benutzerdefinierten Skripten und jquery festzulegen. Das Problem ist, dass diese Abhängigkeit nicht (immer) festgelegt ist. Manchmal wird jQuery vor dem Skript geladen und alles ist in Ordnung, aber manchmal wird es nach den Skripten geladen, was zu einem Skriptfehler führt:

Uncaught ReferenceError: jQuery is not defined(anonymous function) @ jquery.easing.1.3.js:39
Uncaught ReferenceError: jQuery is not defined(anonymous function) @ jquery.flexslider-min.js:5
Uncaught TypeError: $(...).flexslider is not a function

Unten sehen Sie ein Beispiel für meine requirejs-config.js:

var config = {
    map: {
        '*': {
            'flexslider': 'Vendor_Modulejs/jquery.flexslider-min',
            'picturefill': 'Vendor_Modulejs/picturefill.min',
            'easing': 'Vendor_Modulejs/jquery.easing.1.3',
            'hoverintent': 'Vendor_Modulejs/jquery.hoverIntent',
            'fitvids': 'Vendor_Modulejs/jquery.fitvids',
            'vimeo': 'Vendor_Modulejs/jquery.vimeo.api.min'
        }
    },
    shim: {
        'flexslider': ['jquery'],
        'picturefill': ['jquery'],
        'easing': ['jquery'],
        'hoverintent': ['jquery'],
        'fitvids': ['jquery'],
        'vimeo': ['jquery']
    }
};

Dies ist das Javascript in meiner HTML-Datei:

require(['jquery', 'domReady!', 'picturefill', 'flexslider', 'easing', 'hoverintent', 'fitvids', 'vimeo'], function($) {
    "use strict";

    // javascript here

});

Was mache ich hier falsch, warum wird die Shim-Option nicht berücksichtigt und jQuery wird nicht immer vor den anderen Skripten geladen.

Solide
quelle

Antworten:

20

Sie müssen requirejs-config.js wie folgt einstellen :

Weitere Informationen finden Sie unter Link, Beheben des RequireJs-Fehlers in Magento 2

 var config = {
        paths: {
                'flexslider': 'Vendor_Modulejs/jquery.flexslider-min',
                'picturefill': 'Vendor_Modulejs/picturefill.min',
                'easing': 'Vendor_Modulejs/jquery.easing.1.3',
                'hoverintent': 'Vendor_Modulejs/jquery.hoverIntent',
                'fitvids': 'Vendor_Modulejs/jquery.fitvids',
                'vimeo': 'Vendor_Modulejs/jquery.vimeo.api.min'
        },
        shim: {
                'flexslider': {
                    deps: ['jquery']
                },
                'picturefill': {
                    deps: ['jquery']
                },
                'easing': {
                    deps: ['jquery']
                },
                'hoverintent': {
                    deps: ['jquery']
                },
                'fitvids': {
                    deps: ['jquery']
                },
                'vimeo': {
                    deps: ['jquery']
                }
        }
    };

Verwenden Sie den obigen Code und entfernen Sie den var-Ordner und versuchen Sie es. Vielen Dank.

Rakesh Jesadiya
quelle
Dies scheint tatsächlich den Trick zu tun, und ich habe dies als Antwort markiert. Ich würde gerne verstehen, warum das funktioniert. Sind es die Pfade anstelle der Kartenkonfiguration oder ist es die spezifische Abhängigkeitseinstellung in der Shim-Konfiguration? In der Dokumentation von requirejs wird erwähnt, dass Sie in der Shim-Konfiguration ein Array von Abhängigkeiten verwenden können, anstatt jede Abhängigkeit separat anzugeben. Ich vermute also, dass es sich um den Unterschied zwischen Pfaden und Karten handelt, aber warum?
Solide
2
Sie können die Referenz aus diesem Beitrag überprüfen, stackoverflow.com/questions/19216580/requirejs-paths-vs-map
Rakesh Jesadiya
1
Niemals löschen / var, da es nützliche Informationen enthält
Max
Hallo Rakesh, können Sie erklären, wie der obige Code funktioniert
Jaisa
@Jaisa, ich habe mehr in meinem Blog im obigen Link ausgeführt
Rakesh Jesadiya