typescript - Razumijevanje "target" i "module" u tsconfig
Ispod je moja datoteka tsconfig.json u kojoj sam postavio target na es5 i module na es6
{
"compilerOptions": {
"target": "es5",
"module": "es6"
}
}
Moje pitanje je zato što su moduli [import/export] dio ES6 i NISU dio ES5, pa transpilirani JavaScript kod ne bi trebao imati import/export izjave. Ali JavaScript kod koji se generira ima import/export izjave iako je cilj ES5, kako je to moguće?
Odgovor #1
Sustav modula je neovisan o implementaciji jezika. ES6 (ES2015) moduli koriste import/export sintaksu, a na učitavaču modula je da to interpretira.
Ovdje ste naveli korištenje ES2015 modulskog sustava, što omogućuje ES6 sintaksu modula.
Sami JavaScript može ciljati ES5 i koristiti samo ES5 značajke, ali je teorijski moguće koristiti učitavač modula s tim kodom koji radi s ES2015 sintaksom modula. Iako je moguće, to nije nužno nešto što biste željeli raditi. Češće je koristiti CommonJS ili AMD module s ES5 JavaScriptom.
Očito ova kombinacija nije bila dopuštena čak ni prije TypeScript 2.0. U bilješkama o izdanju TypeScript 2.0 stoji:
"Ranije označeno kao nevažeća kombinacija zastavica, cilj: es5 i 'module: es6' sada je podržano. To bi trebalo olakšati korištenje tree shakera baziranih na ES2015, kao što je rollup."
Odgovor #2
Kao dopunu prethodnom odgovoru, u 2020. postoje 4 TS konfiguracijske opcije koje definiraju razrješenje modula i izlaz kompilacije:
modul.cilj.lib.moduleResolution.
Prva tri utječu na vaš izlaz, dok posljednje utječe na način na koji prevodilac traži vaše module da ih riješi i spoji.
Evo odličnog i sažetog članka o ovim opcijama: Typescript zbrka: tsconfig.json module, moduleResolution, target i lib objašnjeno | autor Tom Medema | Medium.
Dodatno, dokument o rješavanju modula: TypeScript: Priručnik - Rješavanje modula.