
typeScript执行和node.js的repl,具有源地图和本机ESM支持。
最新文档也可以在我们的网站上找到:https://typestrong.org/ts-node
node标志TSErrorSyntaxErrorERR_REQUIRE_ESMERR_UNKNOWN_FILE_EXTENSIONnode_modulesTS节点是一个打字稿执行引擎,是node.js的replent引擎。
它将打字稿转换为JavaScript,使您能够直接在Node.js上执行Typescript而无需预编译。这是通过挂接节点的模块加载API来实现的,使其能够与其他Node.js工具和库无缝使用。
tsconfig.json解析
# 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节点将始终从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中指定选项,然后从Shebang中省略它们。
#!/usr/bin/env ts-node
// ts-node options are read from tsconfig.json
console . log ( "Hello, world!" )包括Shebang中的选项需要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 ' 您可以在不使用我们的CLI的情况下注册TS节点: 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节点并注册Loader,以便将来需要使用require('ts-node').register({ /* options */ }) 。
查看我们的API以获取更多功能。
TS节点支持各种选项,可以通过tsconfig.json指定为CLI标志,作为环境变量或编程性。
有关完整列表,请参见选项。
TS节点CLI标志必须在入口点脚本之前出现。例如:
$ ts-node --project tsconfig-dev.json say-hello.ts Ronald
Hello, Ronald ! TS节点自动找到并加载tsconfig.json 。大多数TS节点选项可以使用其程序化的骆驼名称在"ts-node"对象中指定。我们建议这样做,因为即使您无法传递CLI标志,例如node --require ts-node/register以及使用Shebangs时,它也有效。
使用--skipProject跳过加载tsconfig.json 。使用--project明确指定tsconfig.json的路径。
搜索时,使用与tsc相同的搜索行为来解决它。默认情况下,此搜索是相对于入口点脚本执行的。在--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
}
}我们捆绑的JSON模式列出了所有兼容选项。
@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节点将使用 @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并通过--require / -r安装TS -Node
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 -i和--interactive与node.js cli类似。
ts-node支持--project和--showConfig类似于TSC CLI。
环境变量(可在可用的情况下)在ALL_CAPS
ts-node --help打印帮助文本
ts-node -v
ts-node -vvv打印版本。 -vv包括节点和打字稿编译器版本。 -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解析相对于当前目录而不是入口点脚本目录的配置
ts-node -O < json compilerOptions >
ts-node --compilerOptions < json compilerOptions >JSON对象与编译器选项合并
环境: TS_NODE_COMPILER_OPTIONS
ts-node --showConfig打印已解决的tsconfig.json ,包括ts-node选项,然后退出
ts-node -T
ts-node --transpileOnly使用打字稿的更快的transpileModule
默认值: false
环境: TS_NODE_TRANSPILE_ONLY
ts-node --typeCheck与--transpileOnly相反
默认值: true
环境: TS_NODE_TYPE_CHECK
ts-node -H
ts-node --compilerHost使用打字稿的编译器主机API
默认值: false
环境: TS_NODE_COMPILER_HOST
ts-node --files加载files , include并从启动上的tsconfig.json exclude 。这可以避免某些打字失败。有关详细信息,请参见丢失类型。
默认值: false
环境: TS_NODE_FILES
ts-node -D < code,code >
ts-node --ignoreDiagnostics < code,code >通过诊断代码忽略打字稿警告
环境: 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 --skipIgnore跳过忽略支票
默认值: false
环境: TS_NODE_SKIP_IGNORE
ts-node -C < name >
ts-node --compiler < name >指定自定义打字稿编译器
默认值: 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重新订购文件扩展名,以便首选打字稿导入
默认值: false
环境: TS_NODE_PREFER_TS_EXTS
ts-node --logErrorlogs typeScript错误到stderr而不是抛出异常
默认值: 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范围编译器与scopeDir中的文件。此目录之外的任何内容都被忽略了。
默认值: false
环境: TS_NODE_SCOPE
ts-node --scopeDir < path/to/directory >启用scope时,编译器受到限制的目录。
默认值:第一个:of: tsconfig.json “ rootdir”(如果指定),如果没有加载tsconfig.json ,则包含tsconfig.json或CWD的目录。
环境: 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通往REPT历史记录文件的路径
默认值: ~/.ts_node_repl_history
ts-node --noExperimentalReplAwait禁用顶级等待重置。相当于Node的--no-experimental-repl-await
默认值:如果打字稿版本为3.8或更高,并且目标为ES2018或更高版本,则启用。
环境: TS_NODE_EXPERIMENTAL_REPL_AWAIT设置false to disable
启用重新映射进口并需要呼叫支持的实验钩:
import "./foo.js"将执行foo.ts目前将映射以下扩展名:.js to .ts , .tsx或.jsx.cjs至.cts.mjs至.mts.jsx至.tsx将来,此钩子还将支持:
baseUrl , pathsrootDirsrootDir映射的outDir有关详细信息,请参见#1514。
默认值: false ,但默认情况下可能会在未来版本中启用
只能通过tsconfig.json或API指定。
ts-node --experimentalSpecifierResolution node就像Node的--experimental-specifier-resolution一样,也可以在您的tsconfig.json中设置。需要启用esm 。
默认值: explicit
API包含此处未显示的其他选项。
SWC支持是通过--swc标志或"swc": true Tsconfig选项。
SWC是在Rust中实现的与打字稿兼容的转板器。这使得它的数量级比transpileOnly快。
要使用它,请先安装@swc/core或@swc/wasm 。如果使用importHelpers ,也请安装@swc/helpers 。如果target小于“ ES2015”,并且使用async / await或发电机功能,则还安装了regenerator-runtime 。
npm i -D @swc/core @swc/helpers regenerator-runtime然后将以下内容添加到您的tsconfig.json 。
{
"ts-node" : {
"swc" : true
}
}SWC使用
@swc/helpers而不是tslib。如果您已经启用了importHelpers,则还必须安装@swc/helpers。
打字稿几乎总是使用现代import语法编写,但是在由基础运行时执行之前也会对其进行转换。您可以选择使用Node的本机ESM支持来选择转换为concomjs或保留本机import语法。每个配置都不同。
这是两者的简短比较。
| commonjs | 本机ecmasiprcript模块 |
|---|---|
编写本地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.json中node --loader ts-node/esmNODE_OPTIONS="--loader ts-node/esm" node |
转换为commonj通常更简单,更广泛地支持,因为它较旧。您必须在tsconfig.json中删除package.json和set“ "type": "module" "module": "CommonJS" 。
{
// This can be omitted; commonjs is the default
"type" : "commonjs"
} {
"compilerOptions" : {
"module" : "CommonJS"
}
}如果您必须保留tsc ,WebPack或其他构建工具的"module": "ESNext" ,则可以为TS节点设置覆盖。
{
"compilerOptions" : {
"module" : "ESNext"
} ,
"ts-node" : {
"compilerOptions" : {
"module" : "CommonJS"
}
}
} 节点的ESM加载器钩是实验性的,并且可能会发生变化。 TS-Node的ESM支持尽可能稳定,但它依赖于节点可以并且会破坏新版本节点的API。因此,不建议生产。
有关完整使用,限制并提供反馈,请参见#1007。
您必须在tsconfig.json中的package.json和“ "type": "module" "module": "ESNext" 。
{
"type" : "module"
} {
"compilerOptions" : {
"module" : "ESNext" // or ES2015, ES2020
} ,
"ts-node" : {
// Tell ts-node CLI to install the --loader automatically, explained below
"esm" : true
}
}您还必须确保传递节点--loader 。 TS节点CLI将使用我们的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.tsTS节点使用明智的默认配置来减少样板,同时仍然尊重tsconfig.json (如果有)。如果不确定使用了哪种配置,则可以使用ts-node --showConfig记录它。这类似于tsc --showConfig但也包含"ts-node"选项。
TS节点还尊重您本地安装的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节点,与打字稿编译器的错误以及来自node的错误区分的错误很重要。了解何时是由代码中的类型错误,代码中的错误或配置中的缺陷引起的错误也很重要。
TSError编译器的类型错误被抛出为TSError 。这些与您从tsc遇到的错误相同。
SyntaxError任何不是TSError的错误都是来自node.js(例如SyntaxError ),并且不能通过Typescript或ts-node固定。这些是您的代码或配置中的错误。
您的node版本可能不支持打字稿支持的所有JavaScript语法。编译器必须通过“下级”来转换此语法,该语法由TSCONFIG "target"选项控制。否则,您的代码会罚款,但节点会抛出SyntaxError 。
例如, node 12不了解?.可选的链接操作员。如果您使用"target": "esnext" ,则以下键入语法:
const bar : string | undefined = foo ?. bar ;将编译到此JavaScript中:
const a = foo ?. bar ;当您尝试运行此代码时,Node 12将抛出SyntaxError 。要解决此问题,您必须切换到"target": "es2019"或较低,以便打字稿变换?.进入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}添加。文档webpack.config.ts ,必须将其执行为commonjs.ctsTS节点不会急切地加载files ,默认情况下include或exclude 。这是因为绝大多数项目都不使用项目目录中的所有文件(例如Gulpfile.ts ,运行时与测试),而是将每个文件解析以减慢启动时间。取而代之的是,TS节点从脚本文件(例如ts-node index.ts )和Typescript分辨率基于导入和引用开始。
有时,这种优化会导致缺失类型。幸运的是,还有其他方法可以将它们包括在Typechecking中。
对于全局定义,您可以使用typeRoots编译器选项。这要求将您的类型定义构造为类型软件包(不是松散的打字稿定义文件)。有关如何工作的更多详细信息,请参见打字稿手册。
示例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选项。
使用npx或yarn dlx执行打字稿时,该代码位于临时node_modules目录中。
默认情况下, node_modules的内容被忽略。如果执行失败,请启用skipIgnore 。
这些技巧将使TS节点更快。
通常最好将作为测试或覆盖的一部分。您可以运行tsc --noEmit执行此操作。在这些情况下,TS节点可以跳过打字,使其更快。
要跳过TS节点中的Typechecking,请执行以下操作之一:
transpileOnly跳过无swc的打字如果您绝对必须在TS节点中打字:
require()可能会触发重复的打字仪;喜欢import--files ;根据您的项目,一个可能更快tsc --showConfig ;确保包括所有执行文件skipLibChecktypes数组以避免加载不必要的@typesTS节点通过注册.ts , .tsx , .js和/或.jsx扩展的挂钩来起作用。
通过从磁盘中读取node并执行它来加载.js 。我们的钩子在中间运行,将代码从打字稿转换为JavaScript,并将结果传递给node进行执行。这种转变将尊重您的tsconfig.json ,就好像您已经通过tsc编译一样。
我们还注册了其他一些钩子,以将源符号应用于堆栈跟踪,并从.js导入到.ts 。
TS节点会转换某些文件并忽略其他文件。我们将此机制称为“范围”。有多种配置范围的选项,因此TS节点仅转换项目中的文件。
警告:
node.js仍然可以执行忽略的文件。忽略文件意味着我们不会将其从打字稿转换为JavaScript,但不能阻止执行。
如果文件需要转换但被忽略,则节点可能无法解决或试图以Vanilla JavaScript的形式执行该节点。这可能会导致语法错误或其他失败,因为节点不了解打字稿类型语法或出血 - 边缘ecmascript特征。
.js和.jsx仅在启用allowJs时才会转换。
.tsx和.jsx仅在启用jsx时会转换。
警告:
当TS节点与
allowJs一起使用时,所有未签名的JavaScript文件均由TS节点转换。
node_modules默认情况下,TS节点避免在/node_modules/出于三个原因中编译文件:
如果您需要在node_modules中导入未编译的打字稿,请使用--skipIgnore或TS_NODE_SKIP_IGNORE绕过此限制。
如果已编译的JavaScript文件与已经存在的打字稿文件相同,则将忽略打字稿文件。 TS节点将导入预编译的JavaScript。
迫使ts节点导入打字稿源,而不是预编译的JavaScript,使用--preferTsExts 。
我们的scope和scopeDir选项将限制转换到目录中的文件。
我们的ignore选项将忽略匹配一个或多个正则表达式的文件。
您可以根据tsconfig.json中的paths部分将TS节点与tsconfig-paths一起加载模块。
{
"ts-node" : {
// Do not forget to `npm i -D tsconfig-paths`
"require" : [ "tsconfig-paths/register" ]
}
}官方的打字稿手册在“其他模块分辨率标志”中说明了"paths"的预期目的。
Typescript编译器具有一组其他标志,可以将转换的转换通知来源,以生成最终输出。
重要的是要注意,编译器将不会执行任何这些转换。它只是使用这些信息来指导将模块导入到其定义文件的过程。
这意味着"paths"旨在描述构建工具或运行时已经执行的映射,而不是告诉构建工具或运行时如何解析模块。换句话说,他们打算以node已经理解的方式写入进口。因此,TS节点不会修改node的模块分辨率行为来实现"paths"映射。
一些项目需要一个修补的打字稿编译器,以添加其他功能。例如, ttypescript和ts-patch添加了配置自定义变压器的功能。这些是用于香草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节点支持第三方转换器作为插件。诸如SWC之类的转侧可以将打字稿转换为JavaScript,速度要比打字机编译器快得多。您仍然会从TS-Node的自动tsconfig.json DISCOVER,SOURCEMAP支持和全局TS节点CLI中受益。插件会自动从您现有的tsconfig.json中得出适当的配置,从而简化了项目样板。
编译器和转介器之间有什么区别?
出于我们的目的,编译器实现了打字稿的API并可以执行打字。第三方转换器没有。两者都将Tistipcript转换为JavaScript。
transpiler选项允许使用TS节点使用第三方转板插件。必须将transpiler命名为可以require() d的模块的名称。内置的swc插件被暴露为ts-node/transpilers/swc 。
例如,要使用假设的“ @cspotcode/fast-ts-compiler”,请先将其安装到您的项目中: npm install @cspotcode/fast-ts-compiler
然后将以下内容添加到您的tsconfig:
{
"ts-node" : {
"transpileOnly" : true ,
"transpiler" : "@cspotcode/fast-ts-compiler"
}
}要编写您自己的Transpiler插件,请检查我们的API文档。
插件是由ts节点require() d,因此它们可以是本地脚本或发布到NPM的节点模块。该模块必须导出我们的TranspilerModule接口描述的create函数。 create由TS节点在启动时调用,以创建一个或多个转板实例。这些实例用于将打字稿转换为JavaScript。
如有工作示例,请查看我们捆绑的SWC插件:https://github.com/typestrong/ts-node/blob/main/src/src/transpilers/swc.ts
建议使用Typescript的
NodeNext或Node16模式,而不是本节中描述的选项。设置"module": "NodeNext",并使用.cts文件扩展名适用于大多数项目。
在确定应如何编译和执行文件时(作为COMPORJS或本机eCmascript模块)TS节点匹配node和tsc行为时。这意味着打字稿文件会根据您的tsconfig.json "module"选项进行转换,并根据节点的“ package.json "type"字段执行。设置"module": "NodeNext" ,一切都应该起作用。
在极少数情况下,您可能需要为某些文件覆盖此行为。例如,某些工具读取name-of-tool.config.ts ,并要求该文件执行为commonjs。如果您的package.json配置了"type": "module"和带有"module": "esnext" tsconfig.json ,则该配置默认为本地ecmascript,并且会引起错误。您将需要强制配置和任何支持脚本以执行为commonj。
在这些情况下,我们的moduleTypes选项可以覆盖某些文件为concomjs或esm。通过使用.mts , .cts , .cjs和.mjs文件扩展,可以使用类似的覆盖。 moduleTypes对.ts和.js文件具有相同的效果,并且还适当地覆盖了您的tsconfig.json "module"配置。
下面的示例告诉TS节点将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"
}
}每个键是一个与Tsconfig的"include"数组相同语法的球形图案。当多个模式与同一文件匹配时,最后一个模式优先。
cjs覆盖匹配文件以编译并执行为commonj。esm覆盖匹配文件以编译和执行为本机eCmascript模块。package将上述任何一个都重置为默认行为,该行为oferys package.json "type"和tsconfig.json "module"选项。具有覆盖模块类型的文件的转换与isolatedModules相同的限制。这只会影响罕见的情况,例如将枚举与preserveConstEnums const enum持有。
此功能旨在促进常规compilerOptions和package.json情况。json配置是不可能的。例如,无法给出webpack.config.ts "type"的package.json 。在可能的情况下,您应该使用传统package.json和tsconfig.json配置。
TS节点的完整API在此处记录:API文档
以下是您可以完成的一些亮点:
create()创建TS-Node的编译器服务,而无需注册任何挂钩。createRepl()创建了我们的REPL服务实例,因此您可以创建自己的打字稿供电。createEsmHooks()创建我们的ESM加载器钩子,适合与其他装载机组成或增强其他功能。TS节点专注于在节点上添加一流的打字稿支持。观看文件和代码重新加载不超出项目的范围。
如果要在文件更改时重新启动ts-node进程,则现有Node.js工具,例如Nodemon,Onchange和Node-Dev Work。
还有ts-node-dev ,这是一种使用ts-node进行编译的node-dev的修改版本,将重新启动文件更改的过程。请注意, ts-node-dev与我们的本机ESM加载器不兼容。
假设您是通过package.json配置AVA。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]或通过您的摩卡配置文件指定选项。
{
// 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添加到节点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 Code启动时应用相同的行为,请在启动配置中添加一个“ 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节点是根据MIT许可证获得许可的。麻省理工学院
TS节点包括来自MIT许可证的Node.js的源代码。 node.js许可证信息
TS节点包括来自Apache许可证2.0许可的打字稿编译器的源代码。打字稿许可证信息