21 ポイント 投稿者 GN⁺ 2025-08-18 | 7件のコメント | WhatsAppで共有
  • Node.jsがTypeScriptファイルを直接実行できるように改善
  • これにより追加設定やトランスパイルなしでも .ts ファイルをそのまま実行可能に
  • 開発者はtsconfig.jsonや別途バンドラーを導入せずに作業効率を高められる
  • この機能は Node.js v22.18.0 (LTS) バージョンから正式に反映
  • JavaScriptとTypeScript開発の境界が緩和される結果が期待される

Node.jsのTypeScript直接実行サポート

  • Node.jsは最近の v22.18.0 (LTS) バージョンで、TypeScriptファイル(.ts) を別途設定やツールなしで直接実行できる機能を導入
  • 従来はTypeScriptコードを実行するために ts-node、esbuild、Babel などの外部トランスパイラまたはバンドラーが必要だったが、今後はこうしたツールなしでも Node.js 自体が TypeScript コードを認識して実行する
  • この機能により、開発者はtsconfig.json設定ファイルや追加ライブラリなしで .ts ファイルを Node.js でそのまま実行可能
  • プロトタイピング、実験的な開発、スクリプト実行などで生産性開発のしやすさが大きく向上
  • JavaScriptとTypeScriptプロジェクト間の連携性強化、新規開発者の参入障壁緩和などの効果が期待される

そのほか注目すべき変更

  • esm: import.meta.main を実装
  • fs: AsyncIterator ベースの fs イベント処理を改善
  • permission: 子プロセス実行時に権限モデルフラグの受け渡しをサポート
  • sqlite: readBigInts オプションを追加
  • src/permission: permission.has(addon) をサポート
  • url: fileURLToPathBuffer API を追加
  • watch: --watch-kill-signal フラグを追加
  • worker: Worker オブジェクトを async disposable に改善

コミットおよびドキュメント関連アップデート

  • 不要なコードの削除、ビルド環境とツールチェーンの整備、npm 10.9.3 へのアップグレードを含む
  • globals.md, child_process.md, http2 などのドキュメントで、安定性指標の詳細や RFC 番号を修正
  • 多数のテスト追加とバグ修正を反映

配布ファイル

  • Windows、macOS(Intel/Apple Silicon)、Linux(x64、ARM、PPC、s390x、AIX) 向けのインストーラーとバイナリを提供
  • ソースコードと完全なリリースファイルは Node.js 公式配布ページからダウンロード可能
  • API ドキュメントは v22.18.0 基準で更新済み

7件のコメント

 
aliveornot 2025-08-19

本当にすっきりしましたね……早く定着してほしいです

 
tested 2025-08-18

簡単なスクリプトの実行にはよさそうですが、実運用のプロジェクトでは制約が多くて、あまり使う機会はなさそうですね。

ERR_MODULE_NOT_FOUND/ERR_UNSUPPORTED_DIR_IMPORT エラーのため、拡張子やパスも合わせる必要がありますし、
NestJS のように "emitDecoratorMetadata" 設定による TypeScript ビルド対応が必要な機能は使えないので……

 
kimjeongwonn 2025-08-18

--experimental-strip-types がデフォルトで適用されるということですか?

 
click 2025-08-18

どうせ enum は使わないので、私の基準では単に型を削除する動作だけでも十分問題なく実行できました

 
crawler 2025-08-18

すごく便利になりそうですね!

 
honglu 2025-08-18

いいねを我慢できませんね。

--no-experimental-strip-types フラグでも十分に良いと思っていましたが。

さらに良くなったようです。

 
GN⁺ 2025-08-18
Hacker Newsの意見
  • Node.jsではnode:testも含めると、いまやほとんどのケースでNode.jsが十分に説得力のあるデフォルトの選択肢になったと思う。tsxで実行できるようになったのは生活の質を大きく上げてくれたが、それでもまだ完全ではなかった。zodts-resttrpcのようなツールでエッジでのランタイム型アサーションも主に解決されつつあり、最近はフルスタックTypeScript開発が本当に簡単になった
    • 本当にそう。2025年になってようやくnodeエコシステムがデフォルト設定のままでも実用的になった。ESMモジュールがNodeとTypeScriptの両方でそのままうまく動き、Nodeが.tsファイルを直接実行でき、しかも十分良い標準テストランナーを内蔵している(--watch対応)。組み込みパッケージも良くなってきている。node:fs/promisesのようなものは、top-level awaitのおかげで非同期ループ処理もずっと簡単になった。みんなを現実的な方向へ説得するには長い時間がかかったが、いまは本当に快適になった
    • NodeでTypeScriptを直接サポートすることには大賛成。最近はvitestが多くの部分を楽にしてくれているが、.tsファイルのテスト環境設定には本当に多くの時間を費やしてきた。trpcts-restは完全に別の問題だと思う。両方使えるけれど、本番ではtrpcはAPI URLを自分で完全に所有できず、古いURLを自然に管理して廃止していけないので避けている。ts-restについても、たいていはzodと型を直接共有してAPIのリクエスト/レスポンスの組を自分で管理するほうを好む。それにtrpcは明らかにRPCツールなのに、名前に-restが付いているたびに気になる
    • 今後Sveltrがコードベースを再びTypeScriptへ戻すのか見ていくつもり
    • これがtsxを実行するものなのか気になる。型を取り除いてもJSXはJavaScriptへ変換しなければならないので、その部分がどうなっているのか気になる
    • 自分は少し前にPythonへ移った。あらゆるものが組み込まれていて、未完成なシステムのさまざまな奇妙な問題をデバッグしなくて済むので、ずっと満足している
  • Nodeがここ数年で見せた進歩には強く感心した。denoとbunがNodeを刺激して、集中的で意味のある改善を進めるよう促したのは良かった。しばらく停滞していた
    • Nodeに最近どんな改善があったのか気になる。最後に意味があると感じた改善はimport/exportの正式サポートだった(.mjsハックがまだ必要なのかは知らないが)。しばらくエコシステムから離れていたので、その後に何が変わったのか知りたい
    • 本当にそうだったのかは疑問。自分が関わったプロジェクトを見ると、denoやbunがなくてもまったく問題なかった。実質的に意味があるのはnodeのLTSリリースだけで、新しいプロジェクトですらいまだにnode 20を使っている
  • TypeScriptがnode_modulesで受け入れられないのは残念(関連: node.js公式ドキュメント)。 となると、プロジェクト依存関係はどうなるのか気になる。データモデル用ライブラリをTypeScriptで書いたので、TypeScriptのまま自分のアプリにインポートしたい。このルールがnpmパッケージにだけ適用されるのか、それともすべての依存関係に適用されるのか気になる。ここにはチャンスがある。 自分はtypescript(正確にはJS全般)の実行のためのgolangベースのランタイムを作っていて、grafanaチームが使っているsobekも型ストリップ機能を追加するだけでよさそうだ。完全にTypeScriptをデフォルト採用したランタイムが1つでも出てくれば、Node.jsは本当に革新されると感じている。トランスパイラも、typescript-goも、rustも不要で(とはいえrustは少し😉)、良いパーサーがソースマップと型をデバッグモードで追跡してくれる仕組みがあれば十分だ。 いずれにせよNodeチームとすべての貢献者に敬意と感謝を表したい。標準となるNodeがあるおかげで、私たちは皆その後を追える感覚がある。埋め込みAPIもシンプルで使いやすく、スタンドアロンを作るときにも便利だ
    • 同じコメントを以前に残したことがある(参考)。「TypeScriptで書かれたパッケージをnpmに公開しないよう促すため」という部分があるが、自分もプライベートパッケージで試してみたものの動作せず、Nodeはprivateフィールド自体をまったく気にしていない
    • パッケージはnpmに公開する前に必ずJavaScriptへコンパイルして配布すべきだと思う。TypeScriptのままnpmに上げる理由はないと思う
  • 関連イシュー node_modulesで型ストリップのサポートがないのは残念だと思う
    • この機能に期待していた理由の半分はまさにそこ。TypeScriptでライブラリを書き、型チェックはCI/CDでだけ行い、そのままNode.jsからインポートできることを期待していた
    • 正しい判断だと思う。TypeScriptは破壊的変更がかなり頻繁に起きる。標準化されない限り、現在のやり方のほうがよいと思う
  • 自分はJS/TSを多く使うほうではないが、いっそBunを使うほうがよいのではないかと思う。すべてのプロジェクトが新規スタートというわけではないが、Bunは全体的により良いランタイムだと感じた。最初からTSが実行でき、依存関係の解決もずっと速く、使い勝手も優れている。個人的には古いNodeプロジェクトをかなりBunへ移し、Bun公開以降はNodeをほとんど使わなくなった。もし自分の認識に誤りがあれば教えてほしい
    • Nodeだけを8年近く使っていて、最近Denoに乗り換えた。この移行も簡単ではなかったし、実際に動かないというより、いつ動かなくなるかわからない状況が怖かったからだ。Nodeにも確かに不満は多いが、それでも業界の事実上の標準ではある。JSエコシステム自体が混乱していて、多くの開発者が新しいビルドツールやバンドラ、ランタイムに疲れている。Bunは十分に説得力を持つほどの安定性やサポートがまだ積み上がっていない気がする。以前、TSのマイナーアップデート1つで数日間問題解決に追われた経験もある
    • 自分は最新トレンドを追うのがあまり好きではない。NodeJSはJSエコシステムで最もサポートが充実したランタイムだ。デフォルトの選択肢に従うほうがずっとよいと思う。いわゆる「退屈な」技術を選ぶタイプだ
    • Bun公開後に何度も完全移行を試みたが、毎回90%くらいのところで避けられない問題にぶつかる。最後の試行では一部ライブラリでnapi関数が未実装で動かず、opendirのオプションでrecursiveが無視される問題など、覚えているものだけでもいくつかあった。Bunが追いつくのを待っている立場だが、まだ大規模プロジェクトへ実務投入する準備ができているようには見えない。bun専用機能も第一印象は良いが、実戦では物足りないと感じる。ドキュメントもNode.jsほど高品質ではない
    • NodeをBunへ置き換えようとしたときに経験した互換性の問題は次の通り。
  • TCP接続でlocalAddressが無視される
  • NodeモジュールAPIとの非互換性(例: spamscannerプロジェクトが動かない)
  • EventEmitter関連のrace問題(部分的な解決策: eventemitter2
  • Svelte vites devサーバーがときどき停止し、node_modulesを削除して再インストールする必要があった
    • Node自体のTS機能とテストランナーを使ってみたが、まだBunほど良くはない。しばらくはそうした機能が必要なときにはBunを使っている。Nodeエコシステムでは1つにすべてを賭けるより、それぞれに特化した道具を適切に組み合わせるほうがよいと学んだ。

      • Bun.js: Nodeランタイム向けで、TS実行とテストに活用。TSX、TS-Node、Node自体などいろいろ試した

      • NPM: ツーリングスクリプトの実行に使用

      • PNPM: 依存関係のインストールに使用。(npm、yarn、bunより最も優れていると感じる)

      • Biome.js: リンティング用。これまで使ったどのリンティングツールよりも優れている

  • 今回の改善が「型ストリッピング」だけで成り立っているのが本当に良い。ソースマップが不要なので、本番では完全にゼロコストになる。Nodeチームは本当によくやったと思う
  • 型ストリップ関数(import { stripTypeScriptTypes } from 'node:module')も公開されている。フロントエンド依存のないシンプルなWebアプリを作るなら、全体をTypeScriptにしてフロントエンドスクリプトを配信するときに型だけ取り除けばよい(サンプルプロジェクト
  • この変更のおかげで、うちの会社もついにTypeScriptへ移行できた。複数のサービスを一度にTSへ移行し、一部はまだ進行中だ。大きな成果だ
  • 仕組みとしては型情報を削除しているようだ。つまり、トランスパイル工程を1つ減らしてくれるだけであり、安全性が向上するわけではない
    • TypeScriptの主要な設計目標は、型関連の構文だけを取り除けば結果が有効なJavaScriptファイルになることだ。TSコンパイラはコードを生成しない(たとえばPureScriptとは違う)。tscなどの型チェッカーで静的検査を行い、型情報は削除される。Pythonも実行時には型アノテーションを無視するし、Javaでもバイトコードでは一部のジェネリクスなど型情報が消える性質がある
    • 「少なくともトランスパイル工程を減らすだけで安全性は改善しない」という言い方は少し誤解を招く。NodeがTSを直接実行できるようになっても型チェック上の安全性が上がるわけではないが、型チェックはエディタや他のさまざまなツールで別途行える。NodeがTSの直接実行をサポートすることで、TS利用の参入障壁を大きく下げ、間接的には型安全性を後押しする
    • TypeScriptは安全性の向上まで保証すると約束したことはない。よくある誤解ではある。TSにはランタイムモードやランタイム情報がないに等しく、型チェッカーを回さなければ深刻な型エラーがあってもそのまま実行できてしまう。厳密に言えばTypeScriptはむしろリンターに近い
    • ビルドやトランスパイルなしでスクリプトを直接実行できるのは非常に便利だと思う。型チェックが必要ならtscで回すやり方が自分には合っている
    • tsxを使って、同じくビルドやトランスパイルなしで実行するセットアップをプロジェクトで使っている。開発中には非常に便利だ。tsx--watchのおかげで、TSソースから直接サーバーを立ち上げ、変更があれば自動で再起動する。今後はnodemonとNode内蔵機能だけで似た環境を作れそうだ。ランタイムで型チェックまでやるならv8レベルでのサポートが必要で、これはほとんど全面書き直し級の作業になるだろう
  • 実際にはTypeScript全体を実行しているわけではなく、一部のサブセットだけをサポートしている。タイトルの内容は誇張だと感じるかもしれない。こうした変化によってTSがリンターのようなものとしてしか使われなくなる懸念があり、型ストリップだけでは実装できないさまざまな強力なTS機能が廃れてしまう可能性がある
    • TSでストリップ処理できない機能とは具体的に何なのか気になる。enum以外で、実際に使われる例が何かあるのか知りたい