ウェブサイト検索

node.js - コマンドラインからTypeScriptファイルを実行する方法は?


これに対する答えを見つけるのに、驚くほど苦労しています。普通の Node.JS では、任意の js ファイルを node path/to/file.js で実行できます。CoffeeScript では coffee hello.coffee で、ES6 では babel-node hello.js です。TypeScript では同じことをどうやって行うのでしょうか?

私のプロジェクトには、Webpack/ts-loader がブラウザ用の小さなバンドルを作成するために使用する tsconfig.json があります。しかし、その前にコンソールから実行するビルドステップが必要で、そのステップではプロジェクトで使用されているいくつかの .ts ファイルを使ってスキーマを生成したいのですが、プロジェクト全体をコンパイルせずに単一の TypeScript ファイルを実行することができないようです。

回答 #1

あなたは tsc -w -p . を使って tsc をウォッチモードで実行したままにすることができ、そうすると .js ファイルがリアルタイムで生成されるので、通常通り node foo.js を実行できます。

プロジェクト全体をコンパイルせずに単一の TypeScript ファイルを実行するには、ts-node を使うことでコードをその場でコンパイルし、Node を通して実行することができます:

npx ts-node src/foo.ts

回答 #2

以下のコマンドを実行し、必要なパッケージをグローバルにインストールしてください:

npm install -g ts-node typescript '@types/node'

次に、TypeScript ファイルを実行するために次のコマンドを実行してください:

ts-node typescript-file.ts

回答 #3

tsx も試すことができます。tsx は TypeScript をシームレスに実行するための CLI コマンド(node の代替)で、esbuild を基盤としているため非常に高速です。

https://github.com/esbuild-kit/tsx

例:

npx tsx ./script.ts

回答 #4

以下の手順があります:

  1. まず最初に TypeScript をインストールする必要があります

    npm install -g typescript
    
  2. helloworld.tsというファイルを1つ作成する

    function hello(person){
       return "Hello, " + person;
    }
    let user = "Aamod Tiwari";
    const result = hello(user);
    console.log("Result", result)
    
  3. コマンドプロンプトを開き、次のコマンドを入力してください

    tsc helloworld.ts
    
  4. もう一度コマンドを実行してください

    node helloworld.js
    
  5. 結果はコンソールに表示されます

回答 #5

上記の@Aamodの回答に付け加えると、もし1つのコマンドラインでコードをコンパイルして実行したい場合、次の方法を使用できます。

ウィンドウズ :

tsc main.ts | node main.js

Linux/macOS:

tsc main.ts && node main.js

回答 #6

私は @digitak/esrun を作りました。これは esbuild の薄いラッパーで、TypeScript ファイルをほぼ瞬時に実行します。esrun は ts-node に失望したため作られました:遅すぎるし、ほとんどの場合うまく動作しませんでした。

ts-node に対する esrun の利点には以下が含まれます:

  • 非常に高速(esbuild を使用)
  • ESMだけでなくCJSもインポートできます(お好きなライブラリを使用するだけで、esrunはすぐに機能します)、
  • 含まれているウォッチモードがあります。--watch オプションを使ってスクリプトを実行すると、エントリーファイルやその依存関係のどの変更でも結果が再トリガーされます。
  • ターミナルコンソールの代わりに DevTools コンソールを使用するには、esrun をインスペクトモードで使用できます。

インストールしたら、次を実行してください:

npx @digitak/esrun file.ts

回答 #7

編集:2022年5月

`ts-node` には現在 `--esm` フラグがあり、これを使用してください。

古い回答:

他の回答のどれも、モジュールを使用するTypeScriptスクリプトの実行方法、特に最新のESモジュールの実行方法については触れていません。

まず第一に、2020年3月現在、そのシナリオでは ts-node は動作しません。ですので、tsc の後に node を使うことにします。

第二に、TypeScript はまだ .mjs ファイルを出力できません。だから、.js ファイルと package.json 内の "type": "module" で妥協します。

第三に、.ts ファイルでは混乱を招く可能性があるため、.js 拡張子を指定せずに、import 行をきれいにしたいです。

import { Lib } from './Lib';

さて、それは簡単ではありません。Nodeは、experimental-specifier-resolution=node フラグを使用しない限り、インポートで拡張子を指定することを 必要とします。この場合、Nodeは import 行で ./Lib のみを指定したときに、Lib.js や Lib/index.js を探すことが可能になります。

第四に、まだ問題があります:パッケージで index.js とは異なる main ファイル名を使用している場合、Node はそれを見つけられません。

トランスパイルすると、バニラのNodeを実行するよりも物事がずっと複雑になります。

これは、ESモジュールコードを生成する、モダンなTypeScriptプロジェクト構造を持つサンプルリポジトリです。

回答 #8

ただの参考情報です - こちらが最新の TypeScript/JavaScript ランタイム Deno です。

それは、Node の創設者であるライアン・ダールによって作られ、もし最初からやり直せるなら彼が何を違えて行うかに基づいています。

回答 #9

バンを使ってください。

それはより速く、たくさんのツールがバンドルされています。

bun run ./my-script.ts

回答 #10

2022年5月現在、ts-nodeはESモジュールをサポートしています

npx ts-node --esm file.ts

おそらく package.json に "type": "module", を追加する必要があります。また、experimental-specifier-resolution=node をオンにしないと、一部のインポートがうまく動作しないかもしれません。

npmjs.com/package/ts-node#commonjs-vs-native-ecmascript-modules

回答 #11

Linux/Mac では、ts-node-script のシェバンを追加できます。

TypeScript/ts-node をグローバルにインストールします(非グローバルインストールについては以下の1を参照):

npm install ts-node typescript --save-dev --global

これをあなたの .ts ファイルの最初の行として追加してください:

#!/usr/bin/env ts-node-script

それからファイルを実行可能にします:

chmod +x ./your-file.ts

その後、コマンドラインから直接ファイルを実行できます:

./your-file.ts

メモ:

1 グローバルインストールでない場合は、プロジェクトにローカルでインストールできます

npm install ts-node typescript --save-dev

そしてシェバングスクリプトに相対パスを追加します。例:

#!/usr/bin/env ./node_modules/.bin/ts-node-script

2 shebang のサポートは、ts-node v8.9.0 で公式に追加されました。

関連記事