摘要:然而配合服務(wù)器的實(shí)現(xiàn)局部刷新,同時(shí)更新端的代碼并非易事。如下介紹一種可行的實(shí)施方案適用于可有可無。如果在開發(fā)模式下,有更完善的服務(wù)器渲染熱加載的解決方案,歡迎大家積極貢獻(xiàn)
原文鏈接
前言
hot reload分析
react靜態(tài)資源熱加載分析
react服務(wù)器配置分析
待解決
總結(jié)
前言由react客戶端渲染的前端界面配合webpack-dev-server, react-hot-loader很容易實(shí)現(xiàn)前端開發(fā)過程中的局部刷新。然而配合node服務(wù)器的react-isomorphic實(shí)現(xiàn)局部刷新,同時(shí)更新client, server端的代碼并非易事。
如下介紹一種可行的實(shí)施方案:
hot reload分析 react靜態(tài)資源熱加載分析適用于 koa2, react-hot-loader3, react-router可有可無。
Demo代碼地址:https://github.com/lanjingling0510/blog/tree/master/react-isomorphic-hot-example
react靜態(tài)資源的熱加載配置并不復(fù)雜。webpack-dev-server負(fù)責(zé)重新編譯代碼,react-hot-loader負(fù)責(zé)熱加載。
Note:webpack-dev-server也可以用開一個(gè)express服務(wù)器配合webpack-dev-middleware和webpack-hot-middleware中間件實(shí)現(xiàn)
配置webpack.client-dev.js:
plugins: [ new webpack.HotModuleReplacementPlugin() ] // ... entry: [ "react-hot-loader/patch", "webpack-dev-server/client?http://127.0.0.1:8080", "webpack/hot/only-dev-server", "./src/client/home", // 入口路徑 ]
修改babel配置文件
"plugins": [ "react-hot-loader/babel" ]
修改入口文件
import React from "react"; import ReactDOM from "react-dom"; // 共享的組件頁面 import Home from "../shared/page/Home"; // 熱加載組件 import ReactHotLoader from "../shared/component/ReactHotLoader"; const container = document.getElementById("react-container"); function renderApp(TheApp) { ReactDOM.render(react服務(wù)器配置分析, container ); } renderApp(Home); // 下面的代碼用來支持我們熱加載應(yīng)用 if (__DEV__ && module.hot) { // 接受這個(gè)文件的修改用來熱加載 module.hot.accept("./home.js"); // 應(yīng)用任何的改變將造成熱加載,重新渲染。 module.hot.accept( "../shared/page/Home", () => renderApp(require("../shared/page/Home").default) ); }
開發(fā)模式下,server端的配置比較復(fù)雜,需要考慮的事情如下:
監(jiān)聽server代碼的變動。
需要重新編譯server代碼
重新開啟server服務(wù)器,并保證require最新的server代碼
保證server端口按需開關(guān),不沖突
監(jiān)聽server代碼
// 監(jiān)聽server文件的變化,如果被修改則調(diào)用compileHotServer const watcher = chokidar.watch([ path.resolve(__dirname, "../src"), path.resolve(__dirname), ], {ignored: path.resolve(__dirname, "../src/client")}); watcher.on("ready", () => { watcher .on("add", compileHotServer) .on("addDir", compileHotServer) .on("change", compileHotServer) .on("unlink", compileHotServer) .on("unlinkDir", compileHotServer); });
關(guān)閉所有與客戶端的連接,關(guān)閉server服務(wù)器,重新編譯server代碼
// 關(guān)閉所有連接,關(guān)閉服務(wù)器,重新編譯 function compileHotServer() { compiling ++; // listenerManager實(shí)例包含當(dāng)前web服務(wù)器對象和客戶端連接的socket集合 if (listenerManager) { listenerManager.dispose(true).then(runCompiler); } else { runCompiler(); } } // webpack重新編譯 function runCompiler() { compiler.run(() => undefined); }
重新開啟server服務(wù)器
// server代碼編譯完成 // 開啟server服務(wù)器 compiler.plugin("done", stats => { compiling --; if (compiling !== 0) return; if (stats.hasErrors()) { console.log(stats.toString()); return; } console.log("? ? Build server bundle done."); // 確保新的server bundles 代碼不在module cache當(dāng)中 Object.keys(require.cache).forEach((modulePath) => { if (modulePath.indexOf(compiler.options.output.path) !== -1) { delete require.cache[modulePath]; } }); try { const listener = require(compiledOutputPath).default; listenerManager = new ListenerManager(listener, "server"); } catch (err) { console.log(err); } });待解決
. react-router包含的頁面組件更新后,提示[react-router] You cannot change
通過以上配置,可以實(shí)現(xiàn)修改代碼后,實(shí)現(xiàn)server和client代碼的更新以及hot reload。
代碼開發(fā)過程中,需要開啟兩個(gè)端口,分別用來提供client端靜態(tài)資源的編譯和后臺的server。
如果在開發(fā)模式下,有更完善的react isomoriphic服務(wù)器渲染熱加載的解決方案,歡迎大家積極貢獻(xiàn) ?
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/80746.html
摘要:配置之后端渲染年已經(jīng)占據(jù)前端的主流不得不承認(rèn)這也是前端的未來發(fā)展方向但是后端渲染的開發(fā)方式仍然很常見不管是個(gè)人項(xiàng)目還是商業(yè)項(xiàng)目后端渲染搞起來真是糙猛快但是借著前端發(fā)展的東風(fēng)后端渲染也有很大的改進(jìn)空間這里就介紹一下我自己的實(shí)踐經(jīng)驗(yàn)前后端不分離 webpack配置之后端渲染2017年, vue, react, angular 已經(jīng)占據(jù)前端的主流, 不得不承認(rèn)這也是前端的未來發(fā)展方向. 但是...
摘要:的作用在文檔中是這么說的給下級組件中的提供可用的的對象。這個(gè)文件里的主要是被方法引入,并傳給的,算是一個(gè)默認(rèn)的。表示當(dāng)前的名稱。這個(gè)值表示在里面的值。便于控制,同時(shí)某些不需要渲染的,也不會造成渲染。 注:這篇文章只是講解React Redux這一層,并不包含Redux部分。Redux有計(jì)劃去學(xué)習(xí),等以后學(xué)習(xí)了Redux源碼以后再做分析注:代碼基于現(xiàn)在(2016.12.29)React ...
摘要:這也成為了一些開發(fā)者跨入移動開發(fā)大門的第一道小門檻。目前已經(jīng)知道了調(diào)試設(shè)置中和。 React Native(以下簡稱RN)為傳統(tǒng)前端開發(fā)者打開了一扇新的大門。其中,使用瀏覽器的調(diào)試工具去Debug移動端的代碼,無疑是最吸引開發(fā)人員的特性之一。 試想一下,當(dāng)你在手機(jī)屏幕按下一個(gè)按鈕,處理事件的代碼就可以立即在瀏覽器的調(diào)試工具里進(jìn)行斷點(diǎn)調(diào)試,而且每當(dāng)你對代碼進(jìn)行修改,界面便可以完成快速地重...
摘要:譯者按最近依舊如火如荼相信大家都躍躍欲試我們團(tuán)隊(duì)也開始在領(lǐng)域有所嘗試年應(yīng)該是逐漸走向成熟的一年讓我們一起來看看國外的開發(fā)者們都總結(jié)了哪些最佳實(shí)踐年在全世界都有很多關(guān)于新的更新和開發(fā)者大會的討論關(guān)于去年的重要事件請參考那么年最有趣的問題來了我 譯者按:最近React(web/native)依舊如火如荼,相信大家都躍躍欲試,我們團(tuán)隊(duì)也開始在React領(lǐng)域有所嘗試. 2016年應(yīng)該是Reac...
閱讀 1462·2021-11-22 09:34
閱讀 1409·2021-09-22 14:57
閱讀 3453·2021-09-10 10:50
閱讀 1471·2019-08-30 15:54
閱讀 3717·2019-08-29 17:02
閱讀 3503·2019-08-29 12:54
閱讀 2651·2019-08-27 10:57
閱讀 3345·2019-08-26 12:24