
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 。
例如,要npm install @cspotcode/fast-ts-compiler 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許可的打字稿編譯器的源代碼。打字稿許可證信息