
Выполнение TypeScript и Repl для node.js, с исходной картой и собственной поддержкой ESM.
Последняя документация также можно найти на нашем веб-сайте: https://typestrong.org/ts-node
node флаговTSErrorSyntaxErrorERR_REQUIRE_ESMERR_UNKNOWN_FILE_EXTENSIONnode_modulesTS-Node-это механизм выполнения TypeScript и Repl для Node.js.
Он преобразует TypeScript в JavaScript, позволяя вам напрямую выполнять TypeScript на node.js без предварительного совершения. Это достигается путем подключения API -интерфейсов модуля узла, позволяя легко использовать его вместе с другими инструментами и библиотеками Node.js.
tsconfig.json sarsing
# Locally in your project.
npm install -D typescript
npm install -D ts-node
# Or globally with TypeScript.
npm install -g typescript
npm install -g ts-node
# Depending on configuration, you may also need these
npm install -D tslib @types/node Совет: установка модулей локально позволяет управлять и делиться версиями через package.json . TS-Node всегда будет разрешать компилятор от cwd , прежде чем проверять относительно собственной установки.
# Execute a script as `node` + `tsc`.
ts-node script.ts
# Starts a TypeScript REPL.
ts-node
# Execute code with TypeScript.
ts-node -e ' console.log("Hello, world!") '
# Execute, and print, code with TypeScript.
ts-node -p -e ' "Hello, world!" '
# Pipe scripts to execute with TypeScript.
echo ' console.log("Hello, world!") ' | ts-node
# Equivalent to ts-node --transpileOnly
ts-node-transpile-only script.ts
# Equivalent to ts-node --cwdMode
ts-node-cwd script.ts
# Equivalent to ts-node --esm
ts-node-esm script.ts Чтобы написать сценарии с максимальной переносимостью, укажите параметры в вашем tsconfig.json и опустите их из Шебанг.
#!/usr/bin/env ts-node
// ts-node options are read from tsconfig.json
console . log ( "Hello, world!" ) Включение вариантов в Шебанг требует флага env -S , который доступен в недавних версиях env . (совместимость)
#!/usr/bin/env -S ts-node --files
// This shebang works on Mac and Linux with newer versions of env
// Technically, Mac allows omitting `-S`, but Linux requires it Чтобы проверить вашу версию env для совместимости с -S :
# Note that these unusual quotes are necessary
/usr/bin/env --debug ' -S echo foo bar ' Вы можете зарегистрировать TS-Node без использования нашего CLI: node -r ts-node/register и node --loader ts-node/esm
Во многих случаях настройка NODE_OPTIONS будет включать ts-node в других инструментах узлов, дочерних процессах и рабочих потоках. Это может быть объединено с другими флагами узлов.
NODE_OPTIONS= " -r ts-node/register --no-warnings " node ./index.tsИли, если вам нужна собственная поддержка ESM:
NODE_OPTIONS= " --loader ts-node/esm " Это говорит о любых процессах узлов, которые получают эту переменную среды для установки крючков ts-node перед выполнением другого кода.
Если вы обращаете внимание на узел напрямую, вы можете избежать переменной среды и передать эти флаги в узел.
node --loader ts-node/esm --inspect ./index.ts Вы можете потребовать TS-узла и зарегистрировать загрузчик для будущего, используя require('ts-node').register({ /* options */ }) .
Проверьте наш API для получения дополнительных функций.
TS-Node поддерживает различные варианты, которые могут быть указаны через tsconfig.json , как флаги CLI, как переменные среды или программно.
Для полного списка см. Параметры.
Флаги CLI TS Node должны поступать перед сценарием входа. Например:
$ ts-node --project tsconfig-dev.json say-hello.ts Ronald
Hello, Ronald ! TS-Node автоматически находит и загружает tsconfig.json . Большинство параметров TS-узла могут быть указаны в объекте "ts-node" используя их программные имена верблюдов. Мы рекомендуем это, потому что это работает, даже когда вы не можете пройти флаги CLI, такие как node --require ts-node/register и при использовании Shebangs.
Используйте --skipProject , чтобы пропустить загрузку tsconfig.json . Используйте --project , чтобы явно указать путь к tsconfig.json .
При поиске он разрешается с использованием того же поведения поиска, что и tsc . По умолчанию этот поиск выполняется по сравнению с сценарием entrypoint. В --cwdMode или, если входной точка не указана -например, при использовании Repl -поиск выполняется по сравнению с --cwd / process.cwd() .
Вы можете использовать эту образец конфигурации в качестве отправной точки:
{
// This is an alias to @tsconfig/node16: https://github.com/tsconfig/bases
"extends" : "ts-node/node16/tsconfig.json" ,
// Most ts-node options can be specified here using their programmatic names.
"ts-node" : {
// It is faster to skip typechecking.
// Remove if you want ts-node to do typechecking.
"transpileOnly" : true ,
"files" : true ,
"compilerOptions" : {
// compilerOptions specified here will override those declared below,
// but *only* in ts-node. Useful if you want ts-node and tsc to use
// different options with a single tsconfig.json.
}
} ,
"compilerOptions" : {
// typescript options here
}
}Наша схема в комплекте перечисляет все совместимые варианты.
@tsconfig/bases поддерживает рекомендуемые конфигурации для нескольких версий узлов. Как удобство, они связаны с TS-узлом.
{
"extends" : "ts-node/node16/tsconfig.json" ,
// Or install directly with `npm i -D @tsconfig/node16`
"extends" : "@tsconfig/node16/tsconfig.json" ,
} Если tsconfig.json не загружается с диска, TS-Node будет использовать новейшие рекомендуемые по умолчанию по умолчанию из @tsconfig/bases, совместимые с вашим node и версиями typescript . С новейшим node и typescript это @tsconfig/node16 .
Старые версии typescript несовместимы с @tsconfig/node16 . В этих случаях мы будем использовать более старую конфигурацию по умолчанию.
В случае сомнений, ts-node --showConfig будет регистрировать используемую конфигурацию, а ts-node -vv будет регистрировать node и версии typescript .
node флагов Флаги node должны передаваться непосредственно в node ; Они не могут быть переданы в бинарное изящное TS, и они не могут быть указаны в tsconfig.json
Мы рекомендуем использовать переменную среды NODE_OPTIONS , чтобы перенести параметры в node .
NODE_OPTIONS= ' --trace-deprecation --abort-on-uncaught-exception ' ts-node ./index.ts В качестве альтернативы, вы можете вызовать node напрямую и установить TS -узл через --require / -r
node --trace-deprecation --abort-on-uncaught-exception -r ts-node/register ./index.ts Все флаги командной строки поддерживают как --camelCase , так и --hyphen-case .
Большинство вариантов можно объявить в вашем tsconfig.json: конфигурация через tsconfig.json
Поддерживает ts-node --print ( -p ), --eval ( -e ), --require ( -r ) и --interactive ( -i ), аналогичная Node.js Cli.
ts-node поддерживает --project и --showConfig похожий на TSC CLI.
Переменные среды, где доступны, находятся в ALL_CAPS
ts-node --helpОтпечатает текст справки
ts-node -v
ts-node -vvv Печатает версию. -vv включает в себя версии Node и TypeScript Compiler. -vvv включает в себя абсолютные пути к установке TS-узла и типографии.
ts-node -e < typescript code >
# Example
ts-node -e ' console.log("Hello world!") 'Оценить код
ts-node -p -e < typescript code >
# Example
ts-node -p -e ' "Hello world!" ' Печать результата --eval
ts-node -iОткрывает реплику, даже если stdin не кажется терминалом
ts-node --esm
ts-node-esmНачальная загрузка с погрузчиком ESM, обеспечивая полную поддержку ESM
ts-node -P < path/to/tsconfig >
ts-node --project < path/to/tsconfig >Путь к файлу tsconfig.
Обратите внимание на верхний регистр -P . Это отличается от опции проекта tsc -p/--project .
Среда: TS_NODE_PROJECT
ts-node --skipProjectПропустить разрешение конфигурации проекта и загрузка
По умолчанию: false
Среда: TS_NODE_SKIP_PROJECT
ts-node -c
ts-node --cwdMode
ts-node-cwdРазрешение конфигурации относительно текущего каталога вместо каталога сценария entrypoint
ts-node -O < json compilerOptions >
ts-node --compilerOptions < json compilerOptions >JSON объект слияния с параметрами компилятора
Среда: TS_NODE_COMPILER_OPTIONS
ts-node --showConfig Print Resroded tsconfig.json , включая параметры ts-node , и выход
ts-node -T
ts-node --transpileOnly Используйте более быстрый transpileModule TypeScript
По умолчанию: false
Среда: TS_NODE_TRANSPILE_ONLY
ts-node --typeCheck Противоположность --transpileOnly
По умолчанию: true
Среда: TS_NODE_TYPE_CHECK
ts-node -H
ts-node --compilerHostИспользуйте API компилятора TypeScript Compiler
По умолчанию: false
Среда: TS_NODE_COMPILER_HOST
ts-node --files Загрузите files , include и exclude из tsconfig.json при запуске. Это может избежать определенных неудач Typechecking. Смотрите отсутствующие типы для деталей.
По умолчанию: false
Среда: TS_NODE_FILES
ts-node -D < code,code >
ts-node --ignoreDiagnostics < code,code >Игнорировать предупреждения TypeScript с помощью диагностического кода
Среда: TS_NODE_IGNORE_DIAGNOSTICS
ts-node -I < regexp matching ignored files >
ts-node --ignore < regexp matching ignored files >Переопределить паттерны пути, чтобы пропустить компиляцию
По умолчанию: /node_modules/
Среда: TS_NODE_IGNORE
ts-node --skipIgnoreSkip игнорировать чеки
По умолчанию: false
Среда: TS_NODE_SKIP_IGNORE
ts-node -C < name >
ts-node --compiler < name >Укажите пользовательский компилятор TypeScript
По умолчанию: typescript
Среда: TS_NODE_COMPILER
ts-node --swc Транспиль с SWC. Подразумевает --transpileOnly
По умолчанию: false
ts-node --transpiler < name >
# Example
ts-node --transpiler ts-node/transpilers/swcИспользуйте сторонний транспилер, не являющийся типа
ts-node --preferTsExtsПерезаряйте расширения файлов, так что импорт TypeScript предпочтительнее
По умолчанию: false
Среда: TS_NODE_PREFER_TS_EXTS
ts-node --logErrorЖурналы ошибок типа
По умолчанию: false
Среда: TS_NODE_LOG_ERROR
ts-node --prettyИспользуйте довольно диагностический формат
По умолчанию: false
Среда: TS_NODE_PRETTY
TS_NODE_DEBUG=true ts-nodeВключить журнал отладки
ts-node -r < module name or path >
ts-node --require < module name or path >Требуется модуль узла перед выполнением
ts-node --cwd < path/to/directory >Ведите себя так, как будто вызывает в этом рабочем справочнике
По умолчанию: process.cwd()
Среда: TS_NODE_CWD
ts-node --emit Излучит выходные файлы в каталог .ts-node . Требуется --compilerHost
По умолчанию: false
Среда: TS_NODE_EMIT
ts-node --scope Компилятор Scope для файлов в scopeDir . Все, что за пределами этого каталога игнорируется.
По умолчанию: false
Среда: TS_NODE_SCOPE
ts-node --scopeDir < path/to/directory > Каталог, в котором компилятор ограничен при включении scope действия.
По умолчанию: первое: tsconfig.json "rootdir" Если указан, каталог, содержащий tsconfig.json или cwd, если не загружается tsconfig.json .
Среда: TS_NODE_SCOPE_DIR
Переопределите тип модуля определенных файлов, игнорируя поля типа package.json "type" . Смотрите переопределение типа модуля для деталей.
По умолчанию: obeys package.json "type" и tsconfig.json "module"
Может быть указан только через tsconfig.json или api.
TS_NODE_HISTORY= < path/to/history/file > ts-nodeФайл пути к истории для Repl
По умолчанию: ~/.ts_node_repl_history
ts-node --noExperimentalReplAwait Отключить верхний уровень ожидания в Repl. Эквивалент узел --no-experimental-repl-await
По умолчанию: включена версия TypeScript 3,8 или выше, а Target ES2018 или выше.
Среда: TS_NODE_EXPERIMENTAL_REPL_AWAIT set false для отключения
Включить экспериментальные крючки, которые переоценивают импорт и требуют вызовов для поддержки:
import "./foo.js" выполнит foo.ts В настоящее время будут нанесены на карту следующие расширения:.js to .ts , .tsx или .jsx.cjs to .cts.mjs to .mts.jsx to .tsxВ будущем этот крюк также поддержат:
baseUrl , pathsrootDirsoutDir карт rootDir для композитных проектов и MonoreposПодробнее см. #1514.
По умолчанию: false , но, вероятно, будет включен по умолчанию в будущей версии
Может быть указан только через tsconfig.json или api.
ts-node --experimentalSpecifierResolution node Как узел --experimental-specifier-resolution , но также может быть установлен в вашем tsconfig.json для удобства. Требует, чтобы esm был включен.
По умолчанию: explicit
API включает в себя дополнительные параметры, не показанные здесь.
Поддержка SWC встроена через флаг --swc или "swc": true TSConfig Option.
SWC является совместимым с типовой транспилером, реализованным в Rust. Это делает его на порядок быстрее, чем ванильный transpileOnly .
Чтобы использовать его, сначала установите @swc/core или @swc/wasm . При использовании importHelpers также установите @swc/helpers . Если target меньше, чем «ES2015» и использование функций async / await или Generator, также установите regenerator-runtime .
npm i -D @swc/core @swc/helpers regenerator-runtime Затем добавьте следующее в свой tsconfig.json .
{
"ts-node" : {
"swc" : true
}
}SWC использует
@swc/helpersвместоtslib. Если у вас были включеныimportHelpers, вы также должны установить@swc/helpers.
TypeScript почти всегда писается с использованием современного синтаксиса import , но он также преобразуется до того, как будет выполнена основная среда выполнения. Вы можете выбрать либо преобразовать в CommonJS, либо сохранить собственный синтаксис import , используя нативную поддержку ESM узела. Конфигурация отличается для каждого.
Вот краткое сравнение двух.
| Commonjs | Нативные модули Ecmascript |
|---|---|
Напишите нативный синтаксис import | Напишите нативный синтаксис import |
Преобразует import в require() | Не трансформирует import |
| Узел выполняет сценарии с использованием классического загрузчика Commonjs | Узел выполняет сценарии, используя новый загрузчик ESM |
Используйте любое из:ts-nodenode -r ts-node/registerNODE_OPTIONS="ts-node/register" noderequire('ts-node').register({/* options */}) | Используйте любое из:ts-node --esmts-node-esmУстановите "esm": true в tsconfig.jsonnode --loader ts-node/esmNODE_OPTIONS="--loader ts-node/esm" node |
Преобразование в CommonJS обычно проще и более широко поддерживается, потому что оно старше. Вы должны удалить "type": "module" из package.json и установить "module": "CommonJS" в tsconfig.json .
{
// This can be omitted; commonjs is the default
"type" : "commonjs"
} {
"compilerOptions" : {
"module" : "CommonJS"
}
} Если вы должны сохранить "module": "ESNext" для tsc , WebPack или другого инструмента сборки, вы можете установить переопределение для TS-узла.
{
"compilerOptions" : {
"module" : "ESNext"
} ,
"ts-node" : {
"compilerOptions" : {
"module" : "CommonJS"
}
}
} Крюки ESM погрузчика Node экспериментальны и подвергаются изменениям. Поддержка ESM TS-Node настолько стабилен, насколько это возможно, но она опирается на API, которые узел может и будет нарушать новые версии узла. Таким образом, это не рекомендуется для производства.
Для полного использования, ограничений и предоставления обратной связи см. #1007.
Вы должны установить "type": "module" в package.json и "module": "ESNext" в tsconfig.json .
{
"type" : "module"
} {
"compilerOptions" : {
"module" : "ESNext" // or ES2015, ES2020
} ,
"ts-node" : {
// Tell ts-node CLI to install the --loader automatically, explained below
"esm" : true
}
} Вы также должны убедиться, что узел прошел --loader . CLI TS-Node сделает это автоматически с нашей опцией esm .
--esm--loaderЭто может измениться, если узел добавляет возможность установить крючки для погрузчиков в текущий процесс.
# pass the flag
ts-node --esm
# Use the convenience binary
ts-node-esm
# or add `"esm": true` to your tsconfig.json to make it automatic
ts-nodeЕсли вы не используете наш CLI, передайте флаг загрузчика в узел.
node --loader ts-node/esm ./index.ts
# Or via environment variable
NODE_OPTIONS= " --loader ts-node/esm " node ./index.ts TS-Node использует разумные конфигурации по умолчанию, чтобы уменьшить шаблон, в то же время уважая tsconfig.json , если у вас есть. Если вы не уверены, какая конфигурация используется, вы можете войти в нее с помощью ts-node --showConfig . Это похоже на tsc --showConfig , но также включает в себя варианты "ts-node" .
TS-Node также уважает вашу локально установленную версию typescript , но глобальные инсталляции отступают в глобально установленную typescript . Если вы не уверены, какие версии используются, ts-node -vv будет регистрировать их.
$ ts-node -vv
ts-node v10.0.0
node v16.1.0
compiler v4.2.2
$ ts-node --showConfig
{
" compilerOptions " : {
" target " : " es6 " ,
" lib " : [
" es6 " ,
" dom "
],
" rootDir " : " ./src " ,
" outDir " : " ./.ts-node " ,
" module " : " commonjs " ,
" moduleResolution " : " node " ,
" strict " : true,
" declaration " : false,
" sourceMap " : true,
" inlineSources " : true,
" types " : [
" node "
],
" stripInternal " : true,
" incremental " : true,
" skipLibCheck " : true,
" importsNotUsedAsValues " : " error " ,
" inlineSourceMap " : false,
" noEmit " : false
},
" ts-node " : {
" cwd " : " /d/project " ,
" projectSearchDir " : " /d/project " ,
" require " : [],
" project " : " /d/project/tsconfig.json "
}
} Важно отличать ошибки от TS-узла, ошибки от компилятора TypeScript и ошибки от node . Также важно понимать, когда ошибки вызваны ошибкой типа в вашем коде, ошибкой в вашем коде или недостатком в вашей конфигурации.
TSError Ошибки типа из компилятора брошены в качестве TSError . Это то же самое, что и ошибки, которые вы получаете от tsc .
SyntaxError Любая ошибка, которая не является TSError происходит от node.js (например, SyntaxError ) и не может быть зафиксирована с помощью TypeScript или TS-узла. Это ошибки в вашем коде или конфигурации.
Ваша версия node может не поддерживать весь синтаксис JavaScript, поддерживаемый TypeScript. Компилятор должен преобразовать этот синтаксис с помощью «погружения», который контролируется опцией TSConfig "target" . В противном случае ваш код будет хорошо скомпилироваться, но узел бросит SyntaxError .
Например, node 12 не понимает ?. Дополнительный оператор цепочки. Если вы используете "target": "esnext" , то следующий синтаксис типографии:
const bar : string | undefined = foo ?. bar ;Скомпилируется в этот JavaScript:
const a = foo ?. bar ; Когда вы попытаетесь запустить этот код, узел 12 бросит SyntaxError . Чтобы исправить это, вы должны перейти на "target": "es2019" или снизить преобразование TypeScript ?. во что -то node может понять.
ERR_REQUIRE_ESM Эта ошибка бросается узлом, когда модуль require() d, но узлы считают, что он должен выполняться как нативный ESM. Это может произойти по нескольким причинам:
webpack.config.ts , который должен выполняться как Commonjs.ctsERR_UNKNOWN_FILE_EXTENSIONЭта ошибка бросается узлом, когда у модуля есть нераспознанное расширение файла или вообще нет расширения и выполняется как нативный ESM. Это может произойти по нескольким причинам:
mocha .ts-node-esm , ts-node --esm или добавьте "ts-node": {"esm": true} в свой tsconfig.json. Докwebpack.config.ts , который должен выполняться как Commonjs.cts TS-Node не загружает files , include или exclude по умолчанию. Это связано с тем, что подавляющее большинство проектов не используют все файлы в каталоге проектов (например, Gulpfile.ts , тесты времени выполнения) и анализ каждого файла для типов замедляет время запуска. Вместо этого TS-Node начинается с файла скрипта (например, ts-node index.ts ), а TypeScript разрешает зависимости, основанные на импорте и ссылках.
Иногда эта оптимизация приводит к отсутствующим типам. К счастью, есть и другие способы включить их в Typechecking.
Для глобальных определений вы можете использовать опцию компилятора typeRoots . Это требует, чтобы ваши определения типа были структурированы как пакеты типов (не свободные файлы определения типа). Более подробную информацию о том, как это работает, можно найти в Справочнике TypeScript.
Пример tsconfig.json :
{
"compilerOptions" : {
"typeRoots" : [ "./node_modules/@types" , "./typings" ]
}
}Пример структуры проекта:
<project_root>/
-- tsconfig.json
-- typings/
-- <module_name>/
-- index.d.ts
Пример файла объявления модуля:
declare module '<module_name>' {
// module definitions go here
} Для определений модулей вы можете использовать paths :
{
"compilerOptions" : {
"baseUrl" : "." ,
"paths" : {
"custom-module-type" : [ "types/custom-module-type" ]
}
}
} Другой вариант-это директивы с тройным складом. Это может быть полезно, если вы предпочитаете не изменять свои compilerOptions или структурировать определения типа для typeRoots . Ниже приведен пример директивы с тройным складом в качестве относительного пути в вашем проекте:
/// <reference path="./types/lib_greeter" />
import { Greeter } from "lib_greeter"
const g = new Greeter ( ) ;
g . sayHello ( ) ; Если ни одна из вышеперечисленных работ, и вы должны использовать files , include или exclude , включить наши files .
При выполнении TypeScript с помощью npx или yarn dlx код находится во временном каталоге node_modules .
Содержимое node_modules игнорируется по умолчанию. Если выполнение не удается, включите skipIgnore .
Эти трюки сделают TS-узл быстрее.
Часто лучше в TypeCheck как часть ваших тестов или подножки. Вы можете запустить tsc --noEmit сделать это. В этих случаях TS-узл может пропустить TypeChecking, делая его намного быстрее.
Чтобы пропустить Typechecking в TS-узле, сделайте одно из следующих:
transpileOnly для пропуски Typechecking без SWC Если вам абсолютно необходимо TypeCheck в TS-узле:
require() , который может вызвать повторяющуюся TypeChecking; предпочитаю import--files ; Один может быть быстрее в зависимости от вашего проектаtsc --showConfig ; Убедитесь, что все выполненные файлы включеныskipLibChecktypes , чтобы избежать загрузки ненужных @types TS-Node работает, зарегистрируя крючки для .ts , .tsx , .js и/или .jsx расширения.
Ванильный node загружается .js , читая код с диска и выполняя его. Наш крюк работает в середине, преобразуя код из TypeScript в JavaScript и передает результат node для выполнения. Это преобразование будет уважать ваш tsconfig.json как если бы вы скомпилировали через tsc .
Мы также зарегистрируем несколько других крючков, чтобы применить Sourcemaps для складывания трассов и переназначить от импорта .js в .ts .
TS-узл преобразует определенные файлы и игнорирует других. Мы называем этот механизм «общего числа». Существуют различные параметры для настройки областей, так что TS-узлы преобразуют только файлы в вашем проекте.
Предупреждение:
Игнорируемый файл все еще может быть выполнен node.js. Игнорирование файла означает, что мы не преобразуем его из TypeScript в JavaScript, но он не предотвращает выполнение.
Если файл требует преобразования, но игнорируется, узел может либо не разрешить его, либо попытаться выполнить его как ванильный JavaScript. Это может вызвать синтаксические ошибки или другие сбои, потому что узел не понимает синтаксис типа типов, ни функции ECMASCRING-края.
.js и .jsx преобразуются только при включении allowJs .
.tsx и .jsx преобразуются только тогда, когда jsx включен.
Предупреждение:
Когда TS-Node используется с
allowJs, все негрестимые файлы JavaScript преобразуются TS-Node.
node_modules По умолчанию TS-Node избегает компиляции файлов в /node_modules/ по трем причинам:
Если вам необходимо импортировать бескомпромиссную TypeScript в node_modules , используйте --skipIgnore или TS_NODE_SKIP_IGNORE чтобы обойти это ограничение.
Если скомпилированный файл JavaScript с тем же именем, что и файл TypeScript, уже существует, файл TypeScript будет проигнорирован. TS-Node будет импортировать предварительно скомпилированный JavaScript.
Чтобы заставить TS-Node импортировать источник TypeScript, а не предварительный JavaScript, используйте --preferTsExts .
Наши параметры scope и scopeDir будут ограничивать преобразование в файлах в каталоге.
Наша опция ignore будет игнорировать файлы, соответствующие одному или нескольким регулярным выражениям.
Вы можете использовать TS-узл вместе с TSConfig-Paths для загрузки модулей в соответствии с разделом paths в tsconfig.json .
{
"ts-node" : {
// Do not forget to `npm i -D tsconfig-paths`
"require" : [ "tsconfig-paths/register" ]
}
} Официальное руководство по типографии объясняет предполагаемую цель для "paths" в «дополнительных флагах разрешения модулей».
Компилятор TypeScript имеет набор дополнительных флагов для информирования компилятора о преобразовании, которые, как ожидается, произойдут с источниками для генерации конечного вывода.
Важно отметить, что компилятор не будет выполнять ни одно из этих преобразований; Он просто использует эти части информации, чтобы направлять процесс разрешения импорта модуля в файл определения.
Это означает, что "paths" предназначены для описания сопоставлений, которые уже работают инструмент для сборки или время выполнения, а не сообщать инструмент сборки или время выполнения, как разрешить модули. Другими словами, они намереваются написать наш импорт таким образом, чтобы node уже понимал. По этой причине TS-Node не изменяет поведение разрешения модуля node для реализации отображений "paths" .
Некоторые проекты требуют исправленного компилятора Typescript, который добавляет дополнительные функции. Например, ttypescript и ts-patch добавляют возможность настроить пользовательские трансформаторы. Это замены замены для модуля Vanilla typescript и реализуют один и тот же API.
Например, чтобы использовать ttypescript и ts-transformer-keys , добавьте это в свой tsconfig.json :
{
"ts-node" : {
// This can be omitted when using ts-patch
"compiler" : "ttypescript"
} ,
"compilerOptions" : {
// plugin configuration is the same for both ts-patch and ttypescript
"plugins" : [
{ "transform" : "ts-transformer-keys/transformer" }
]
}
} TS-Node поддерживает сторонние транспористы в качестве плагинов. Транспалисты, такие как SWC, могут преобразовать TypeScript в JavaScript намного быстрее, чем компилятор TypeScript. Вы по-прежнему выиграете от автоматического tsconfig.json Discovery, поддержки Sourcemap от TS-Node и Global TS-Node CLI. Плагины автоматически получают соответствующую конфигурацию из существующего tsconfig.json , которая упрощает проектную патлер.
В чем разница между компилятором и транспористом?
Для наших целей компилятор реализует API TypeScript и может выполнять TypeChecking. Сторонний транспорист этого не делает. Оба преобразования типографии в JavaScript.
Опция transpiler позволяет использовать сторонние плагины Transpiler с TS-узлом. transpiler должно быть дано имя модуля, который может быть require() d. Встроенный плагин swc подвергается воздействию как ts-node/transpilers/swc .
Например, для использования гипотетического « @CspotCode/Fast-TS-компилятор» сначала установите его в свой проект: npm install @cspotcode/fast-ts-compiler
Затем добавьте следующее в свой TSConfig:
{
"ts-node" : {
"transpileOnly" : true ,
"transpiler" : "@cspotcode/fast-ts-compiler"
}
}Чтобы написать свой собственный плагин Transpiler, проверьте наши документы API.
Плагины require() d от TS-узла, поэтому они могут быть локальным сценарием или модулем узла, опубликованным в NPM. Модуль должен экспортировать функцию create , описанную нашим интерфейсом TranspilerModule . create вызывается TS-Node в Startup для создания одного или нескольких экземпляров транспорта. Экземпляры используются для преобразования TypeScript в JavaScript.
Для работы примером, проверьте наш плагин SWC в комплекте: https://github.com/typestrong/ts-node/blob/main/src/transpilers/swc.tsts
Везде, где это возможно, рекомендуется использовать режим
NodeNextилиNode16TypeScript вместо параметров, описанных в этом разделе. Настройка"module": "NodeNext"и использование расширения файла.ctsдолжны хорошо работать для большинства проектов.
При принятии решения о том, как файл должен быть скомпилирован и выполнен-в качестве CommonJS или нативного модуля Ecmascript-TS-узл соответствует node и поведению tsc . Это означает, что файлы TypeScript преобразуются в соответствии с вашим опцией tsconfig.json "module" и выполняются в соответствии с полем типа Node для package.json "type" . Установите "module": "NodeNext" , и все должно работать.
В редких случаях вам может потребоваться переопределить это поведение для некоторых файлов. Например, некоторые инструменты читают name-of-tool.config.ts и требуют, чтобы этот файл выполнял в качестве обычных. Если у вас есть package.json , настроенный с "type": "module" и tsconfig.json с "module": "esnext" , конфигурация по умолчанию является собственной Ecmascript и вынесет ошибку. Вам нужно будет заставить конфигурацию и любые вспомогательные сценарии выполнять как обычные.
В этих ситуациях наша опция moduleTypes может переопределить определенные файлы, чтобы быть CommonJS или ESM. Аналогичное переопределение возможно с использованием расширений файлов .mts , .cts , .cjs и .mjs . moduleTypes достигает того же эффекта для файлов .ts и .js , а также переопределяет ваш модуль tsconfig.json "module" .
В следующем примере TS-Node выполнить конфигурацию WebPack как CommonJS:
{
"ts-node" : {
"transpileOnly" : true ,
"moduleTypes" : {
"webpack.config.ts" : "cjs" ,
// Globs are also supported with the same behavior as tsconfig "include"
"webpack-config-scripts/**/*" : "cjs"
}
} ,
"compilerOptions" : {
"module" : "es2020" ,
"target" : "es2020"
}
} Каждый ключ представляет собой шаблон шаровика с тем же синтаксисом, что и массив "include" . Когда несколько шаблонов соответствуют одному и тому же файлу, последний шаблон имеет приоритет.
cjs переопределения совпадает с файлами для компиляции и выполнения как CommonJS.esm переопределяет файлы для компиляции и выполнения как собственных модулей Ecmascript.package сбрасывает любое из вышеперечисленного поведения по умолчанию "type" которое tsconfig.json "module" package.json . Файлы с переопределенным типом модуля преобразуются с теми же ограничениями, что и isolatedModules . Это повлияет на только редкие случаи, такие как использование const enum с отключенными preserveConstEnums .
Эта функция предназначена для облегчения сценариев, где обычные compilerOptions и конфигурация package.json невозможны. Например, webpack.config.ts не может быть предоставлен собственным package.json "type" Везде, где это возможно, вы должны отдать предпочтение, используя конфигурации Trading package.json и tsconfig.json .
Полный API TS-Node задокументирован здесь: API DOCS
Вот несколько основных моментов того, чего вы можете достичь:
create() Создает сервис компилятора TS-NODE без регистрации каких-либо крючков.createRepl() создает экземпляр нашей службы Reply, поэтому вы можете создать свои собственные заски, способствующие мощным типовым показателям.createEsmHooks() создает наши крючки для погрузчиков ESM, подходящие для сочинения с другими погрузчиками или дополнительно с дополнительными функциями.TS-Node фокусируется на добавлении новой поддержки TypeScript в узлы. Просмотр файлов и перезагрузки кода не выходит за рамки проекта.
Если вы хотите перезапустить процесс ts-node при изменении файла, существующие инструменты Node.js, такие как работа Nodemon, Onchange и Node-Dev.
Есть также ts-node-dev , модифицированная версия node-dev с использованием ts-node для компиляции, которая перезагружает процесс при изменении файла. Обратите внимание, что ts-node-dev несовместимо с нашим нативным погрузчиком ESM.
Предполагая, что вы настраиваете AVA через свой package.json , добавьте одну из следующих конфигураций.
Используйте эту конфигурацию, если у вашего package.json нет "type": "module" .
{
"ava" : {
"extensions" : [
"ts"
] ,
"require" : [
"ts-node/register"
]
}
} Эта конфигурация необходима, если у вашего package.json есть "type": "module" .
{
"ava" : {
"extensions" : {
"ts" : "module"
} ,
"nonSemVerExperiments" : {
"configurableModuleFormat" : true
} ,
"nodeArguments" : [
"--loader=ts-node/esm"
]
}
} Поддержка TS-узла встроена, чтобы глотать.
# Create a `gulpfile.ts` and run `gulp`.
gulpСм. Также: https://gulpjs.com/docs/en/getting-started/javascript-and-gulpfiles#transpilation
Создайте новую конфигурацию node.js и добавить -r ts-node/register в «Параметры узла».
ПРИМЕЧАНИЕ. Если вы используете аргумент командной строки --project <tsconfig.json> в соответствии с параметрами конфигурации и хотите применить это же поведение при запуске в IntelliJ, укажите в разделе «Переменные среды»: TS_NODE_PROJECT=<tsconfig.json> .
mocha --require ts-node/register --extensions ts,tsx --watch --watch-files src ' tests/**/*.{ts,tsx} ' [...args]Или укажите параметры через ваш файл конфигурации MOCHA.
{
// Specify "require" for CommonJS
"require" : "ts-node/register" ,
// Specify "loader" for native ESM
"loader" : "ts-node/esm" ,
"extensions" : [ "ts" , "tsx" ] ,
"spec" : [
"tests/**/*.spec.*"
] ,
"watch-files" : [
"src"
]
}См. Также: https://mochajs.org/#configuring-mocha-nodejs
mocha --require ts-node/register --watch-extensions ts,tsx " test/**/*.{ts,tsx} " [...args] Примечание. --watch-extensions только в режиме --watch .
ts-node node_modules/tape/bin/tape [...args] Создайте новую конфигурацию отладки node.js, добавить -r ts-node/register в Node Args и переместить program в список args (так что код VS не ищет outFiles ).
{
"configurations" : [ {
"type" : "node" ,
"request" : "launch" ,
"name" : "Launch Program" ,
"runtimeArgs" : [
"-r" ,
"ts-node/register"
] ,
"args" : [
"${workspaceFolder}/src/index.ts"
]
} ] ,
} Примечание. Если вы используете аргумент командной строки --project <tsconfig.json> в соответствии с параметрами конфигурации, и хотите применить это же поведение при запуске в коде VS, добавьте ключ «env» в конфигурацию запуска: "env": { "TS_NODE_PROJECT": "<tsconfig.json>" } .
Во многих случаях настройка NODE_OPTIONS будет включать ts-node в других инструментах узлов, дочерних процессах и рабочих потоках.
NODE_OPTIONS= " -r ts-node/register "Или, если вам нужна собственная поддержка ESM:
NODE_OPTIONS= " --loader ts-node/esm " Это говорит о любых процессах узлов, которые получают эту переменную среды для установки крючков ts-node перед выполнением другого кода.
TS-Node лицензирован по лицензии MIT. Грань
TS-Node включает исходный код от Node.js, который лицензирован по лицензии MIT. Информация о лицензии node.js
TS-Node включает исходный код из компилятора TypeScript, который лицензирован по лицензии Apache 2.0. Информация о лицензии на типов