资讯专栏INFORMATION COLUMN

react服务器渲染下,hot reload解决方案

tomorrowwu / 897人阅读

摘要:然而配合服务器的实现局部刷新,同时更新端的代码并非易事。如下介绍一种可行的实施方案适用于可有可无。如果在开发模式下,有更完善的服务器渲染热加载的解决方案,欢迎大家积极贡献

原文链接

前言

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服务器渲染热加载的解决方案,欢迎大家积极贡献 ?

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/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元查看
<