
Eksekusi TypeScript dan repl untuk node.js, dengan peta sumber dan dukungan ESM asli.
Dokumentasi terbaru juga dapat ditemukan di situs web kami: https://typestrong.org/ts-node
nodeTSErrorSyntaxErrorERR_REQUIRE_ESMERR_UNKNOWN_FILE_EXTENSIONnode_modulesTS-Node adalah mesin eksekusi TypeScript dan rept untuk node.js.
JIT mengubah naskah menjadi JavaScript, memungkinkan Anda untuk secara langsung menjalankan naskah di node.js tanpa kompilasi. Ini dilakukan dengan mengaitkan modul Node Memuat API, memungkinkannya untuk digunakan dengan mulus di samping alat dan perpustakaan node.js lainnya.
tsconfig.json Otomatis
# 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 Kiat: Memasang modul secara lokal memungkinkan Anda untuk mengontrol dan berbagi versi melalui package.json . TS-Node akan selalu menyelesaikan kompiler dari cwd sebelum memeriksa relatif terhadap instalasinya sendiri.
# 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 Untuk menulis skrip dengan portabilitas maksimum, tentukan opsi di tsconfig.json Anda dan hilangkan dari shebang.
#!/usr/bin/env ts-node
// ts-node options are read from tsconfig.json
console . log ( "Hello, world!" ) Termasuk opsi di dalam shebang membutuhkan bendera env -S , yang tersedia pada versi terbaru dari env . (kesesuaian)
#!/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 Untuk menguji env Anda untuk kompatibilitas dengan -S :
# Note that these unusual quotes are necessary
/usr/bin/env --debug ' -S echo foo bar ' Anda dapat mendaftarkan TS-Node tanpa menggunakan CLI: node -r ts-node/register dan node --loader ts-node/esm
Dalam banyak kasus, pengaturan NODE_OPTIONS akan memungkinkan ts-node dalam alat simpul lain, proses anak, dan utas pekerja. Ini dapat dikombinasikan dengan bendera simpul lainnya.
NODE_OPTIONS= " -r ts-node/register --no-warnings " node ./index.tsAtau, jika Anda memerlukan dukungan ESM asli:
NODE_OPTIONS= " --loader ts-node/esm " Ini memberi tahu setiap proses node yang menerima variabel lingkungan ini untuk menginstal kait ts-node sebelum menjalankan kode lain.
Jika Anda memohon simpul secara langsung, Anda dapat menghindari variabel lingkungan dan meneruskan bendera tersebut ke simpul.
node --loader ts-node/esm --inspect ./index.ts Anda dapat memerlukan TS-Node dan mendaftarkan loader untuk masa depan yang dibutuhkan dengan menggunakan require('ts-node').register({ /* options */ }) .
Lihat API kami untuk lebih banyak fitur.
TS-Node mendukung berbagai opsi yang dapat ditentukan melalui tsconfig.json , sebagai bendera CLI, sebagai variabel lingkungan, atau secara terprogram.
Untuk daftar lengkap, lihat opsi.
Bendera CLI TS-Node harus datang sebelum skrip Entrypoint. Misalnya:
$ ts-node --project tsconfig-dev.json say-hello.ts Ronald
Hello, Ronald ! TS-Node secara otomatis menemukan dan memuat tsconfig.json . Sebagian besar opsi TS-simpul dapat ditentukan dalam objek "ts-node" menggunakan nama terprogramnya, Camelcase. Kami merekomendasikan ini karena berfungsi bahkan ketika Anda tidak dapat lulus bendera CLI, seperti node --require ts-node/register dan saat menggunakan shebangs.
Gunakan --skipProject untuk melewatkan memuat tsconfig.json . Gunakan --project untuk secara eksplisit menentukan jalur ke tsconfig.json .
Saat mencari, itu diselesaikan dengan menggunakan perilaku pencarian yang sama dengan tsc . Secara default, pencarian ini dilakukan relatif terhadap skrip entrypoint. Dalam --cwdMode atau jika tidak ada titik masuk yang ditentukan -misalnya saat menggunakan repl -pencarian dilakukan relatif terhadap --cwd / process.cwd() .
Anda dapat menggunakan konfigurasi sampel ini sebagai titik awal:
{
// 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
}
}Skema JSON yang dibundel kami mencantumkan semua opsi yang kompatibel.
@tsconfig/basis mempertahankan konfigurasi yang disarankan untuk beberapa versi node. Sebagai kenyamanan, ini dibundel dengan TS-node.
{
"extends" : "ts-node/node16/tsconfig.json" ,
// Or install directly with `npm i -D @tsconfig/node16`
"extends" : "@tsconfig/node16/tsconfig.json" ,
} Jika tidak ada tsconfig.json yang dimuat dari disk, TS-node akan menggunakan default terbaru yang disarankan dari @tsconfig/pangkalan yang kompatibel dengan versi node dan typescript Anda. Dengan node dan typescript terbaru, ini adalah @tsconfig/node16 .
Versi typescript yang lebih lama tidak kompatibel dengan @tsconfig/node16 . Dalam kasus tersebut kami akan menggunakan konfigurasi default yang lebih lama.
Bila ragu, ts-node --showConfig akan mencatat konfigurasi yang digunakan, dan ts-node -vv akan mencatat versi node dan typescript .
node Bendera node harus diteruskan langsung ke node ; Mereka tidak dapat diteruskan ke biner TS-simpul juga tidak dapat ditentukan dalam tsconfig.json
Kami merekomendasikan menggunakan variabel lingkungan NODE_OPTIONS untuk meneruskan opsi ke node .
NODE_OPTIONS= ' --trace-deprecation --abort-on-uncaught-exception ' ts-node ./index.ts Atau, Anda dapat memohon node secara langsung dan menginstal TS -Node via --require / -r
node --trace-deprecation --abort-on-uncaught-exception -r ts-node/register ./index.ts Semua bendera baris perintah mendukung --camelCase dan --hyphen-case .
Sebagian besar opsi dapat dinyatakan dalam tsconfig.json Anda: Konfigurasi melalui tsconfig.json
ts-node mendukung --print ( -p ), --eval ( -e ), --require ( -r ) dan --interactive ( -i ) mirip dengan node.js cli.
ts-node mendukung --project dan --showConfig mirip dengan TSC CLI.
Variabel lingkungan, jika tersedia, ada di ALL_CAPS
ts-node --helpMencetak teks bantuan
ts-node -v
ts-node -vvv Mencetak versinya. -vv Termasuk versi Node dan TypeScript. -vvv termasuk jalur absolut ke instalasi TS-Node dan TypeScript.
ts-node -e < typescript code >
# Example
ts-node -e ' console.log("Hello world!") 'Mengevaluasi kode
ts-node -p -e < typescript code >
# Example
ts-node -p -e ' "Hello world!" ' Cetak Hasil --eval
ts-node -iMembuka rept bahkan jika stdin tampaknya tidak menjadi terminal
ts-node --esm
ts-node-esmBootstrap dengan Loader ESM, memungkinkan dukungan ESM penuh
ts-node -P < path/to/tsconfig >
ts-node --project < path/to/tsconfig >Jalur ke file tsconfig.
Perhatikan huruf besar -P . Ini berbeda dari opsi tsc 'S -p/--project .
Lingkungan: TS_NODE_PROJECT
ts-node --skipProjectLewati Resolusi dan Pemuatan Konfigurasi Proyek
Default: false
Lingkungan: TS_NODE_SKIP_PROJECT
ts-node -c
ts-node --cwdMode
ts-node-cwdSelesaikan konfigurasi relatif terhadap direktori saat ini alih -alih direktori skrip entrypoint
ts-node -O < json compilerOptions >
ts-node --compilerOptions < json compilerOptions >Obyek JSON untuk bergabung dengan opsi kompiler
Lingkungan: TS_NODE_COMPILER_OPTIONS
ts-node --showConfig Cetak tsconfig.json Cetak, termasuk opsi ts-node , dan keluar
ts-node -T
ts-node --transpileOnly Gunakan transpileModule yang lebih cepat
Default: false
Lingkungan: TS_NODE_TRANSPILE_ONLY
ts-node --typeCheck Kebalikan dari --transpileOnly
Default: true
Lingkungan: TS_NODE_TYPE_CHECK
ts-node -H
ts-node --compilerHostGunakan API Host Kompiler TypeScript
Default: false
Lingkungan: TS_NODE_COMPILER_HOST
ts-node --files Memuat files , include dan exclude dari tsconfig.json saat startup. Ini dapat menghindari kegagalan typechecking tertentu. Lihat tipe yang hilang untuk detailnya.
Default: false
Lingkungan: TS_NODE_FILES
ts-node -D < code,code >
ts-node --ignoreDiagnostics < code,code >Abaikan peringatan naskah dengan kode diagnostik
Lingkungan: TS_NODE_IGNORE_DIAGNOSTICS
ts-node -I < regexp matching ignored files >
ts-node --ignore < regexp matching ignored files >Mengganti pola jalur untuk melewatkan kompilasi
Default: /node_modules/
Lingkungan: TS_NODE_IGNORE
ts-node --skipIgnoreLewati abaikan cek
Default: false
Lingkungan: TS_NODE_SKIP_IGNORE
ts-node -C < name >
ts-node --compiler < name >Tentukan kompiler TypeScript khusus
Default: typescript
Lingkungan: TS_NODE_COMPILER
ts-node --swc Transpile dengan SWC. Menyiratkan --transpileOnly
Default: false
ts-node --transpiler < name >
# Example
ts-node --transpiler ts-node/transpilers/swcGunakan transpiler pihak ketiga, non-typechecking
ts-node --preferTsExtsMemesan ulang ekstensi file sehingga impor naskah lebih disukai
Default: false
Lingkungan: TS_NODE_PREFER_TS_EXTS
ts-node --logErrorLog kesalahan naskah ke stderr alih -alih melempar pengecualian
Default: false
Lingkungan: TS_NODE_LOG_ERROR
ts-node --prettyGunakan formatter yang cukup diagnostik
Default: false
Lingkungan: TS_NODE_PRETTY
TS_NODE_DEBUG=true ts-nodeAktifkan Debug Logging
ts-node -r < module name or path >
ts-node --require < module name or path >Membutuhkan modul node sebelum eksekusi
ts-node --cwd < path/to/directory >Berperilaku seolah -olah dipanggil dalam direktori kerja ini
Default: process.cwd()
Lingkungan: TS_NODE_CWD
ts-node --emit Memancarkan file output ke direktori .ts-node . Membutuhkan --compilerHost
Default: false
Lingkungan: TS_NODE_EMIT
ts-node --scope SCOPE COMPILER UNTUK FILE DALAM scopeDir . Apa pun di luar direktori ini diabaikan.
Default: false
Lingkungan: TS_NODE_SCOPE
ts-node --scopeDir < path/to/directory > Direktori di mana kompiler terbatas saat scope diaktifkan.
Default: Pertama dari: tsconfig.json "rootdir" jika ditentukan, direktori yang mengandung tsconfig.json , atau cwd jika tidak ada tsconfig.json dimuat.
Lingkungan: TS_NODE_SCOPE_DIR
Menggantikan jenis modul file tertentu, mengabaikan bidang package.json "type" . Lihat Module Type Overrides untuk detailnya.
Default: Obeys package.json "type" dan tsconfig.json "module"
Hanya dapat ditentukan melalui tsconfig.json atau API.
TS_NODE_HISTORY= < path/to/history/file > ts-nodeJalur ke file riwayat untuk repl
Default: ~/.ts_node_repl_history
ts-node --noExperimentalReplAwait Nonaktifkan tingkat atas menunggu di repl. Setara dengan node --no-experimental-repl-await
Default: Diaktifkan jika versi TypeScript adalah 3.8 atau lebih tinggi dan target ES2018 atau lebih tinggi.
Lingkungan: TS_NODE_EXPERIMENTAL_REPL_AWAIT Set false untuk dinonaktifkan
Aktifkan kait eksperimental yang memetakan ulang impor dan memerlukan panggilan untuk mendukung:
import "./foo.js" akan mengeksekusi foo.ts Saat ini ekstensi berikut akan dipetakan:.js to .ts , .tsx , atau .jsx.cjs ke .cts.mjs ke .mts.jsx ke .tsxDi masa depan, kait ini juga akan mendukung:
baseUrl , pathsrootDirsoutDir ke pemetaan rootDir untuk proyek gabungan dan monoreposUntuk detailnya, lihat #1514.
Default: false , tetapi kemungkinan akan diaktifkan secara default di versi mendatang
Hanya dapat ditentukan melalui tsconfig.json atau API.
ts-node --experimentalSpecifierResolution node Seperti node --experimental-specifier-resolution , tetapi juga dapat diatur dalam tsconfig.json Anda untuk kenyamanan. Membutuhkan esm untuk diaktifkan.
Default: explicit
API termasuk opsi tambahan yang tidak ditampilkan di sini.
Dukungan SWC bawaan melalui bendera --swc atau "swc": true .
SWC adalah transpiler yang kompatibel dengan naskah yang diimplementasikan dalam karat. Ini membuatnya menjadi urutan besarnya lebih cepat dari vanilla transpileOnly .
Untuk menggunakannya, pertama instal @swc/core atau @swc/wasm . Jika menggunakan importHelpers , juga instal @swc/helpers . Jika target kurang dari "ES2015" dan menggunakan fungsi async / await atau Generator, juga instal regenerator-runtime .
npm i -D @swc/core @swc/helpers regenerator-runtime Kemudian tambahkan yang berikut ini ke tsconfig.json Anda.
{
"ts-node" : {
"swc" : true
}
}SWC menggunakan
@swc/helpersbukantslib. Jika Anda telah mengaktifkanimportHelpers, Anda juga harus menginstal@swc/helpers.
TypeScript hampir selalu ditulis menggunakan sintaks import modern, tetapi juga diubah sebelum dieksekusi oleh runtime yang mendasarinya. Anda dapat memilih untuk bertransformasi ke CommonJS atau untuk melestarikan sintaks import asli, menggunakan dukungan ESM asli Node. Konfigurasi berbeda untuk masing -masing.
Berikut adalah perbandingan singkat dari keduanya.
| Commonjs | Modul ecmascript asli |
|---|---|
Tulis Sintaks import Asli | Tulis Sintaks import Asli |
Mengubah import menjadi require() | Tidak mengubah import |
| Node mengeksekusi skrip menggunakan commonJs loader klasik | Node menjalankan skrip menggunakan ESM Loader baru |
Gunakan salah satu dari:ts-nodenode -r ts-node/registerNODE_OPTIONS="ts-node/register" noderequire('ts-node').register({/* options */}) | Gunakan salah satu dari:ts-node --esmts-node-esmSetel "esm": true di tsconfig.jsonnode --loader ts-node/esmNODE_OPTIONS="--loader ts-node/esm" node |
Transforming menjadi CommonJS biasanya lebih sederhana dan lebih banyak didukung karena lebih tua. Anda harus menghapus "type": "module" dari package.json dan atur "module": "CommonJS" di tsconfig.json .
{
// This can be omitted; commonjs is the default
"type" : "commonjs"
} {
"compilerOptions" : {
"module" : "CommonJS"
}
} Jika Anda harus menyimpan "module": "ESNext" untuk tsc , Webpack, atau alat build lainnya, Anda dapat mengatur override untuk TS-Node.
{
"compilerOptions" : {
"module" : "ESNext"
} ,
"ts-node" : {
"compilerOptions" : {
"module" : "CommonJS"
}
}
} Pengait Loader ESM Node bersifat eksperimental dan dapat berubah. Dukungan ESM TS-Node stabil mungkin, tetapi bergantung pada API mana yang dapat dan akan pecah dalam versi baru dari node. Dengan demikian tidak disarankan untuk produksi.
Untuk penggunaan lengkap, keterbatasan, dan untuk memberikan umpan balik, lihat #1007.
Anda harus mengatur "type": "module" di package.json dan "module": "ESNext" di 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
}
} Anda juga harus memastikan node dilewatkan --loader . TS-Node CLI akan melakukan ini secara otomatis dengan opsi esm kami.
Catatan:
--esmharus menelurkan proses anak untuk melewatinya--loader. Ini dapat berubah jika node menambahkan kemampuan untuk menginstal kait pemuat ke dalam proses saat ini.
# 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-nodeJika Anda tidak menggunakan CLI kami, berikan bendera Loader ke Node.
node --loader ts-node/esm ./index.ts
# Or via environment variable
NODE_OPTIONS= " --loader ts-node/esm " node ./index.ts TS-Node menggunakan konfigurasi default yang masuk akal untuk mengurangi boilerplate sambil tetap menghormati tsconfig.json jika Anda memilikinya. Jika Anda tidak yakin konfigurasi mana yang digunakan, Anda dapat mencatatnya dengan ts-node --showConfig . Ini mirip dengan tsc --showConfig tetapi termasuk opsi "ts-node" juga.
TS-Node juga menghormati versi typescript Anda yang dipasang secara lokal, tetapi instalasi global mundur ke typescript yang dipasang secara global. Jika Anda tidak yakin versi mana yang digunakan, ts-node -vv akan mencatatnya.
$ 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 "
}
} Penting untuk membedakan antara kesalahan dari TS-node, kesalahan dari kompiler TypeScript, dan kesalahan dari node . Penting juga untuk dipahami ketika kesalahan disebabkan oleh kesalahan jenis dalam kode Anda, bug dalam kode Anda, atau cacat dalam konfigurasi Anda.
TSError Ketik kesalahan dari kompiler dilemparkan sebagai TSError . Ini sama dengan kesalahan yang Anda dapatkan dari tsc .
SyntaxError Kesalahan apa pun yang bukan TSError dari node.js (misalnya SyntaxError ), dan tidak dapat diperbaiki dengan naskah atau TS-node. Ini adalah bug dalam kode atau konfigurasi Anda.
Versi node Anda mungkin tidak mendukung semua sintaks JavaScript yang didukung oleh TypeScript. Kompiler harus mengubah sintaks ini melalui "Downleveling," yang dikendalikan oleh opsi "target" Tsconfig. Kalau tidak, kode Anda akan dikompilasi dengan baik, tetapi Node akan melempar SyntaxError .
Misalnya, node 12 tidak mengerti ?. Operator Rantai Opsional. Jika Anda menggunakan "target": "esnext" , maka sintaks TypeScript berikut:
const bar : string | undefined = foo ?. bar ;akan menyusun ke dalam javascript ini:
const a = foo ?. bar ; Saat Anda mencoba menjalankan kode ini, Node 12 akan melempar SyntaxError . Untuk memperbaikinya, Anda harus beralih ke "target": "es2019" atau lebih rendah So TypeScript Transforms ?. menjadi sesuatu yang bisa dipahami oleh node .
ERR_REQUIRE_ESM Kesalahan ini dilemparkan oleh simpul ketika suatu modul require() D, tetapi Node percaya itu harus dieksekusi sebagai ESM asli. Ini bisa terjadi karena beberapa alasan:
webpack.config.ts , yang harus dieksekusi sebagai CommonJS.ctsERR_UNKNOWN_FILE_EXTENSIONKesalahan ini dilemparkan oleh node ketika modul memiliki ekstensi file yang tidak diakui, atau tidak ada ekstensi sama sekali, dan sedang dieksekusi sebagai ESM asli. Ini bisa terjadi karena beberapa alasan:
mocha .ts-node-esm , ts-node --esm , atau tambahkan "ts-node": {"esm": true} ke tsconfig.json Anda. Dokumenwebpack.config.ts , yang harus dieksekusi sebagai CommonJS.cts TS-Node tidak dengan bersemangat memuat files , include atau exclude secara default. Ini karena sebagian besar proyek tidak menggunakan semua file dalam direktori proyek ( Gulpfile.ts tes runtime vs) dan parsing setiap file untuk jenis waktu startup yang memperlambat. Sebaliknya, TS-Node dimulai dengan file skrip (misalnya ts-node index.ts ) dan TypeScript menyelesaikan dependensi berdasarkan impor dan referensi.
Kadang -kadang, optimasi ini menyebabkan tipe yang hilang. Untungnya, ada cara lain untuk memasukkannya dalam ketypecking.
Untuk definisi global, Anda dapat menggunakan opsi typeRoots Compiler. Ini mengharuskan definisi tipe Anda disusun sebagai paket tipe (bukan file definisi TypeScript longgar). Rincian lebih lanjut tentang cara kerjanya dapat ditemukan di Buku Pegangan TypeScript.
Contoh tsconfig.json :
{
"compilerOptions" : {
"typeRoots" : [ "./node_modules/@types" , "./typings" ]
}
}Contoh Struktur Proyek:
<project_root>/
-- tsconfig.json
-- typings/
-- <module_name>/
-- index.d.ts
Contoh File Deklarasi Modul:
declare module '<module_name>' {
// module definitions go here
} Untuk definisi modul, Anda dapat menggunakan paths :
{
"compilerOptions" : {
"baseUrl" : "." ,
"paths" : {
"custom-module-type" : [ "types/custom-module-type" ]
}
}
} Pilihan lain adalah arahan triple-slash. Ini mungkin bermanfaat jika Anda lebih suka tidak mengubah compilerOptions atau menyusun definisi tipe Anda untuk typeRoots . Di bawah ini adalah contoh arahan triple-slash sebagai jalur relatif dalam proyek Anda:
/// <reference path="./types/lib_greeter" />
import { Greeter } from "lib_greeter"
const g = new Greeter ( ) ;
g . sayHello ( ) ; Jika tidak ada yang berfungsi di atas, dan Anda harus menggunakan files , include , atau exclude , mengaktifkan opsi files kami.
Saat mengeksekusi naskah dengan npx atau yarn dlx , kode berada dalam direktori node_modules sementara.
Isi node_modules diabaikan secara default. Jika eksekusi gagal, aktifkan skipIgnore .
Trik-trik ini akan membuat TS-simpul lebih cepat.
Seringkali lebih baik untuk mengetik sebagai bagian dari tes atau berbaris Anda. Anda dapat menjalankan tsc --noEmit untuk melakukan ini. Dalam kasus ini, TS-node dapat melewatkan typechecking, membuatnya jauh lebih cepat.
Untuk melewatkan typechecking di TS-node, lakukan salah satu dari yang berikut:
transpileOnly untuk melewatkan ketypecking tanpa swc Jika Anda benar-benar harus mengetik di TS-Node:
require() yang dapat memicu ketycecking berulang; lebih suka import--files ; Seseorang mungkin lebih cepat tergantung pada proyek Andatsc --showConfig ; Pastikan semua file yang dieksekusi disertakanskipLibChecktypes untuk menghindari memuat @types yang tidak perlu TS-Node bekerja dengan mendaftarkan kait untuk .ts , .tsx , .js , dan/atau .jsx ekstensi.
Vanilla node memuat .js dengan membaca kode dari disk dan mengeksekusi itu. Kait kami berjalan di tengah, mengubah kode dari naskah ke JavaScript dan meneruskan hasilnya ke node untuk dieksekusi. Transformasi ini akan menghormati tsconfig.json Anda seolah -olah Anda telah menyusun melalui tsc .
Kami juga mendaftarkan beberapa kait lain untuk menerapkan Sourcemaps ke menumpuk jejak dan memetakan kembali dari .js impor ke .ts .
TS-Node mengubah file tertentu dan mengabaikan orang lain. Kami menyebut mekanisme ini sebagai "pelingkupan." Ada berbagai opsi untuk mengonfigurasi pelingkupan, sehingga TS-Node hanya mengubah file dalam proyek Anda.
Peringatan:
File yang diabaikan masih dapat dieksekusi oleh Node.js. Mengabaikan file berarti kami tidak mengubahnya dari naskah menjadi JavaScript, tetapi itu tidak mencegah eksekusi.
Jika suatu file membutuhkan transformasi tetapi diabaikan, Node mungkin gagal untuk menyelesaikannya atau mencoba menjalankannya sebagai vanilla javascript. Ini dapat menyebabkan kesalahan sintaks atau kegagalan lainnya, karena Node tidak memahami sintaks tipe tipe naskah atau fitur ecmascript edge pendarahan.
.js dan .jsx hanya ditransformasikan saat allowJs diaktifkan.
.tsx dan .jsx hanya ditransformasikan ketika jsx diaktifkan.
Peringatan:
Ketika TS-Node digunakan dengan
allowJs, semua file JavaScript yang tidak ditanamkan diubah oleh TS-Node.
node_modules Secara default, TS-simpul menghindari menyusun file di /node_modules/ karena tiga alasan:
Jika Anda perlu mengimpor naskah tanpa kompilasi di node_modules , gunakan --skipIgnore atau TS_NODE_SKIP_IGNORE untuk mem -bypass pembatasan ini.
Jika file JavaScript yang dikompilasi dengan nama yang sama dengan file TypeScript sudah ada, file TypeScript akan diabaikan. TS-Node akan mengimpor JavaScript yang telah dikompilasi sebelumnya.
Untuk memaksa TS-Node untuk mengimpor sumber SPRICK, bukan JavaScript yang dikompilasi, gunakan --preferTsExts .
Opsi scope dan scopeDir kami akan membatasi transformasi ke file dalam direktori.
Opsi ignore kami akan mengabaikan file yang cocok dengan satu atau lebih ekspresi reguler.
Anda dapat menggunakan TS-Node bersama-sama dengan Tsconfig-paths untuk memuat modul sesuai dengan bagian paths di tsconfig.json .
{
"ts-node" : {
// Do not forget to `npm i -D tsconfig-paths`
"require" : [ "tsconfig-paths/register" ]
}
} Buku Pegangan TypeScript resmi menjelaskan tujuan yang dimaksudkan untuk "paths" dalam "bendera resolusi modul tambahan".
Kompiler naskah memiliki satu set bendera tambahan untuk menginformasikan kompiler transformasi yang diharapkan terjadi pada sumber untuk menghasilkan output akhir.
Penting untuk dicatat bahwa kompiler tidak akan melakukan transformasi ini; Ini hanya menggunakan informasi ini untuk memandu proses penyelesaian impor modul ke file definisi.
Ini berarti "paths" dimaksudkan untuk menggambarkan pemetaan yang sudah dilakukan oleh alat build atau runtime, bukan untuk memberi tahu alat build atau runtime cara menyelesaikan modul. Dengan kata lain, mereka bermaksud untuk menulis impor kami dengan cara yang sudah dipahami oleh node . Untuk alasan ini, TS-Node tidak memodifikasi perilaku resolusi modul node untuk mengimplementasikan "paths" pemetaan.
Beberapa proyek memerlukan kompiler TypeScript yang ditambal yang menambahkan fitur tambahan. Misalnya, ttypescript dan ts-patch menambah kemampuan untuk mengkonfigurasi transformator kustom. Ini adalah penggantian drop-in untuk modul Vanilla typescript dan mengimplementasikan API yang sama.
Misalnya, untuk menggunakan ttypescript dan ts-transformer-keys , tambahkan ini ke tsconfig.json Anda:
{
"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 mendukung transpiler pihak ketiga sebagai plugin. Transpiler seperti SWC dapat mengubah naskah menjadi JavaScript lebih cepat daripada kompiler TypeScript. Anda masih akan mendapat manfaat dari penemuan tsconfig.json otomatis TS-Node, dukungan Sourcemap, dan Global TS-Node CLI. Plugin secara otomatis memperoleh konfigurasi yang sesuai dari tsconfig.json yang ada yang menyederhanakan boilerplate proyek.
Apa perbedaan antara kompiler dan transpiler?
Untuk tujuan kami, kompiler mengimplementasikan API TypeScript dan dapat melakukan typechecking. Transpiler pihak ketiga tidak. Keduanya mengubah naskah naskah menjadi JavaScript.
Opsi transpiler memungkinkan menggunakan plugin transpiler pihak ketiga dengan TS-Node. transpiler harus diberi nama modul yang dapat require() d. Plugin swc bawaan diekspos sebagai ts-node/transpilers/swc .
Misalnya, untuk menggunakan hipotetis " @cspotcode/fast-ts-compiler", pertama-tama instal ke proyek Anda: npm install @cspotcode/fast-ts-compiler
Kemudian tambahkan yang berikut ini ke tsconfig Anda:
{
"ts-node" : {
"transpileOnly" : true ,
"transpiler" : "@cspotcode/fast-ts-compiler"
}
}Untuk menulis plugin transpiler Anda sendiri, periksa dokumen API kami.
Plugin require() D oleh TS-Node, sehingga mereka dapat berupa skrip lokal atau modul node yang diterbitkan ke NPM. Modul harus mengekspor fungsi create yang dijelaskan oleh antarmuka TranspilerModule kami. create dipanggil oleh TS-Node saat startup untuk membuat satu atau lebih instance transpiler. Contoh digunakan untuk mengubah naskah menjadi JavaScript.
Sebagai contoh yang berfungsi, lihat plugin SWC bundel kami: https://github.com/typestrong/ts-node/blob/main/src/transpilers/swc.ts
Sedapat mungkin, disarankan untuk menggunakan mode
NodeNextatauNode16TypeScript alih -alih opsi yang dijelaskan di bagian ini. Pengaturan"module": "NodeNext"dan menggunakan ekstensi file.ctsharus bekerja dengan baik untuk sebagian besar proyek.
Saat memutuskan bagaimana file harus dikompilasi dan dieksekusi-sebagai modul CommonJs atau ecmascript asli-TS-Node cocok dengan node dan perilaku tsc . Ini berarti file naskah ditransformasikan sesuai dengan opsi "module" tsconfig.json Anda dan dieksekusi sesuai dengan aturan Node untuk bidang package.json "type" . Atur "module": "NodeNext" dan semuanya harus berfungsi.
Dalam kasus yang jarang terjadi, Anda mungkin perlu mengesampingkan perilaku ini untuk beberapa file. Misalnya, beberapa alat membaca name-of-tool.config.ts dan meminta file itu untuk dieksekusi sebagai CommonJS. Jika Anda memiliki package.json yang dikonfigurasi dengan "type": "module" dan tsconfig.json dengan "module": "esnext" , konfigurasi adalah ecmascript asli secara default dan akan menimbulkan kesalahan. Anda perlu memaksa konfigurasi dan skrip pendukung untuk dieksekusi sebagai CommonJS.
Dalam situasi ini, opsi moduleTypes kami dapat mengganti file tertentu menjadi umum atau ESM. Overriding serupa dimungkinkan dengan menggunakan ekstensi file .mts , .cts , .cjs dan .mjs . moduleTypes mencapai efek yang sama untuk file .ts dan .js , dan juga mengesampingkan "module" tsconfig.json Anda dengan tepat.
Contoh berikut memberi tahu TS-Node untuk menjalankan konfigurasi webpack sebagai 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"
}
} Setiap kunci adalah pola glob dengan sintaks yang sama dengan array Tsconfig "include" . Ketika beberapa pola cocok dengan file yang sama, pola terakhir diutamakan.
cjs mengesampingkan file yang cocok untuk dikompilasi dan dieksekusi sebagai CommonJS.esm mengesampingkan file yang cocok untuk dikompilasi dan dieksekusi sebagai modul ecmascript asli.package mengatur ulang salah satu dari perilaku default di atas, yang mematuhi opsi "type" opsi "module" tsconfig.json package.json File dengan tipe modul yang ditimpa ditransformasikan dengan batasan yang sama dengan isolatedModules . Ini hanya akan mempengaruhi kasus -kasus langka seperti menggunakan const enum s dengan preserveConstEnums dinonaktifkan.
Fitur ini dimaksudkan untuk memfasilitasi skenario di mana compilerOptions normal dan package.json konfigurasi tidak dimungkinkan. Misalnya, webpack.config.ts tidak dapat diberikan package.json sendiri. JSON untuk mengganti "type" . Sedapat mungkin Anda harus menyukai menggunakan package.json tradisional.json dan tsconfig.json konfigurasi.
API Lengkap TS-Node didokumentasikan di sini: API Documents
Berikut adalah beberapa sorotan dari apa yang dapat Anda capai:
create() membuat layanan kompiler TS-Node tanpa mendaftarkan kait apa pun.createRepl() membuat instance dari layanan REPL kami, sehingga Anda dapat membuat repls bertenaga TypeScript Anda sendiri.createEsmHooks() membuat kait Loader ESM kami, cocok untuk menyusun loader lain atau menambah dengan fitur tambahan.TS-Node berfokus pada penambahan dukungan naskah kelas satu ke node. Menonton file dan kode ulang kode di luar ruang lingkup untuk proyek.
Jika Anda ingin memulai kembali proses ts-node pada perubahan file, alat Node.js yang ada seperti Nodemon, Onchange dan Node-Dev Work.
Ada juga ts-node-dev , versi yang dimodifikasi dari node-dev menggunakan ts-node untuk kompilasi yang akan memulai kembali proses pada perubahan file. Perhatikan bahwa ts-node-dev tidak kompatibel dengan loader ESM asli kami.
Dengan asumsi Anda mengkonfigurasi AVA melalui package.json Anda. JSON, tambahkan salah satu konfigurasi berikut.
Gunakan konfigurasi ini jika package.json Anda.json tidak memiliki "type": "module" .
{
"ava" : {
"extensions" : [
"ts"
] ,
"require" : [
"ts-node/register"
]
}
} Konfigurasi ini diperlukan jika package.json Anda.json memiliki "type": "module" .
{
"ava" : {
"extensions" : {
"ts" : "module"
} ,
"nonSemVerExperiments" : {
"configurableModuleFormat" : true
} ,
"nodeArguments" : [
"--loader=ts-node/esm"
]
}
} Dukungan TS-Node bawaan untuk Gulp.
# Create a `gulpfile.ts` and run `gulp`.
gulpLihat juga: https://gulpjs.com/docs/en/getting-started/javascript-and-gulpfiles#transpilation
Buat konfigurasi node.js baru dan tambahkan -r ts-node/register ke "parameter simpul."
Catatan: Jika Anda menggunakan argumen baris perintah --project <tsconfig.json> sesuai dengan opsi konfigurasi, dan ingin menerapkan perilaku yang sama saat diluncurkan di Intellij, tentukan di bawah "Variabel Lingkungan": TS_NODE_PROJECT=<tsconfig.json> .
mocha --require ts-node/register --extensions ts,tsx --watch --watch-files src ' tests/**/*.{ts,tsx} ' [...args]Atau tentukan opsi melalui file konfigurasi mocha Anda.
{
// 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"
]
}Lihat juga: https://mochajs.org/#configuring-mocha-nodeJs
mocha --require ts-node/register --watch-extensions ts,tsx " test/**/*.{ts,tsx} " [...args] CATATAN: --watch-extensions hanya digunakan dalam mode --watch Mode.
ts-node node_modules/tape/bin/tape [...args] Buat konfigurasi debug node.js baru, tambahkan -r ts-node/register ke node args dan pindahkan program ke daftar args (jadi vs kode tidak mencari outFiles ).
{
"configurations" : [ {
"type" : "node" ,
"request" : "launch" ,
"name" : "Launch Program" ,
"runtimeArgs" : [
"-r" ,
"ts-node/register"
] ,
"args" : [
"${workspaceFolder}/src/index.ts"
]
} ] ,
} CATATAN: Jika Anda menggunakan argumen baris --project <tsconfig.json> sesuai dengan opsi konfigurasi, dan ingin menerapkan perilaku yang sama ini saat meluncurkan dalam kode VS, tambahkan tombol "Env" ke dalam konfigurasi peluncuran: "env": { "TS_NODE_PROJECT": "<tsconfig.json>" } .
Dalam banyak kasus, pengaturan NODE_OPTIONS akan memungkinkan ts-node dalam alat simpul lain, proses anak, dan utas pekerja.
NODE_OPTIONS= " -r ts-node/register "Atau, jika Anda memerlukan dukungan ESM asli:
NODE_OPTIONS= " --loader ts-node/esm " Ini memberi tahu setiap proses node yang menerima variabel lingkungan ini untuk menginstal kait ts-node sebelum menjalankan kode lain.
TS-Node dilisensikan di bawah lisensi MIT. Mit
TS-Node termasuk kode sumber dari Node.js yang dilisensikan di bawah lisensi MIT. Informasi Lisensi Node.js
TS-Node termasuk kode sumber dari kompiler TypeScript yang dilisensikan di bawah Lisensi Apache 2.0. Informasi Lisensi TypeScript