SWC製のExecutorをリリースした

に公開
4

仕組み

コード、依存関係を全てプロセス単位でfullCodeGen関数で繋げ、Function constructorで実行しています。
Functionを使っているためsocket.devでevalのセキュリティリスク警告が指摘されていますが、これはモジュールローダー式でも同じNode.jsと同じ実行権限なのでchild_processなどから実行する(例えば特定のファイルを削除するコードの実行など)に関してはターミナルや類推するツールと同じ権限と挙動をします。
(これに関しては将来的にchild_processやexecaが実行できないようにセーフティにする可能性がありますが、基本的にはOSのセキュリティ権限はOSユーザー自体に依存することは変わりありません。)

型変換

TypeScript形式の変換にはタイトル通りSWCの@swc/coreを採用しています。
あくまで主観ですがoxcやesbuildなどに比べswcはチューニングが最先端を進んでいて一歩速い印象を受けます。

使い方

npm i -D rscute

npx

npx rscute file.ts

node(起動速い)

node -r rscute file.ts

プログラム

import { execute } from 'rscute/execute';

await execute(absolutePath)

await import()await execute()に置き換える

await import()を直接読み込むモジュールローダー式のtsxやjitiよりも圧倒的にパフォーマンス差が出ます。

速さ比較とか

実行環境

  Model Name: MacBook Air
  Model Identifier: MacBookAir10,1
  Chip: Apple M1
  Total Number of Cores: 8 (4 performance and 4 efficiency)
  Memory: 16 GB

実行するコード

const hello: string = 'Hello, world!';
console.log(hello);

rscute

fast_test % time node -r rscute testy.ts
Hello, world!
node -r rscute testy.ts  0.04s user 0.01s system 85% cpu 0.062 total

node type-stripping(現段階)

time node testy.ts
Hello, world!
(node:32920) ExperimentalWarning: Type Stripping is an experimental feature and might change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
node testy.ts  0.07s user 0.01s system 98% cpu 0.089 total

npxでbinを検索すること自体に約80ms(0.08秒)がかかるため、mtsを最初のエントリーポイントに選ばない場合はnode -rで起動してあげると良さそうです。

非対応のケース

CJSで書かれたIIFEとアロー関数を含む無名関数のデフォルトエクスポートには非対応です。
その場合関数名を付けてあげる対処をしてあげてください。
IIFEの場合は即時発火されるためデフォルトエクスポートの意味がないため厳密には非対応というか実装されていません。

Discussion

ryoppippiryoppippi

こんにちは!
Node v22には--experimental-strip-types--experimental-transform-typesオプションをつけてtsを実行できるようになっています。そちらも内部実装ではswcを使っているはずです。こちらとの比較も気になりました!とはいえtsxも実行できるのはすごいですね!

RefirstRefirst

@ryoppippiさん コメントありがとうございます!!
Node v22の --experimental-strip-types--experimental-transform-types今も実験的機能なのはもちろんですがstrip-typesの内部は@swc/wasm-typescriptで型を削る仕組みなのでパス解決まで行うと相当難しいと思っています。

globやtest runnerなどもそうですが、公式のNode.js機能よりもサードパーティの方が強かったりします。
実際にはNode.js公式ドキュメントでライブラリ側を例にするドキュメントを書いているので
Node.jsチームが--experimentalを本格的にサポートする意思があるのか不透明なところではあります。

パス解決がサポートされていたら作らないでそっち使っています!
https://nodejs.org/docs/latest/api/typescript.html#type-stripping
ここにパス解決やtsconfig.jsonの設定に依存する実行はサードパーティのTSXなどを使うことが推奨として書かれているみたいです。

esbuildやswc, oxcの成熟にネイティブのNode.jsが追いつけるかどうか次第ですが期待しています。

ryoppippiryoppippi

@Refirstさん!ありがとうございます!なるほどそうですね!パス解決を考えるとrscuteのほうが良いのは確かに合点がいきました!詳細なコメントありがとうございます!!!

ryoppippiryoppippi

個人的にはプロジェクトでjitiimportxtsx.importを使うことが多いので、ここら辺の代替になることを願っています!