Heim Web-Frontend js-Tutorial Webpack implementiert den Node.js-Code hot replacement_node.js

Webpack implementiert den Node.js-Code hot replacement_node.js

May 16, 2016 pm 03:35 PM
node.js webpack

In den letzten zwei Tagen habe ich auf Gitter, Twitter und GitHub nach diesem Problem gefragt, aber zwei Tage lang kam keine Antwort
Es stellte sich heraus, dass der Blogger jlongster mich ignorierte und ich die Kontaktinformationen des Autors von Webpack
nicht kannte Er schien die letzte auf Gitter gepostete Nachricht gesehen zu haben, also erklärte er sie grob. Sie war so aufschlussreich...
https://github.com/webpack/docs/issues/45#issuecomment-149793458

Here is the process in short:

Compile the server code with webpack
Use target: "node" or target: "async-node"
Enabled HMR via --hot or HotModuleReplacementPlugin
Use webpack/hot/poll or webpack/hot/signal
The first polls the fs for updates (easy to use)
The second listens for a process event to check for updates (you need a way to send the signal)
Run the bundle with node.
You can't use existing HMR loaders like react-hot-loader or style-loader because they make no sense in a server environment. Just add manuall replacement code at the correct location (i. e. accept request handler like in the example)

You can't use the webpack-dev-server. It's a server which serves assets not a runner. Just run webpack --watch and node bundle.js. I would go the webpack/hot/poll?1000 route first. It's pretty easy to use and suitable for dev environments. For production (if you want to hot update your production server) the signal approach is better suited.

Nach dem Login kopieren

Die Originalwörter werden nicht übersetzt. Nach dem Verständnis geht es vor allem darum, wie man Webpack konfiguriert und das Skript ausführt
Ich habe es noch einmal geschrieben. Der Code ist nur so kurz und der Hot-Ersatz ist implementiert:
https://github.com/jiyinyiyong/webpack-backend-HMR-demo
Der Code kann aus dem Konfigurations-Tutorial von jlongster kopiert werden:
http://jlongster.com/Backend-Apps-with-Webpack--Part-II

webpack = require 'webpack'

module.exports =
 entry: [
  'webpack/hot/poll?1000' # <-- 轮询更新内容的代码
  './src/main' # <-- 项目入口
 ]
 target: 'node' # <-- 指明编译方式为 node
 output:
  path: 'build/'
  filename: 'bundle.js' # <-- 编译结果的文件名
 module:
  loaders: [
   {test: /\.coffee/, loader: 'coffee'}
  ]
 plugins: [
  new webpack.HotModuleReplacementPlugin() # <-- 照常启动 hot mode
 ]
 resolve:
  extensions: ['.js', '', '.coffee']

Nach dem Login kopieren

Bei Ausführung in einer Befehlszeilenumgebung beachten Sie bitte, dass es sich um Webpack und nicht um Webpack-Dev-Server handelt
Achten Sie darauf, dass & im Hintergrund läuft, um Blockierungen zu vermeiden. Wenn Sie zwei Terminals haben, öffnen Sie einfach zwei

npm i
webpack --watch & # <-- watch 模式
node build/bundle.js # <-- 运行的是打包结果的代码
Nach dem Login kopieren

Ich habe zwei Testdateien geschrieben, eine davon ist der geänderte Code src/lib.coffee:

exports.data = 'code 5'

exports.printSelf = ->
 console.log 'doing 3'

Nach dem Login kopieren

Eine weitere Eintragsdatei src/main.coffee enthält Code für den Modulaustausch:

lib = require './lib'

console.log lib.data
lib.printSelf()

counter = 0
setInterval ->
 counter += 1
 console.log counter
, 2000

if module.hot
 module.hot.accept './lib', ->
  lib = require './lib'

  console.log lib.data
  lib.printSelf()

Nach dem Login kopieren

Führen Sie die Demo aus und Sie werden wissen, dass die Auswirkung von setInterval nicht von der Ersetzung betroffen ist.
Im Verzeichnis build/ wird bei jeder Änderung eine JSON-Datei generiert, um den geänderten Inhalt aufzuzeichnen:

Code kopieren Der Code lautet wie folgt:
➤➤ l build/
0.1dadeb2eb7b01e150126.hot-update.js 0.c1d0d73de39660806d0c.hot-update.js 2849b61a15d31ffe5e08.hot-update.json 0.99ea3ea7633f6b3750e6.hot-update.js 0.ea 3eba37ae58997.hot-update.js 9b4a5ad617ec1dbc48a3.hot-update.json fb584971920454f9ccbe . hot-update.json
0.9abf25005c61357a0ce5.hot-update.js 0.fb584971920454f9ccbe.hot-update.js a664b5851a99ac0865ca.hot-update.json
0.9b4a5ad617ec1dbc48a3.hot-update.js 1dadeb2eb7b01e150126.hot-update.json bundle.js
0.a664b5851a99ac0865ca.hot-update.js 256267122c6d325755b0.hot-update.json c1d0d73de39660806d0c.hot-update.json

Der spezifische Dateiinhalt sieht wie folgt aus, wobei grob davon ausgegangen werden kann, dass er die Informationen enthält, die zum Identifizieren von Aktualisierungen erforderlich sind:

➤➤ cat build/0.c797c084381bfeac37f7.hot-update.js
exports.id = 0;
exports.modules = {

/***/ 3:
/***/ function(module, exports, __webpack_require__) {

  var counter, lib;
  lib = __webpack_require__(4);
  console.log(lib.data);
  lib.printSelf();
  counter = 0;
  setInterval(function() {
   counter += 1;
   return console.log(counter, 3);
  }, 2000);

  if (true) {
   module.hot.accept(4, function() {
    lib = __webpack_require__(4);
    console.log(lib.data);
    return lib.printSelf();
   });
  }

/***/ }
};

Nach dem Login kopieren

Andere Pläne

Ich habe tagsüber im Internet nach Lösungen gesucht und im Forum einen Beitrag zu diesem Thema gepostet. Es gibt zwei Hauptlösungen mit relativ klaren Erklärungen, von denen es sich lohnt, zu lernen

Eine davon befindet sich im Technologieblog von Baidu, in dem wahrscheinlich beschrieben wird, wie Modulobjekte verarbeitet werden, d. h. Dateiänderungen manuell überwacht, dann der Modulcache geleert und das Modul erneut bereitgestellt wird
Die Ideen sind klar und sorgfältig durchdacht. Obwohl der Code etwas überflüssig ist, können Sie es trotzdem versuchen:
http://www.jb51.net/article/73739.htm

Der andere scheint ein Hack für require.extensions zu sein, der Vorgänge und Ereignisse hinzufügt. Wenn die Moduldatei aktualisiert wird, wird das entsprechende Modul automatisch aktualisiert und ein Ereignis ausgegeben Modul kann mit neuem Code verarbeitet werden, dies sollte als relativ grob bezeichnet werden, schließlich sind nicht alle Codes einfach zu ersetzen
https://github.com/rlidwka/node-hotswap

Impressionen

Angesichts der Tatsache, dass ich mich bereits mit dem Webpack-Baum beschäftigt habe, habe ich nicht vor, ihn eingehend zu studieren. Vielleicht optimiert Node.js offiziell lib/module.js, um gute Funktionen zu erhalten Die Verwendung unveränderlicher Daten ist beliebt und kann nicht mit Erlang verglichen werden, da das Ersetzen des Codes das Problem der Statusaktualisierung mit sich bringt. Der Neustart ist einfacher, und beim Neustart stehen Ihnen jetzt drei Optionen zur Auswahl: Node-Dev Supervisor Nodemon

Für mich liegt der Hauptgrund darin, dass die Cumulo-Lösung stark von WebSocket abhängig ist. Jetzt kann die Front-End-Entwicklung den Code auf dem Server aktualisieren und der Client aktualisiert sich automatisch,
Durch die Mechanismen von Webpack und React werden DOM und reine Funktionsmodule teilweise aktualisiert. Wenn die Entwicklungsumgebung auch im laufenden Betrieb ersetzt werden kann, wird dies die Entwicklungseffizienz erheblich verbessern. Ich dachte ursprünglich, dass ein Hot-Replacement unerreichbar ist Sehr gut möglich. Es ist eine Effizienzsteigerung in greifbarer Nähe!

Möglicherweise stecken hinter der schwarzen Technologie auch Fallstricke ... Ich werde es Ihnen sagen, wenn Sie darauf stoßen

Wenn Sie interessiert sind, können Sie sich mehrere verwandte Meisterwerke von Jlongster genauer ansehen, die sehr hilfreich sind:
http://jlongster.com/archive

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße Artikel -Tags

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Ein Artikel über Speichersteuerung in Node Ein Artikel über Speichersteuerung in Node Apr 26, 2023 pm 05:37 PM

Ein Artikel über Speichersteuerung in Node

Detaillierte grafische Erläuterung des Speichers und des GC der Node V8-Engine Detaillierte grafische Erläuterung des Speichers und des GC der Node V8-Engine Mar 29, 2023 pm 06:02 PM

Detaillierte grafische Erläuterung des Speichers und des GC der Node V8-Engine

VUE3-Erste-Schritte-Tutorial: Paketieren und Erstellen mit Webpack VUE3-Erste-Schritte-Tutorial: Paketieren und Erstellen mit Webpack Jun 15, 2023 pm 06:17 PM

VUE3-Erste-Schritte-Tutorial: Paketieren und Erstellen mit Webpack

Lassen Sie uns ausführlich über das File-Modul in Node sprechen Lassen Sie uns ausführlich über das File-Modul in Node sprechen Apr 24, 2023 pm 05:49 PM

Lassen Sie uns ausführlich über das File-Modul in Node sprechen

Was soll ich tun, wenn der Knoten den Befehl npm nicht verwenden kann? Was soll ich tun, wenn der Knoten den Befehl npm nicht verwenden kann? Feb 08, 2023 am 10:09 AM

Was soll ich tun, wenn der Knoten den Befehl npm nicht verwenden kann?

Lassen Sie uns darüber sprechen, wie Sie das beste Node.js-Docker-Image auswählen. Lassen Sie uns darüber sprechen, wie Sie das beste Node.js-Docker-Image auswählen. Dec 13, 2022 pm 08:00 PM

Lassen Sie uns darüber sprechen, wie Sie das beste Node.js-Docker-Image auswählen.

Was ist der Unterschied zwischen Vite und Webpack? Was ist der Unterschied zwischen Vite und Webpack? Jan 11, 2023 pm 02:55 PM

Was ist der Unterschied zwischen Vite und Webpack?

Verwendung von PHP und Webpack für die modulare Entwicklung Verwendung von PHP und Webpack für die modulare Entwicklung May 11, 2023 pm 03:52 PM

Verwendung von PHP und Webpack für die modulare Entwicklung

See all articles