3 ポイント 投稿者 GN⁺ 2024-07-26 | 1件のコメント | WhatsAppで共有

モジュール: --experimental-strip-types を追加

  • Node.jsでTypeScriptファイルを実行可能

    • --experimental-strip-types フラグを設定すると、TypeScriptファイルを実行できる
    • Node.jsはTypeScriptソースコードをJavaScriptソースコードに変換する
    • 変換過程で型チェックは行われず、型は削除される
  • 動機

    • TypeScriptファイルを外部依存関係やローダーなしで実行できるようにすることが重要
    • ユーザーが node foo.ts を実行できるようにしたい
  • 型ストリッピングの意味

    • 型ストリッピングとは、すべての型を削除して入力をJavaScriptモジュールに変換すること
    • 例: const foo: string = "foo";const foo = "foo"; に変換される
  • @swc/wasm-typescript を選んだ理由

    • シンプルだから
    • 他のツールではRustやGoを追加する必要があるが、@swc/wasm-typescriptは小さなパッケージで、wasmとjsファイルだけが必要
    • Denoでも使われており、信頼できる
  • 制限事項

    • Enum、名前空間などTypeScript専用機能は変換されない
    • 拡張子なしのインポートはサポートされない
  • 今後の計画

    • ネイティブレイヤーで実装される可能性がある
    • ソースマップ対応を追加できる可能性がある

GN⁺のまとめ

  • Node.jsでTypeScriptファイルを実行できるようにする新機能について説明
  • TypeScriptファイルをJavaScriptに変換して実行可能にし、型チェックは行わない
  • これにより、ユーザーは外部依存関係なしでTypeScriptファイルを実行でき、開発環境を簡素化できる
  • この機能は@swc/wasm-typescriptを使って実装されており、将来的にはネイティブレイヤーでの実装も検討されている
  • TypeScriptとJavaScriptを混在させて使うプロジェクトに有用となる可能性がある

1件のコメント

 
GN⁺ 2024-07-26
Hacker News のコメント
  • TypeScript の型を取り除くことは、TypeScript の構文なしには不可能。型の除去はトークンレベルの作業ではなく、TypeScript の構文は今も変化し続けている

    • 例えば、foo < bar & baz > ( x ) は TypeScript 1.5 では異なる解釈だった
    • 新しい TypeScript 機能を使うには、JS にコンパイルするか、Node のバージョンを最新に保つ必要がある
    • Node LTS リリースを使う人にとっては、妥協が難しいかもしれない
  • Node.js が TypeScript ファイルを直接実行できるなら、TypeScript コンパイラは型を取り除いて JavaScript に変換する必要がなくなるはず

    • これは Python の状況に似ている
    • Python には複数の型チェッカーがあり、どれも同じ型ヒント構文を使うが、異なる意味付けをしている
    • JavaScript では TypeScript が唯一の人気のある型チェッカーになっている
    • Python では型ヒントをコメントのように使う人もいる
    • Node.js で型を無視する機能がサポートされれば、JavaScript でも可能になるはず
  • この機能がデフォルトになったら、NPM エコシステムがどう反応するのか気になる

    • NPM モジュールを公開するとき、CJS と EJS のバージョンを引き続きビルドするのか、それとも package.json に engine: nodejs >= 25 を追加してビルド工程を省くのか悩ましい
    • 個人的には、TS で書かれた NPM モジュールがもう dist/.cjs を提供しなくなってほしい
    • ビルド工程を省くのは NPM コントリビューターにとって魅力的だろう
    • これは NPM エコシステムに波及効果をもたらす可能性がある
    • Node.js がこの機能を実験的フラグなしで提供すれば、すべての利用者が TS ファイルを受け入れるようになると予想される
    • それは Firefox や Safari にも TS ファイルの受け入れを強いるかもしれない
    • 個人的には、JS コンパイラが TS の型注釈を捨てることを歓迎する
    • Node が .ts ファイルを受け入れれば、トランスコンパイル工程をなくせる
  • Node が JS 内の型を調べられるようになれば、大きな利益になるはず

    • Python には pydantic のようなツールがあり、型を調べて検証を生成する
    • それにより、単一の標準表記で型チェック、ランタイムデータ検証、API 生成、API ドキュメント生成が可能になる
    • 現在の JS では zod のようなツールが必要になる
  • Bun の開発者体験(DX)はこの分野で前例がなく、ほとんどのユースケースを満たしている

    • Node では import 時に拡張子を要求しないよう設定できず、tsc が .js 拡張子を自動追加するようにも設定できない
    • ネイティブ TypeScript サポートでこれが解決する可能性はあるが、Bun のユーザー体験や性能に追いつくのは難しいだろう
  • TypeScript がとても好きで、TypeScript ランタイムをずっと待ち望んでいた

    • Java を離れた理由は、より多機能な型システムと段階的型付けを求めていたから
    • npm エコシステムの欠点はあるものの、ライブラリを使うことへの心理的負担が少なく、より楽しい
    • Rust は別の言語スペクトラムにあるが、似た感覚を与えてくれる
    • JIT は不適切な用語で、言いたかったのは JVM と V8 の起動時間とランタイムの違いだった
  • 自分がいちばん好きな deno の機能が Node に直接導入される

    • esbuild をインストールせずに型を取り除けるようになるので、とても楽しみ
    • 最近は Python を好んでいたが、型の面では TypeScript の方が Python より優れている
    • 大きなスクリプトほど、型があると恩恵が大きい
  • Node にとって非常に重要な1か月だった

    • v22.5.0 で node:sqlite が追加され、今度は TypeScript サポートが導入された
    • Node の方向性が気に入っている
  • PR の作成者です。AMA

  • ずっと前にバックエンド作業で Node.js を使い始め、PHP より多くの利点があると感じた

    • Node はやや煩雑で、望む言語にするには組み立てる必要があった
    • Golang を使い始めると、型安全性のおかげでコーディングがより簡単になった
    • TypeScript は良い選択肢だが、結局はまた別の付加機能にすぎない
    • Node を使う大きな利点はプロトタイピングの速さだが、TypeScript を使うことでその利点が相殺される可能性がある