ecmascript 6 - Wie man ein einzelnes ES6-Modul aus mehreren TypeScript-Dateien erstellt (für eine Frontend-Bibliothek)
Der Code meiner Frontend-Bibliothek ist in mehrere Quellcodedateien aufgeteilt.
Beispiel :
// a.ts
function a() {}
// b.ts
function b() {}
// main.ts
const myLib = {
a: a,
b: b
}
Ich muss ein ES6-Modul (d.h. eine JavaScript-Datei) erstellen, das nur myLib als Standardexport exportiert.
Ich sehe zwei Optionen. Die erste:
- Führen Sie
tscaus, um jede Datei in JavaScript zu kompilieren; - Fassen Sie alle generierten JS-Dateien zu einer einzigen Datei
my-lib.jszusammen; - Fügen Sie den von ES6 benötigten Code hinzu (
export …).
Der zweite:
- Fassen Sie alle TypeScript-Dateien in einer einzigen Datei
my-lib.tszusammen; - Fügen Sie den Export hinzu:
export default myLib; - Führen Sie
tscauf der zusammengefügten Datei aus.
Beide Optionen sind hässlich und verlieren die map-Datei.
Gibt es einen besseren Weg, das zu tun?
Antwort #1
Der richtige Weg ist, eine Barrel-Datei zu erstellen, die die Module erneut exportiert.
// foo/a.ts
export function a() {}
// foo/b.ts
export function b() {}
// foo/index.ts
export {a} from './a';
export {b} from './b';
Dann in Ihrem Verbraucher:
import {a, b} from './foo';
a();
b();
Antwort #2
Ich füge eine Antwort hinzu, weil heute der richtige Weg für eine Frontend-Bibliothek die Verwendung von Rollup ist.
Schreiben Sie zuerst ES6-Module, import und export sie:
// file-a.ts
export function a() {}
// file-b.ts
export function b() {}
// main.ts
export { a } from "./file-a"
export { b } from "./file-b"
Kompiliere dann den Code zu JavaScript mit tsc und der Option module, die auf "es6" gesetzt ist.
Lassen Sie dann Rollup ein flaches Bundle aus dem JavaScript-Code erstellen. Für den obigen Code erstellt Rollup dieses Bundle:
function a() {}
function b() {}
export { a, b };
Siehe auch:
- Das Rollup REPL: https://rollupjs.org/repl
- Der Artikel: Webpack und Rollup: gleich, aber unterschiedlich
Hinweis: Die endgültige Lösung zum Erstellen der Definitionsdatei (.d.ts) ist noch nicht implementiert (März 2018). Ich füge weiterhin Dateien mit einem Node.js-Skript zusammen, um exportierte Typen in einer einzigen TypeScript-Definitionsdatei zu erzeugen.
