簡單來講,熱更新通常是指手機裏的app有小規模更新,以直接打補丁的形式更新。
相對應的,另外一種更新方式就是下載新的安裝包,從新安裝。
因此熱更新在手遊裏頭是比較常見的,畢竟遊戲應用個個都幾百兆起步。css
按上面那個說法,Web應該是不存在熱更新的。
由於網頁的架構是B/S,即 瀏覽器+服務器 , 它不像手機app同樣是 C/S 客戶端+服務器
因此在網頁這一塊是沒法推送補丁讓瀏覽器去更新的。html
網上大多數前端熱更新講的都是熱加載 hot-loader 或者是模塊熱更替 HMR前端
因此大概流程就以下:vue
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "webpack",
"server": "webpack-dev-server --open",
"server-hot": "webpack-dev-server --hot"
},複製代碼
// 本地開發服務器
devServer: {
// 本地服務器加載資源所在路徑
contentBase: "./public",
// true 表示全部跳轉都是index.html
historyApiFallback: true,
// 當源文件修改時,自動刷新頁面
inline: true,
// 端口號,若不設置,默認爲8080
port: 3000,
},複製代碼
因此咱們在webpack-demo
目錄下,運行npm run server
就等於運行了webpack-dev-server --open
webpack-dev-server
可是咱們配置項沒有配置啓用HMR$ npm run server
是我執行的命令,根據package.json 配置文件這個命令等同於webpack-dev-server --open
下面那些輸出語句,一些是webpack-dev-server
啓用狀態,還有webpack
的打包文件的打包過程node
module.exports = {
// 入口文件
entry: __dirname + "/app/main.js",
// 輸入文件
output: {
// 輸出路徑
path: __dirname + "/public",
// 輸出文件名
filename: "bundle.js"
},複製代碼
/app/main.js
文件// ES6導入模塊的語法,因此入口文件跟下面兩個文件有關聯
import hello from "./hello";
import "./main.css";
// 簡單的DOM操做
document.querySelector("#root").appendChild(hello());複製代碼
/app/hello.js
文件import style from "./style.css";
// 下面這個是CommonJS的文件導入,由於node.js自己是支持CommonJS的
let test = require("./test.json");
// 這個是CommonJS的模塊導出
module.exports = function () {
let hello = document.createElement('div');
hello.textContent = test.hhh;
// 這裏的hello這個元素的class的取值是來自上面導入"./style.css"文件,這涉及到CSS模塊
hello.className = style.hello;
return hello;
};複製代碼
/app/main.css
文件body{
color: blue;
font-size: 64px;
}複製代碼
/app/style.css
文件.hello{
color: red;
}複製代碼
/app/test.json
文件{
"hhh":"this a message from .json"
}複製代碼
哦,還有index.html
文件webpack
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>webpack demo</title>
</head>
<body>
<div id="root">
</div>
<script src="bundle.js"></script>
</body>
</html>複製代碼
這樣應該很清晰了吧
首先入口文件main.js
引入了hello.js
和main.css
而後hello.js
又引入了style.css
和test.json
因此上面這些與入口文件有直接聯繫或間接聯繫的文件都會經過webpack去打包,輸出爲一個bundle.js
而index.html
是引用了bundle.js
文件的,因此就出現了這個效果。git
main.css
文件body{
color: blue;
/* font-size: 64px; */
}
你會看到終端webpack在從新打包,打包完後瀏覽器自動刷新了頁面,而後字體變成默認大小複製代碼
$ npm run server-hot
main.css
文件,咱們會發現字體大小變了,但是瀏覽器並無刷新,並且發現改一次就多一個js文件,頁面只是局部刷新style.css
這個文件,它的結果是會從新加載頁面,爲何呢?由於style.css
這裏頭用到了CSS模塊的東西,因此沒辦法說直接打個補丁就能搞定。熱加載這個東西,首要就是靠服務器與瀏覽器之間的通訊,有了通訊才能通知瀏覽器何時去刷新,而刷新又分全局和局部,這個要看服務端改了哪些代碼文件,而這些文件若是能夠局部刷新就局部刷新,不行的話就只能從新加載頁面了。github
前端開發熱更新原理解讀web