這兩天為了這個問題, Gitter 上問, Twitter 上問, GitHub 上問, 兩天沒反應
原來寫部落格的 jlongster 不理我, 我也不知道 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
其中程式碼可以從 jlongster 的設定教學裡抄:
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']
命令列環境運行的話, 注意是 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 檔案記錄修改的內容:
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
➤➤ 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
https://github.com/rlidwka/node-hotswap
感想
考慮到我已經在Webpack 這棵樹上吊死, 也就不打算深入研究了,也許Node.js 官方對lib/module.js 做下優化能搞出不錯的功能來,然而, JavaScript 畢竟不是不可變資料使用成風的社區, 比不了Erlang,因為代碼替換就涉及到狀態更新的問題, 不好搞, 不如重啟來得省事,而重啟現在有node-dev supervisor nodemon 三套方案任你選對我來說, 主要是 Cumulo 方案對 WebSocket 存在巨大的依賴,現在前端開發已經能做到伺服器上更新程式碼, 客戶端自動更新了,
透過Webpack 和React 的機制, 局部更新DOM 和純函數模組,如果說能夠做到開發環境也能熱替換, 這對於開發效率的提升就太大了,本來覺得熱替換遙不可及的, 然而很可能是觸手可及的效率提升!

Vercel是什么?本篇文章带大家了解一下Vercel,并介绍一下在Vercel中部署 Node 服务的方法,希望对大家有所帮助!

Vue是一款优秀的JavaScript框架,它可以帮助我们快速构建交互性强、高效性好的Web应用程序。Vue3是Vue的最新版本,它引入了很多新的特性和功能。Webpack是目前最流行的JavaScript模块打包器和构建工具之一,它可以帮助我们管理项目中的各种资源。本文就为大家介绍如何使用Webpack打包和构建Vue3应用程序。1.安装Webpack

区别:1、webpack服务器启动速度比vite慢;由于vite启动的时候不需要打包,也就无需分析模块依赖、编译,所以启动速度非常快。2、vite热更新比webpack快;vite在HRM方面,当某个模块内容改变时,让浏览器去重新请求该模块即可。3、vite用esbuild预构建依赖,而webpack基于node。4、vite的生态不及webpack,加载器、插件不够丰富。

随着Web开发技术的不断发展,前后端分离、模块化开发已经成为了一个广泛的趋势。PHP作为一种常用的后端语言,在进行模块化开发时,我们需要借助一些工具来实现模块的管理和打包,其中webpack是一个非常好用的模块化打包工具。本文将介绍如何使用PHP和webpack进行模块化开发。一、什么是模块化开发模块化开发是指将程序分解成不同的独立模块,每个模块都有自己的作

node怎么爬取数据?下面本篇文章给大家分享一个node爬虫实例,聊聊利用node抓取小说章节的方法,希望对大家有所帮助!

本篇文章给大家分享一个Node实战,介绍一下使用Node.js和adb怎么开发一个手机备份小工具,希望对大家有所帮助!

配置方法:1、用导入的方法把ES6代码放到打包的js代码文件中;2、利用npm工具安装babel-loader工具,语法“npm install -D babel-loader @babel/core @babel/preset-env”;3、创建babel工具的配置文件“.babelrc”并设定转码规则;4、在webpack.config.js文件中配置打包规则即可。

Webpack是一款模块打包工具。它为不同的依赖创建模块,将其整体打包成可管理的输出文件。这一点对于单页面应用(如今Web应用的事实标准)来说特别有用。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

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

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Dreamweaver CS6
視覺化網頁開發工具

WebStorm Mac版
好用的JavaScript開發工具