成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

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

tomorrowwu / 1093人閱讀

摘要:然而配合服務(wù)器的實(shí)現(xiàn)局部刷新,同時(shí)更新端的代碼并非易事。如下介紹一種可行的實(shí)施方案適用于可有可無(wú)。如果在開(kāi)發(fā)模式下,有更完善的服務(wù)器渲染熱加載的解決方案,歡迎大家積極貢獻(xiàn)

原文鏈接

前言

hot reload分析

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

react服務(wù)器配置分析

待解決

總結(jié)

前言

react客戶端渲染的前端界面配合webpack-dev-server, react-hot-loader很容易實(shí)現(xiàn)前端開(kāi)發(fā)過(guò)程中的局部刷新。然而配合node服務(wù)器的react-isomorphic實(shí)現(xiàn)局部刷新,同時(shí)更新client, server端的代碼并非易事。
如下介紹一種可行的實(shí)施方案:

適用于 koa2, react-hot-loader3, react-router可有可無(wú)。

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也可以用開(kāi)一個(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";

// 共享的組件頁(yè)面
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);

// 下面的代碼用來(lái)支持我們熱加載應(yīng)用
if (__DEV__ && module.hot) {
    // 接受這個(gè)文件的修改用來(lái)熱加載
    module.hot.accept("./home.js");
    // 應(yīng)用任何的改變將造成熱加載,重新渲染。
    module.hot.accept(
      "../shared/page/Home",
      () => renderApp(require("../shared/page/Home").default)
    );
}
react服務(wù)器配置分析

開(kāi)發(fā)模式下,server端的配置比較復(fù)雜,需要考慮的事情如下:

監(jiān)聽(tīng)server代碼的變動(dòng)。

需要重新編譯server代碼

重新開(kāi)啟server服務(wù)器,并保證require最新的server代碼

保證server端口按需開(kāi)關(guān),不沖突

監(jiān)聽(tīng)server代碼

 // 監(jiān)聽(tīng)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ù)器對(duì)象和客戶端連接的socket集合
     if (listenerManager) {
         listenerManager.dispose(true).then(runCompiler);
     } else {
         runCompiler();
     }
 }
 
 // webpack重新編譯
 function runCompiler() {
    compiler.run(() => undefined);
 }

重新開(kāi)啟server服務(wù)器

// server代碼編譯完成
 // 開(kāi)啟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包含的頁(yè)面組件更新后,提示[react-router] You cannot change ; it will be ignored,但不影響刷新

總結(jié)

通過(guò)以上配置,可以實(shí)現(xiàn)修改代碼后,實(shí)現(xiàn)server和client代碼的更新以及hot reload。
代碼開(kāi)發(fā)過(guò)程中,需要開(kāi)啟兩個(gè)端口,分別用來(lái)提供client端靜態(tài)資源的編譯和后臺(tái)的server。

如果在開(kāi)發(fā)模式下,有更完善的react isomoriphic服務(wù)器渲染熱加載的解決方案,歡迎大家積極貢獻(xiàn) ?

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/80746.html

相關(guān)文章

  • webpack配置之后端渲染

    摘要:配置之后端渲染年已經(jīng)占據(jù)前端的主流不得不承認(rèn)這也是前端的未來(lái)發(fā)展方向但是后端渲染的開(kāi)發(fā)方式仍然很常見(jiàn)不管是個(gè)人項(xiàng)目還是商業(yè)項(xiàng)目后端渲染搞起來(lái)真是糙猛快但是借著前端發(fā)展的東風(fēng)后端渲染也有很大的改進(jìn)空間這里就介紹一下我自己的實(shí)踐經(jīng)驗(yàn)前后端不分離 webpack配置之后端渲染2017年, vue, react, angular 已經(jīng)占據(jù)前端的主流, 不得不承認(rèn)這也是前端的未來(lái)發(fā)展方向. 但是...

    wing324 評(píng)論0 收藏0
  • React Redux: 從文檔看源碼 - Components篇

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

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

    摘要:這也成為了一些開(kāi)發(fā)者跨入移動(dòng)開(kāi)發(fā)大門(mén)的第一道小門(mén)檻。目前已經(jīng)知道了調(diào)試設(shè)置中和。 React Native(以下簡(jiǎn)稱RN)為傳統(tǒng)前端開(kāi)發(fā)者打開(kāi)了一扇新的大門(mén)。其中,使用瀏覽器的調(diào)試工具去Debug移動(dòng)端的代碼,無(wú)疑是最吸引開(kāi)發(fā)人員的特性之一。 試想一下,當(dāng)你在手機(jī)屏幕按下一個(gè)按鈕,處理事件的代碼就可以立即在瀏覽器的調(diào)試工具里進(jìn)行斷點(diǎn)調(diào)試,而且每當(dāng)你對(duì)代碼進(jìn)行修改,界面便可以完成快速地重...

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

    摘要:譯者按最近依舊如火如荼相信大家都躍躍欲試我們團(tuán)隊(duì)也開(kāi)始在領(lǐng)域有所嘗試年應(yīng)該是逐漸走向成熟的一年讓我們一起來(lái)看看國(guó)外的開(kāi)發(fā)者們都總結(jié)了哪些最佳實(shí)踐年在全世界都有很多關(guān)于新的更新和開(kāi)發(fā)者大會(huì)的討論關(guān)于去年的重要事件請(qǐng)參考那么年最有趣的問(wèn)題來(lái)了我 譯者按:最近React(web/native)依舊如火如荼,相信大家都躍躍欲試,我們團(tuán)隊(duì)也開(kāi)始在React領(lǐng)域有所嘗試. 2016年應(yīng)該是Reac...

    syoya 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<