Node.jsを使用してホットリロードページを実装する方法の詳細な説明

Node.jsを使用してホットリロードページを実装する方法の詳細な説明

序文

少し前に、browser-sync+gulp+gulp-nodemon を組み合わせて、本番環境でのホット アップデート用のプロジェクト スキャフォールディングを実装しました (以前の私の理解は少し偏っていて、ホット リロードではなくホット アップデートとして定義する必要があります)。そこで、今日は Node.js を使用してホット リロード ページを実装します。

さて、皆さんが私と同じ間違いをしないように、今日の内容をまとめておきます。

ホットリロード

いわゆるホットリロードとは、ページが変更されるたびに、手動で更新することなく自動的に更新できることを意味します。

ホットアップデート

ブラウザのリフレッシュフリーアップデートにより、ページ全体を再読み込みする完全なリフレッシュを実行することなく、実行時にさまざまなモジュールを置き換え、追加、または削除できます。

目的: 開発を高速化するため、開発環境での使用にのみ適しています。

アイデア: ページを完全に再読み込みすると失われるアプリケーションの状態を保持し、変更されたコンテンツのみを更新して開発時間を節約します。スタイルの調整はより高速で、ブラウザ デバッガーでスタイルを変更するのとほぼ同等です。

実際の戦闘

1. プロジェクトを初期化する

ここで、次のコマンドを使用してプロジェクトを初期化します。ここでは、初期化をより高速かつ便利にするために -y サフィックスを使用しています。カスタマイズしたい場合は、行ごとに入力できます。

npm 初期化 -y

初期化が完了し、ルート ディレクトリに package.json ファイルが追加されます。

2. Nodeメインファイルapp.jsを作成する

次に、Nodejs 操作のメイン ファイル app.js を作成します。

定数 http = require('http');
定数 express = require('express');
express() は、定数です。
定数 server = http.createServer(app);
定数パス = require('path');
定数 fs = require('fs');
const io = require('socket.io')(サーバー);

app.use(express.static(path.join(__dirname, './public')));
ウォッチャーを作成します。

関数createWatcher() {
  const absolute = './public';
  fs.watch(絶対、関数(イベントタイプ、ファイル名) {
    if (ファイル名) {
      io.sockets.emit('reload');
    }
  });
}

server.listen(8086, 関数() {
  console.log(`サーバーはポート8086で実行されています。`);
});

まず、http と express を組み合わせて http サーバーを作成し、それを socket.io にバインドします。次に、express を使用して静的ファイルをホストし、静的ファイル ディレクトリ public を指定します。ここでは、fs モジュールの watch メソッドを使用して、ファイル ディレクトリの変更を監視します。ディレクトリ内のファイルが変更されると、io.sockets.emit('reload'); の行がトリガーされます。トリガーされたので、それを監視する場所が必要です。

3. index.htmlファイルを作成する

ルート ディレクトリに public フォルダーを作成し、そのフォルダー内に index.html ファイルを作成します。

<!DOCTYPE html>
<html lang="ja">
  <ヘッド>
    <メタ文字セット="UTF-8" />
    <title>ホットアップデートページ</title>
    <link rel="スタイルシート" href="style.css" rel="外部nofollow" />
    <スタイル>
      h1 {
        色: 赤;
      }
    </スタイル>
  </head>
  <本文>
    <h1>こんにちは</h1>
    <p class="txt">テキスト</p>
    <ul>
      <li>1</li>
      <li>2</li>
      <li>3</li>
      <li>4</li>
    </ul>
    <p class="name"></p>
    <script src="./socket.io.min.js"></script>
    <script src="./index.js" type="module"></script>
    <スクリプトタイプ="モジュール">
      './index.js' から obj をインポートします。
      io.connect('http://localhost:8086/').on('reload', () =>
        ウィンドウの場所を再読み込み()
      );
      document.querySelector('.name').innerHTML = obj.name;
    </スクリプト>
  </本文>
</html>

ファイルの内容は上記のとおりです。最初に注意する必要があるのは、バックグラウンドで監視する方法です。socket.io.min.js ファイルをインポートし (記事の最後にソース コードのアドレスを示します)、次のコードを入力するだけです。

io.connect('http://localhost:8086/').on('reload', () =>window.location.reload());

http://localhost:8086/ これはバックエンドのアドレスです。バックエンドと通信するには、このアドレスをリッスンする必要があります。バックグラウンドでリロード イベントをカスタマイズしたので、フロントエンドはこのイベントをリッスンするだけで済みます。このイベントがバックグラウンドでトリガーされると、フォアグラウンドはそれをリッスンし、コードをランダムに実行します。

4. 他の種類のファイルを作成する

上記の index.html ファイルでは、index.js ファイルと style.js ファイルを外部からインポートしたことがわかります。主な目的は、コードが変更された場合にページがそれに応じて変更されるかどうかを検出することです。答えは「はい」です。

5. リアルタイム更新ページ

まずプロジェクトを立ち上げることから始めます。

ノードアプリ.js

ターミナルに「サーバーはポート 8086 で実行されています」と表示されます。その後、ブラウザーでアドレス http://localhost:8086/ を開くことができます。コードを変更すると、ページがリアルタイムで表示され、ショートカット キーを押してコードを保存すると (エディターがコードをリアルタイムで自動的に保存しないようにすることをお勧めします)、ページがリアルタイムで更新されることがわかります。

これはとても便利ではないでしょうか。ページを切り替えるたびに更新をクリックする必要がありません。初めて JQ を使用してページを書いたときのことを思い出すと、毎回同じ作業を繰り返すのがとても愚かだと感じました。

結論

読んでくれてありがとう。あなたの時間を無駄にしなかったことを願っています。

ソースコードアドレス: https://gitee.com/maomincoding/hot-load

Node.js を使用してホット リロード ページを実装する方法に関するこの記事はこれで終わりです。Node.js ホット リロード ページの関連コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • nodemon を使用して Typescript プロジェクトのホット アップデートを実装するためのサンプル コード
  • ホットローディングを実現するための webpack2+node+react+babel の詳細な説明 (hmr)
  • Webpack は Node.js コードのホット置換を実装します
  • Node.js は Web アプリケーション コードのホット アップデートを巧みに実装します

<<:  Linuxにpipパッケージをインストールする方法

>>:  MySQLトリガーの簡単な使用例

推薦する

Nginx リバース プロキシでセッション永続性を実装する 2 つの方法の詳細な説明

1. ip_hash: ip_hash は、送信元アドレス ハッシュ アルゴリズムを使用して、サーバ...

GNU Parallelの具体的な使用法

それは何ですか? GNU Parallel は、1 台以上のコンピュータでコンピューティング タスク...

Vue ベースの円形スクロールリスト機能を実装する

注: 親コンテナーに高さと :data='Array' および overfolw:h...

MySQLデッドロック問題の詳細な分析

序文私たちのビジネスがまだ初期段階にあり、同時実行の度合いが比較的低い場合、数年間はデッドロックの問...

Linux で SVN サーバーをインストールする方法

1. Yumのインストール yum でサブバージョンをインストール 2. 構成1. 倉庫を作る/ho...

Ubuntu 20.04でAliソースを変更する方法

なお、この記事では、単に 20.04 ソースに変更する方法を説明するのではなく、20.04 に基づい...

MySQLテーブルの内容の変更を監視し、MySQL binlogを有効にする

序文binlog は、MySQL のすべての追加、削除、および変更ステートメントを記録するバイナリ ...

Angularの動的コンポーネントの詳細な説明

目次使用シナリオ達成方法1. 動的コンポーネントを配置する場所2. コンポーネントのインスタンスを取...

Angularの親子コンポーネント通信の詳細な説明

目次概要1. 入力および出力プロパティの概要2. 入力属性3. プロパティバインディングは親コンポー...

nginxでの共有メモリの使用に関する詳細な説明

nginx プロセス モデルでは、トラフィック統計、トラフィック制御、データ共有などのタスクを完了す...

Brotli圧縮アルゴリズムを有効にするNginxの実装プロセスの詳細な説明

序文Web アプリケーションでは、トラフィックを節約し、転送データのサイズを縮小し、転送効率を向上さ...

HTML要素によるFlashブロックの詳細な例

コードをコピーコードは次のとおりです。 wmode パラメータ:透過モード: z-indexを使用し...

Docker で LNMP 環境を素早く構築する方法 (最新)

序文ヒント: ここで、この記事に記録するおおよその内容を追加できます。例えば、人工知能の継続的な発展...

反応ループデータの実装(リスト)

まず、バックグラウンドから来るデータをシミュレートしてみましょう。ここでは、コードをわかりやすくする...

入力のid属性とname属性の違いの例

長い間ウェブサイトを作ってきましたが、入力時のnameとidの違いがまだわかりません。最近jQuer...