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.

Súvisiace články