⚡
SWC製のExecutorをリリースした
仕組み
コード、依存関係を全てプロセス単位で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
こんにちは!
Node v22には
--experimental-strip-types
や--experimental-transform-types
オプションをつけてtsを実行できるようになっています。そちらも内部実装ではswcを使っているはずです。こちらとの比較も気になりました!とはいえtsxも実行できるのはすごいですね!@ryoppippiさん コメントありがとうございます!!
Node v22の
--experimental-strip-types
と--experimental-transform-types
今も実験的機能なのはもちろんですがstrip-typesの内部は@swc/wasm-typescriptで型を削る仕組みなのでパス解決まで行うと相当難しいと思っています。globやtest runnerなどもそうですが、公式のNode.js機能よりもサードパーティの方が強かったりします。
実際にはNode.js公式ドキュメントでライブラリ側を例にするドキュメントを書いているので
Node.jsチームが
--experimental
を本格的にサポートする意思があるのか不透明なところではあります。パス解決がサポートされていたら作らないでそっち使っています!
ここにパス解決やtsconfig.jsonの設定に依存する実行はサードパーティのTSXなどを使うことが推奨として書かれているみたいです。esbuildやswc, oxcの成熟にネイティブのNode.jsが追いつけるかどうか次第ですが期待しています。
@Refirstさん!ありがとうございます!なるほどそうですね!パス解決を考えると
rscute
のほうが良いのは確かに合点がいきました!詳細なコメントありがとうございます!!!個人的にはプロジェクトで
jiti
、importx
、tsx.import
を使うことが多いので、ここら辺の代替になることを願っています!