💨

CLI で TypeScript をぺろっと実行したいメモ

2023/03/05に公開

C/C++ がメインであるが, 機械学習アプリの web サービス公開や, サーバ側で機械学習タスクさばくなどで JS(nodejs) つかう必要でてきた. 時代は型なので TypeScript でやりたい.

TypeScript で型つきの JS コードを node.js みたいに CLI でぺろっと実行したい.
(ちょっとした確認とかテストなどで)
C/C++ での clang++ main.cc みたいな...

最近(2022/03)だと CLI(nodejs 的)TypeScript 対応ランタイムは主に 3 つあるかと思います.
だいたいなにかの package(node_module)は使うと思いますので, Hermes はキワモノ扱いで除外します.

  • ts-node(nodejs)
  • deno
  • bun

TypeScript も JavaScript も CJS やら EMS やら, ES6 やら ESNext やらいろいろ方言などあってよくわからんです

ts-node

$ npm install -g ts-node

とかで入ります. でも普通に

$ ts-node main.ts

とかやっても import 対応してねーよとかエラー出されます... 😓

import axios from 'axios';
^^^^^^

SyntaxError: Cannot use import statement outside a module

https://zenn.dev/qnighy/articles/19603f11d5f264

$ node --loader ts-node/esm main.ts

としないとだめでした.

ただこれでもライブラリによってはライブラリ側でエラー出ます
(typed-rest-client など)

deno

$ deno run main.ts

でいけますが, デフォだと permission 無いので毎回いろいろきかれてめんどいです.

-A で permission 全部 OK にして対応します.

$ deno run -A main.ts

ts のコンパイルにちょっと時間かかる印象があります.

サードパーティーのライブラリ対応度は nodejs と同じ感じでしょうか.

bun

TS を直実行? するので起動が速い印象あります.

bun main.ts で実行できますが, サードパーティーライブラリは未対応のが多いのか型エラーとかでてダメっぽいようです.

たとえば axios で

axios.get('https://httpbin.org/get', {}).then(function (response) {
      console.log(response);
    });

みたいな httpbin からデータ取得するコード実行すると,

23 | import formDataToStream from "../helpers/formDataToStream.js";
24 | import readBlob from "../helpers/readBlob.js";
25 | import ZlibHeaderTransformStream from '../helpers/ZlibHeaderTransformStream.js';
26 |
27 | const zlibOptions = {
28 |   flush: zlib.constants.Z_SYNC_FLUSH,
             ^
TypeError: undefined is not an object (evaluating 'zlib.constants.Z_SYNC_FLUSH')

となります.

https://github.com/oven-sh/bun/tree/main/packages/bun-types

bun-types で設定試みましたがだめでした.
自前で型情報つけるしかないのかも... ですがめんどいですね.
(サードパーティーかつ .js なのは型チェックとか無視する設定ないだろうか...)

まとめ

とりあえずは deno, その次は ts-node, それでもだめだったら tsc main.ts で直コンパイルでしょうかね.
(また, コンパイル後の main.js は main.cjs に拡張子変えないと node で実行できないっぽい)

おまけ(vite)

vite ですと live reload で便利かもしれません
(内部的には tsc を呼ぶようにして対応)

ただ, package.json とか用意しないといけないのでぺろっといけるわけではないのでめんどい.

Discussion