首頁 web前端 js教程 Webpack 實作 Node.js 程式碼熱替換_node.js

Webpack 實作 Node.js 程式碼熱替換_node.js

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

這兩天為了這個問題, Gitter 上問, Twitter 上問, GitHub 上問, 兩天沒反應
原來寫部落格的 jlong​​ster 不理我, 我也不知道 Webpack 作者的聯絡方式
最後在 Gitter 上發的消息他似乎看到了, 就粗略地解釋了一遍, 醍醐灌頂啊...
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.

登入後複製

原話就不翻譯了, 理解之後主要就是 Webpack 怎麼配置和腳本怎麼運行
我寫了一遍, 程式碼只是這麼短, 熱替換就實現了:
https://github.com/jiyinyiyong/webpack-backend-HMR-demo
其中程式碼可以從 jlong​​ster 的設定教學裡抄:
http://jlong​​ster.com/Backend-Apps-with-Webpack--Part-II

webpack = require 'webpack'

module.exports =
 entry: [
  'webpack/hot/poll&#63;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']

登入後複製

命令列環境運行的話, 注意是 webpack 而不是 webpack-dev-server
注意後台運行的 & 只是為了不阻塞, 你有兩個終端就開兩個吧

npm i
webpack --watch & # <-- watch 模式
node build/bundle.js # <-- 运行的是打包结果的代码
登入後複製

我寫了兩個測試檔, 一個是會修改的程式碼 src/lib.coffee:

exports.data = 'code 5'

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

登入後複製

另一個入口檔案 src/main.coffee 包含了處理模組替換的程式碼:

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()

登入後複製

跑一跑 Demo, 就知道效果怎麼樣了, setInterval 不受替換的干擾
而在 build/ 目錄, 每次修改都會產生一個 JSON 檔案記錄修改的內容:

複製程式碼 程式碼如下:
➤➤ l build/
0.1dadeb2eb7b01e150126.hot-update.js  0.c1d0d73de39660806d0c.hot-update.js  2849b61a15d31ffe5e08.hot-update.j]  0.eaa7b323eba37ae58997.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<

具體的文件內容也就是這樣, 大致可以認為包含了識別更新所需的資訊:

&#10148;&#10148; 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();
   });
  }

/***/ }
};

登入後複製

其他方案

白天在網上查找方案, 順便在論壇上發了個帖子問這個事情,現成的主要兩個說明比較清楚的方案, 值得借鑒一下

一個是百度的技術部落格上, 寫的大概是怎麼對 module 物件做處理,也就是手工監聽檔案修改, 然後清楚模組快取, 重新掛載模組

思路清晰考慮細緻, 雖然有點冗餘代碼, 還是可以一試:

http://www.jb51.net/article/73739.htm

另一個似乎是對require.extensions 做了hack, 增加了操作和事件,當模組文件更新時, 對應模組自動更新, 並且emit 一個事件,通過這樣的效果, 模組引用的位置可以做一些處理, 使用新的程式碼,這個應該說還是比較粗暴的, 畢竟不是所有的程式碼都容易替換


https://github.com/rlidwka/node-hotswap

感想

考慮到我已經在Webpack 這棵樹上吊死, 也就不打算深入研究了,也許Node.js 官方對lib/module.js 做下優化能搞出不錯的功能來,然而, JavaScript 畢竟不是不可變資料使用成風的社區, 比不了Erlang,因為代碼替換就涉及到狀態更新的問題, 不好搞, 不如重啟來得省事,而重啟現在有node-dev supervisor nodemon 三套方案任你選

對我來說, 主要是 Cumulo 方案對 WebSocket 存在巨大的依賴,現在前端開發已經能做到伺服器上更新程式碼, 客戶端自動更新了,

透過Webpack 和React 的機制, 局部更新DOM 和純函數模組,如果說能夠做到開發環境也能熱替換, 這對於開發效率的提升就太大了,本來覺得熱替換遙不可及的, 然而很可能是觸手可及的效率提升!

後面大概還有坑, 畢竟黑科技... 遇到再說了


有興趣可以細看下 jlong​​ster 寫的相關的幾篇神作, 非常有幫助:


http://jlong​​ster.com/archive

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

圖文詳解Node V8引擎的記憶體和GC 圖文詳解Node V8引擎的記憶體和GC Mar 29, 2023 pm 06:02 PM

這篇文章帶大家深入了解NodeJS V8引擎的記憶體和垃圾回收器(GC),希望對大家有幫助!

一文聊聊Node中的記憶體控制 一文聊聊Node中的記憶體控制 Apr 26, 2023 pm 05:37 PM

基於無阻塞、事件驅動建立的Node服務,具有記憶體消耗低的優點,非常適合處理海量的網路請求。在海量請求的前提下,就需要考慮「記憶體控制」的相關問題了。 1. V8的垃圾回收機制與記憶體限制 Js由垃圾回收機

VUE3入門教學:使用Webpack進行打包和構建 VUE3入門教學:使用Webpack進行打包和構建 Jun 15, 2023 pm 06:17 PM

Vue是一款優秀的JavaScript框架,它可以幫助我們快速建立互動性強、高效性好的Web應用程式。 Vue3是Vue的最新版本,它引入了許多新的功能和功能。 Webpack是目前最受歡迎的JavaScript模組打包器和建置工具之一,它可以幫助我們管理專案中的各種資源。本文就為大家介紹如何使用Webpack打包和建構Vue3應用程式。 1.安裝Webpack

聊聊如何選擇一個最好的Node.js Docker映像? 聊聊如何選擇一個最好的Node.js Docker映像? Dec 13, 2022 pm 08:00 PM

選擇一個Node的Docker映像看起來像是小事,但是映像的大小和潛在漏洞可能會對你的CI/CD流程和安全造成重大的影響。那我們要如何選擇一個最好Node.js Docker映像呢?

深入聊聊Node中的File模組 深入聊聊Node中的File模組 Apr 24, 2023 pm 05:49 PM

文件模組是對底層文件操作的封裝,例如文件讀寫/打開關閉/刪除添加等等文件模組最大的特點就是所有的方法都提供的**同步**和**異步**兩個版本,具有sync 字尾的方法都是同步方法,沒有的都是異

vite和webpack的差別是什麼 vite和webpack的差別是什麼 Jan 11, 2023 pm 02:55 PM

差異:1、webpack伺服器啟動速度比vite慢;由於vite啟動的時候不需要打包,也就不需要分析模組依賴、編譯,所以啟動速度非常快。 2.vite熱更新比webpack快;vite在HRM方面,當某個模組內容改變時,就讓瀏覽器去重新請求該模組即可。 3.vite用esbuild預先建置依賴,而webpack基於node。 4.vite的生態不如webpack,載入器、插件不夠豐富。

一起聊聊Node中的事件循環 一起聊聊Node中的事件循環 Apr 11, 2023 pm 07:08 PM

事件循環是 Node.js 的基本組成部分,透過確保主執行緒不被阻塞來實現非同步編程,了解事件循環對建立高效應用程式至關重要。以下這篇文章就來帶大家深入了解Node中的事件循環 ,希望對大家有幫助!

深入了解Node中的Buffer 深入了解Node中的Buffer Apr 25, 2023 pm 07:49 PM

一開始的時候 JS 只在瀏覽器端運行,對於 Unicode 編碼的字串容易處理,但對於二進位和非 Unicode 編碼的字串處理困難。並且二進制是電腦最底層的資料格式,視訊/音訊/程式/網路包

See all articles