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.
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
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
Das ist interessant, ich habe es gerade getestet und es funktioniert auch mit AMD-Modulen. – martin