🦁

Node.js(18.11.0)でリリースされたwatchモードを試してみた

2022/10/16に公開

Node.js(18.11.0)にwatchモード機能が実験的リリース

Node v18.11.0でwatchモード機能がexperimental(実験的)版として2022/10/13に公開されました。
watchモードとは開発中のディレクトリ内のファイルに変更があったら、自動でNode.jsを再起動してくれるという開発支援機能です。

以下Node v18.11.0リリースノート のwatch部分抜粋です。

watch mode (experimental)
Running in 'watch' mode using node --watch restarts the process when an imported file is changed.
Contributed by Moshe Atlow in #44366

この機能の背景としてはNode.js ISSUEの中でnodemonのような機能が欲しいという声が1年ほど前から高まっていて、今回実験的にNode.jsコアに入れてみようということのようです。
ごくざっくりしか見られていませんが、ソース更新履歴を見るとrequireにもimportにも対応しているようです。

watch機能を試してみた

今回はそのwatch機能を軽く試してみようと思います。

目的:

  • 読み込みファイル部分を更新してNode.jsが自動更新されるかをwatchモードON/OFFで比較する

ファイル構成:

  • index.js
    • // localhost:4000にサーバを立てて、読み込んだmessage.jsのテキストを表示
  • message.js
    • // 任意のテキストをexportするだけの1行コード

ソースコード:

index.js
const http = require("http");
const msg = require("./message.js");

http.createServer((req,res)=>{
  res.setHeader("Content-Type", "text/html;charset=utf-8");
      res.write(msg.message);
      res.end();
}).listen(4000,()=>{});
message.js
module.exports.message = "メッセージ";

テストしたNode.js version

  • 18.11.0
    • watchモードあり
    • watchモードなし
  • 16.18.0
    • 現時点のLTS版(watchモードは非対応)

実験開始

【実験】Node.js (16.18.0)

まずは現在のLTS版である16.18.0で試します。
watchモード非対応なので当然読み込みファイルを更新しても、Node.js自動更新はされないはずです。

  1. サーバ起動
node index.js
  1. message変更前:ブラウザ表示

v16.18.0ブラウザ表示結果

  1. message変更
message.js
module.exports.message = "メッセージ_テキスト追加しました";
  1. ブラウザリロード
    これでブラウザをリロードして結果を見ます。

  2. message変更後:ブラウザ表示

v16.18.0ブラウザ表示結果

結果

v16.18.0 でテストした結果

  • 変化なし

となりました。


【実験】Node.js (18.11.0) watchモードなし

次に今回リリースされたv18.11.0をwatchモードなしで実験します。
これも読み込みファイルを更新しても、Node.js自動更新はされない想定です。

  1. サーバ起動
node index.js
  1. message変更前:ブラウザ表示

v16.18.0ブラウザ表示結果

  1. message変更
message.js
module.exports.message = "メッセージ_テキスト追加しました";
  1. ブラウザリロード
    これでブラウザをリロードして結果を見ます。

  2. message変更後:ブラウザ表示

v18.11.0watchモードなしブラウザ表示結果

結果

v18.11.0watchモードなし でテストした結果、これも

  • 変化なし

となりました。


【実験】Node.js (18.11.0) watchモードあり

最後に本命のv18.11.0 watchモードありです。
読み込みファイルを更新したらNode.js自動更新される予定です。この状態でブラウザリロードして変更メッセージが表示されれば成功です。

  1. サーバ起動
node --watch index.js

ターミナルにもWatchモードは実験版だからいつ変更になるか分からないよという注意が表示されました。
watchモードありターミナル表示

(node:13780) ExperimentalWarning: Watch mode is an experimental feature. This feature could change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
  1. message変更前:ブラウザ表示

v16.18.0ブラウザ表示結果

  1. message変更
message.js
module.exports.message = "メッセージ_テキスト追加しました";
  1. ブラウザリロード
    これでブラウザをリロードして結果を見ます。

  2. message変更後:ブラウザ表示

v18.11.0watchモードありブラウザ表示結果

結果

v18.11.0watchモードあり でテストした結果、無事

  • 変更メッセージ メッセージ_テキスト追加しました が表示される

という結果になりました。

まとめ

v18.11.0watchモードありで無事Node.js自動更新される結果となりました。
watchモードを使ってNode.js側で変更の追跡をしてくれるなら、これまでnodemon等に頼ってきた部分も減り、モジュール依存が軽くなる効果もありそうです。

実開発で使うには、browser-syncのようにNode.jsに合わせたブラウザ更新連動も必要になりそうです(今回は実験できず)。watchモードと他のモジュールの連携がどこまでできるのかは確認が必要に思いました。

watchモードはまだ実験的リリースに過ぎませんが、Node.js運営側でISSUEの声を聞きコア機能へ反映しようとしてくれる姿勢はありがたいですし、オープンソース文化の良さを感じました。
これからも新しい機能のリリースを見て行きたいと思います。


追記:
本記事を公開してすぐにNode.js v19がリリースされました。
丁度BrowsersyncとNode.jsの連携について実験しそびれていましたので以下記事を書いています。
Node.js 19のwatchモードとBrowsersyncを組み合わせて試してみた

https://goodpatch-tech.hatenablog.com/entry/2022/10/24/103000

こちらも合わせてご参照くださいませ。

Discussion