0

Ich habe ein paar AMD Module Typoskript der mit --outFile Option in einer einzigen Datei zusammengefasst:Laden gebündelt AMD-Module mit SystemJS

define("partA", ["require", "exports"], function (require, exports) { 
    "use strict"; 
    function partAFunc() { 
     console.log('partAFunc'); 
     return 'partAFunc'; 
    } 
    exports.partAFunc = partAFunc; 
}); 
define("partB", ["require", "exports"], function (require, exports) { 
    "use strict"; 
    exports.partB = 42; 
}); 
define("partC", ["require", "exports"], function (require, exports) { 
    ... 
}); 

Jetzt möchte ich nur das partA Modul laden und rufen seine partAfunc() so kann ich tun die folgenden in Node.js:

SystemJS.config({ 
    map: { 
    'main': 'my-bundle.js', 
    }, 
}); 

SystemJS.import('main').then((m) => { 
    SystemJS.import('partA').then((m) => { 
    m.partAFunc(); 
    }); 
}); 

der erste Import SystemJS.import('main') einfach alle Module registriert und dann SystemJS.import('partA') funktioniert, weil Modul partA bereits registriert ist (oder zumindest ich gues Das ist es, was es macht.

Doch warum kann ich nicht nur SystemJS.import('partA') verwenden und das Bündel als Abhängigkeit:

SystemJS.config({ 
    meta: { 
    'partA': { 
     deps: [ 'my-bundle.js' ], 
    } 
    } 
}); 

SystemJS.import('partA').then((m) => { 
    m.partAFunc(); 
}); 

Die meta vollständig ignoriert. Das Dokument unter https://github.com/systemjs/systemjs/blob/master/docs/config-api.md#meta sagt:

Abhängigkeiten zu laden, bevor dieses Modul. Geht durch normale Pfade und Kartennormalisierung. Wird nur für die Formate cjs, amd und global unterstützt.

Es sieht aus wie SystemJS zunächst überprüft, ob die Datei partA vorhanden ist (was natürlich nicht) und wirft einen Fehler (Getestet habe ich es mit einer vorhandenen Datei und die meta Config gearbeitet):

(node:60981) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: ENOENT: no such file or directory, open '/Users/.../partA' 
    Instantiating /Users/.../partA 
    Loading partA 

Ich würde erwarten, dass auch das Folgende funktionieren sollte, wenn die erste Variante mit zwei verschachtelten SystemJS.import Aufrufen arbeitet.

SystemJS.config({ 
    map: { 
    'partA': 'my-bundle.js', 
    }, 
}); 

SystemJS.import('partA').then((m) => { 
    // m.partAFunc(); 
    console.log(m) 
}); 

Dies druckt ein leeres Objekt. Es sieht so aus, als wenn es mehr als ein Modul in einer einzigen Datei gibt, es registriert sie einfach und lädt keine von ihnen?

Ich lese alle Dokumente in https://github.com/systemjs/systemjs/tree/master/docs, aber ich denke, ich bin immer noch verloren.

Antwort

1

Was Sie tun müssen, ist die bundles Einstellung zu verwenden und stellen Sie Ihre Bündel wie folgt aus:

bundles: { 
     'my-bundle.js': ['partA', 'partB', 'partC'], 
    }, 

Grob gesagt, das sagt SystemJS „, wenn Sie für das Modul aussehen partA, holen und führen das Modul my-bundle.js genannt und Sie Ich werde partA dort finden. "


Ihr Ansatz meta verwendet, kann nicht funktionieren. Ihre meta Einstellung nicht sagen, „nicht versuchen, ein Modul mit dem Namen PARTA und statt holen my-bundle.js zu holen“, heißt es „, wenn Sie partA verarbeiten, zusätzlich zu den Abhängigkeiten es bereits hat, fügen Sie my-bundle.js in der Liste der Abhängigkeiten . " SystemJS ruft weiterhin partA ab. Es gibt keinen Grund dafür zu warten, bis es my-bundle.js ausgeführt hat, bevor es versucht, es abzurufen, also startet es den Abruf sofort und es schlägt fehl.

+0

Ich dachte, die 'Bündel'-Option funktioniert nur mit Bundles erstellt mit SystemJS Builder, was bedeutet, dass ich das System-Modul-Format verwenden muss.Ich benutze AMD Format. Ich denke, ich verstehe jetzt, was die 'Deps' tun. Es lädt die Module in der richtigen Reihenfolge, so dass beide existieren müssen, aber dann werden sie zuerst mit "Deps" ausgeführt. – martin

+0

Sie können 'bundle' mit AMD-Modulen verwenden. Ich habe es getan. Kein SystemJS-Builder beteiligt. Die Dokumentation ist irreführend. Was es über den Builder sagt und 'System.register' verwendet, dient der Veranschaulichung (das ist eine Möglichkeit, dies zu tun). Es ist nicht * vorschreibend *. – Louis

+0

Das ist interessant, ich habe es gerade getestet und es funktioniert auch mit AMD-Modulen. – martin

Verwandte Themen