Для чего используется опция модуля в tsconfig?

Я пытаюсь понять параметр компилятора модуля машинописного текста.

Я просмотрел документацию по машинописному тексту - docs В нем говорится, что параметр модуля - Specify module code generation.

Что это обозначает?

Означает ли это, что если я поставлю параметр модуля как commonjs, то компилятор компилирует код в commonjs? Но тогда у нас есть такие варианты, как esnext, es16. После того, как я просмотрел Документы: разница между целями модулей esnext, es6, es2015, я понял, что import() expressions are understood in esnext. В любом случае цель компилятора - скомпилировать код в понятный для браузера синтаксис (commonjs). Таким образом, компиляция кода для данного типа модуля не имеет смысла.

Значит ли это, что тип модуля, который вы указываете, сообщает компилятору, в каком синтаксисе написан код? Что означает, из какого кода он должен скомпилировать его в commonjs? Но затем у нас есть тип модуля commonjs, который часто используется, но мы почти никогда не пишем код с чистым синтаксисом commonjs.

какова цель tsconfig.json? ответ stackoverflow говорит module specifies module manager. Я не понимаю, что это значит.

Я также прошел через понимание «target» и «module» в tsconfig и параметры модуля tsconfig - относится ли «Система» к SystemJS?.

Кажется, что ни один из них не отвечает на мой вопрос должным образом.

tsconfig.json

{
  "compilerOptions: {
    "module": "esnext"
  }
}

person sruthi    schedule 02.04.2019    source источник


Ответы (1)


TL; DR; module в tsconfig.json сообщает компилятору, какой синтаксис использовать для модулей в создаваемых файлах .js. Часто используются значения "commonjs" (require / module.exports) или "ES2015" (ключевые слова import / export), но существуют и другие системы модулей. module влияет на синтаксис модуля генерируемого кода, а target влияет на все остальное.

  • Что означает Specify module code generation?

"module" в tsconfig.json сообщает компилятору Typescript (TS), какой синтаксис модуля использовать при компиляции файлов в Javascript (JS).

Когда вы устанавливаете "module" на "commonjs" в tsconfig.json, это означает, что модули в скомпилированных файлах .js будут использовать синтаксис commonJS (CJS), поэтому для импорта и экспорта var x = require(...) и module.exports = {...}. Если вы изменили "module" на "ES2015", например, скомпилированный код будет использовать ключевые слова import и export, используемые в синтаксисе модуля ES2015. Обзор других синтаксисов можно найти здесь.

Существует несколько различных модульных систем с CJS и собственным форматом модуля ES (ESM), вероятно, наиболее широко используемыми. Что выбрать, зависит от ваших требований. Если это для серверного проекта, который использует Node.js, то, вероятно, CJS, если это для интерфейсного приложения Angular, чем, возможно, ESM (или их собственные NgModules, но это выходит за рамки здесь). В чем-то похожая ситуация с дизайном библиотек и пакетов, а также с тем, как вы хотели бы представить их потребителям. Это зависит от того, какие пользователи собираются использовать код, с чем они работают (браузер, узел) и какая из модульных систем лучше всего подходит для этой работы?

Модули ES теперь являются встроенным стандартом для импорта / экспорта модулей в JS, но когда не было собственного решения, были разработаны другие модульные системы: вот почему у нас также есть модули CJS, AMD и UMD. Не все они устарели, CJS по-прежнему часто используется в Node.js, а загрузчик модулей AMD, например, допускает импорт без JS, что может быть полезно в некоторых случаях. В настоящее время все современные браузеры и Node 13.2.0+ поддерживают формат ESM (см. на этой странице данные о совместимости и дополнительную информацию о модулях).

Но есть еще такие варианты, как esnext

Новые версии JS иногда содержат больше функций для импорта / экспорта модулей. установка "module" на "ESNext" включает поддержку этих функций, которые часто еще не добавлены в официальные спецификации. Например, выражение import(...), которое является динамическим импортом < / а>.

Означает ли это, что если я поставлю параметр модуля как commonjs, то компилятор компилирует код в commonjs?

Параметр "module" не влияет на остальную часть кода, вместо этого используется "target", который указывает, с какой версией JS должны быть совместимы выходные данные. Это было объяснено в других обсуждениях, я просто добавляю это здесь для ясности. Скажем, вы хотите использовать require(...) и module.exports = {...} в проекте узла, но также хотите, чтобы код использовал функции ES2015, такие как let и const в коде (для удобства чтения / производительности / по другим причинам). В этом случае вы должны установить "module" на "commonjs" и "target" на "ES2015" в tsconfig.

В любом случае цель компилятора - скомпилировать код в понятный для браузера синтаксис (commonjs).

Да, компилятор должен превратить код TS в понятный браузеру JS. Однако JS больше не ограничивается браузерами, например, Node работает в других средах (серверах). Фактически, CJS задумывался как формат модуля на стороне сервера, в то время как модули AMD использовались / используются для импорта / экспорта браузера.

Значит ли это, что тип модуля, который вы указываете, сообщает компилятору, в каком синтаксисе написан код?

Он сообщает компилятору, в каком синтаксисе писать модули в выходных файлах .js.

person Zwiers    schedule 14.04.2020
comment
Отличное объяснение, которое я не мог найти в других местах :) - person David López; 23.06.2020
comment
Это действительно хорошее и ясное объяснение сложной темы. Спасибо. - person James; 24.10.2020
comment
Просто лучшее объяснение, которое я нашел - person Adri HM; 20.03.2021