成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

react服務(wù)器渲染下,hot reload解決方案

tomorrowwu / 1068人閱讀

摘要:然而配合服務(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í)施方案:

適用于 koa2, react-hot-loader3, react-router可有可無。

Demo代碼地址:https://github.com/lanjingling0510/blog/tree/master/react-isomorphic-hot-example

hot reload分析

react靜態(tài)資源熱加載分析

react靜態(tài)資源的熱加載配置并不復(fù)雜。webpack-dev-server負(fù)責(zé)重新編譯代碼,react-hot-loader負(fù)責(zé)熱加載。

Note:webpack-dev-server也可以用開一個(gè)express服務(wù)器配合webpack-dev-middlewarewebpack-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(
      
          
      ,
      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)
    );
}
react服務(wù)器配置分析

開發(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 ; it will be ignored,但不影響刷新

總結(jié)

通過以上配置,可以實(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

相關(guān)文章

  • webpack配置之后端渲染

    摘要:配置之后端渲染年已經(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ā)展方向. 但是...

    wing324 評論0 收藏0
  • React Redux: 從文檔看源碼 - Components篇

    摘要:的作用在文檔中是這么說的給下級組件中的提供可用的的對象。這個(gè)文件里的主要是被方法引入,并傳給的,算是一個(gè)默認(rèn)的。表示當(dāng)前的名稱。這個(gè)值表示在里面的值。便于控制,同時(shí)某些不需要渲染的,也不會造成渲染。 注:這篇文章只是講解React Redux這一層,并不包含Redux部分。Redux有計(jì)劃去學(xué)習(xí),等以后學(xué)習(xí)了Redux源碼以后再做分析注:代碼基于現(xiàn)在(2016.12.29)React ...

    alphahans 評論0 收藏0
  • React Native基礎(chǔ)&入門教程:調(diào)試React Native應(yīng)用的一小步

    摘要:這也成為了一些開發(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)行修改,界面便可以完成快速地重...

    NickZhou 評論0 收藏0
  • React.js 最佳實(shí)踐(2016)_鏈接修正版

    摘要:譯者按最近依舊如火如荼相信大家都躍躍欲試我們團(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...

    syoya 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<