Понимание «цели» и «модуля» в tsconfig

83

Ниже мой tsconfig.jsonфайл, в котором я установил цель es5и модуль дляes6

{
   "compilerOptions": {
   "target": "es5",    
   "module": "es6"
   }

}

Мой вопрос в том, что модули [импорт / экспорт] являются частью es6, а НЕ es5, транспилированный код javascript не должен иметь операторов импорта / экспорта. Но сгенерированный код javascript имеет операторы импорта / экспорта, даже если целью является es5, как это возможно?

рефакторинг
источник

Ответы:

61

Модульная система не зависит от языковой реализации. Модули ES6 (ES2015) используют синтаксис import/ export, и загрузчик модуля должен его интерпретировать.

Здесь вы указали использование модульной системы ES2015, чтобы включить синтаксис модуля ES6.

Сам JavaScript может быть нацелен на ES5 и использовать только функции ES5, но теоретически можно использовать загрузчик модуля с этим кодом, который работает с синтаксисом модуля ES2015. Хотя это возможно, это не обязательно то, чем вы хотели бы заниматься. Чаще используются модули CommonJS или AMD с ES5 JavaScript.

Очевидно, такая комбинация была недопустима до TypeScript 2.0. В примечаниях к выпуску TypeScript 2.0 говорится:

«Ранее помеченная как недопустимая комбинация флагов, теперь поддерживается target: es5 и 'module: es6'. Это должно облегчить использование шейкеров дерева на основе ES2015, таких как свертка».

Джимс
источник
4
Определяют ли какие-либо из этих флагов, на каком языке и в какой модульной системе выводится скомпилированный код, или эти флаги используются только для определения того, как должен анализироваться входной источник?
Tom
1
«Модульная система не зависит от языковой реализации» - Вы знаете, почему это так? Есть ли для этого документация?
KaushikTD
18

Чтобы дополнить предыдущий ответ, в 2020 году есть 4 параметра конфигурации TS, которые определяют разрешение модуля и вывод компиляции:

  • module.
  • target.
  • lib.
  • moduleResolution.

Первые 3 влияют на ваш вывод, а последние влияют на то, как компилятор ищет ваши модули, чтобы разрешить их и связать.

Вот отличная и краткая статья об этих параметрах: Путаница в Typescript: описание модуля tsconfig.json, moduleResolution, target и lib | Тома Медема | Средний .

Кроме того, документ о разрешении модуля: TypeScript: Handbook - Module Resolution .

Алексей Гринько
источник