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