国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

react服務器渲染下,hot reload解決方案

tomorrowwu / 1042人閱讀

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

原文鏈接

前言

hot reload分析

react靜態資源熱加載分析

react服務器配置分析

待解決

總結

前言

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

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

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

hot reload分析

react靜態資源熱加載分析

react靜態資源的熱加載配置并不復雜。webpack-dev-server負責重新編譯代碼,react-hot-loader負責熱加載。

Note:webpack-dev-server也可以用開一個express服務器配合webpack-dev-middlewarewebpack-hot-middleware中間件實現

配置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);

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

開發模式下,server端的配置比較復雜,需要考慮的事情如下:

監聽server代碼的變動。

需要重新編譯server代碼

重新開啟server服務器,并保證require最新的server代碼

保證server端口按需開關,不沖突

監聽server代碼

 // 監聽server文件的變化,如果被修改則調用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);
 });

關閉所有與客戶端的連接,關閉server服務器,重新編譯server代碼

 // 關閉所有連接,關閉服務器,重新編譯
 function compileHotServer() {
     compiling ++;
     // listenerManager實例包含當前web服務器對象和客戶端連接的socket集合
     if (listenerManager) {
         listenerManager.dispose(true).then(runCompiler);
     } else {
         runCompiler();
     }
 }
 
 // webpack重新編譯
 function runCompiler() {
    compiler.run(() => undefined);
 }

重新開啟server服務器

// server代碼編譯完成
 // 開啟server服務器
 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當中
     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,但不影響刷新

總結

通過以上配置,可以實現修改代碼后,實現server和client代碼的更新以及hot reload。
代碼開發過程中,需要開啟兩個端口,分別用來提供client端靜態資源的編譯和后臺的server。

如果在開發模式下,有更完善的react isomoriphic服務器渲染熱加載的解決方案,歡迎大家積極貢獻 ?

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/80746.html

相關文章

  • webpack配置之后端渲染

    摘要:配置之后端渲染年已經占據前端的主流不得不承認這也是前端的未來發展方向但是后端渲染的開發方式仍然很常見不管是個人項目還是商業項目后端渲染搞起來真是糙猛快但是借著前端發展的東風后端渲染也有很大的改進空間這里就介紹一下我自己的實踐經驗前后端不分離 webpack配置之后端渲染2017年, vue, react, angular 已經占據前端的主流, 不得不承認這也是前端的未來發展方向. 但是...

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

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

    alphahans 評論0 收藏0
  • React Native基礎&入門教程:調試React Native應用的一小步

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

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

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

    syoya 評論0 收藏0

發表評論

0條評論

tomorrowwu

|高級講師

TA的文章

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