typescript - Pochopenie „target“ a „module“ v tsconfig
Nižšie je súbor tsconfig.json, kde som nastavil target na es5 a module na es6
{
"compilerOptions": {
"target": "es5",
"module": "es6"
}
}
Moja otázka je, pretože moduly [import/export] sú súčasťou ES6 a NIE ES5, preložený JavaScript kód by nemal obsahovať príkazy import/export. Ale JavaScript kód, ktorý sa generuje, obsahuje príkazy import/export aj napriek tomu, že cieľom je ES5, ako je to možné?
Odpoveď č. 1
Systém modulov je nezávislý od implementácie jazyka. Moduly ES6 (ES2015) používajú syntax import/export a je na načítači modulov, aby ju interpretoval.
Tu ste špecifikovali použitie modulového systému ES2015, takže to umožňuje syntax modulov ES6.
Sám JavaScript môže cieliť na ES5 a používať iba funkcie ES5, ale teoreticky je možné použiť modulový načítač s týmto kódom, ktorý pracuje so syntaxou modulov ES2015. Hoci je to možné, nie je to nevyhnutne niečo, čo by ste chceli robiť. Bolo by bežnejšie používať moduly CommonJS alebo AMD s JavaScriptom ES5.
Zrejme táto kombinácia nebola povolená ani pred TypeScript 2.0. V poznámkach k vydaniu TypeScript 2.0 sa uvádza:
„Predtým označené ako neplatná kombinácia príznakov, cieľ: es5 a ‚module: es6‘ je teraz podporovaný. Toto by malo uľahčiť používanie tree shakerov založených na ES2015, ako je rollup.“
Odpoveď č. 2
Na doplnenie predchádzajúcej odpovede, v roku 2020 existujú 4 konfiguračné možnosti TS, ktoré určujú riešenie modulov a výstup kompilácie:
modul.cieľ.knižnica.moduleResolution.
Prvé tri ovplyvňujú váš výstup, zatiaľ čo posledné ovplyvňuje spôsob, akým kompilátor vyhľadáva vaše moduly, aby ich vyriešil a zbalil.
Tu je skvelý a stručný článok o týchto možnostiach: Typescript zmätok: tsconfig.json module, moduleResolution, target a lib vysvetlené | od Tom Medema | Medium.
Okrem toho dokument o riešení modulov: TypeScript: Príručka - Riešenie modulov.