react 热替换 ([HMR])

热替换好多地方可以用到,目前比较流行的用法是搭配React和webpack实现在不刷新页面的情况下对模块的增删改。在给项目添加热替换功能的时候,可以说是踩了各种坑,webpack官方给的配置也有小问题还不得不翻墙去解决(百度出来的一个能打的也没有)。

官方的方案在这儿:https://webpack.js.org/guides/hmr-react/

我先把自己配置成功的贴出来,再说一下如果完全照搬官方配置,会产生的问题:

(只保留热替换相关配置和最基础配置,且只考虑开发不考虑生产,且假设你已安装必要的包)

  1. module.exports = {
  2. entry: [
  3. 'react-hot-loader/patch', // 1
  4. // 开启 React 代码的模块热替换(HMR)
  5. './src',
  6. ],
  7. output: {
  8. filename: 'js/bundle.js',
  9. path: path.resolve(__dirname, 'public'),
  10. publicPath:'http://localhost:7000/', // 2
  11. },
  12. module: {
  13. rules: [
  14. { test: /\.(js|jsx)$/, use: 'babel-loader', exclude: /node_modules/ },
  15. { test: /\.css$/,
  16. use:['style-loader', 'css-loader', 'postcss-loader'], // 3
  17. exclude: /node_modules/ },
  18. ],
  19. },
  20. resolve: {
  21. extensions: ['.js', '.jsx'],
  22. },
  23. devServer: {
  24. port: 7000,
  25. hot: true, // 4
  26. // 开启服务器的模块热替换(HMR)
  27. headers: {
  28. 'Access-Control-Allow-Origin': '*', // 5
  29. },
  30. },
  31. plugins: [
  32. new webpack.HotModuleReplacementPlugin(), // 6
  33. // 开启全局的模块热替换(HMR)
  34. new webpack.NamedModulesPlugin(), // +
  35. // 当模块热替换(HMR)时在浏览器控制台输出对用户更友好的模块名字信息
  36. ],
  37. }

react 和babel 部分的配置与官方相同即可。

参考官方配置你遇到第一个问题:

  1. [HMR] Update failed: SyntaxError: Unexpected token < in JSON at position 0
  2. at Object.parse (<anonymous>)
  3. at XMLHttpRequest.request.onreadystatechange

这个问题很头疼,因为你去搜索完全找不到有用的东西,而且你看不出来错在哪了,当时的心情真是。。。

最后在 react-hot-loader 的 github 库的 Issues 里翻到了有人和我一样的问题,大快人心。

原来是 output 的 publicPath 出了问题用 '/' 是不行滴,要把启动webpack服务的地址填上:'http://localhost:7000/'。其实也不能怪官方文档,人家是假设你应用程序和包都托管给 webpack 服务,但是我的只把包托给了 webpack 服务,应用程序是另外启动的 node 服务。好吧这是个比较小众的问题,你要是正好有这个问题,还搜到了这篇文章,那是好福气了。

另外一个

  1. XMLHttpRequest cannot load http://localhost:7000/4221731a75de7a449377.hot-update.json. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8000' is therefore not allowed access. The response had HTTP status code 404

这个问题只在 webpack 服务发生变动时候有,并不影响HMR使用,所以不管它也可以。

devServer里添加

  1. headers: {
  2. 'Access-Control-Allow-Origin': '*', // 5
  3. },

即可,也是因为应用程序没有托管给 webpack 导致。

如果你的应用程序和包都是托管给 webpack 服务,那就没有这两个问题了。

(话说应用程序一般都是另启服务的吧。。。)

再说一个问题,除了上面两个,是不是这么多配置都是必须的。不配置会导致什么错误。

首先,

  1. entry里的
  2. 'react-hot-loader/patch', // 1
  3. devServer里的
  4. hot: true, // 4
  5. plugins里的
  6. new webpack.HotModuleReplacementPlugin(), // 6

从字面上看就是必须的,不用想,否则不会热。

new webpack.NamedModulesPlugin(), // +只是让控制台输出的更友好,推荐但非必需

这个比较容易忽略:

  1. { test: /\.css$/,
  2. use:['style-loader', 'css-loader', 'postcss-loader'], // 3
  3. exclude: /node_modules/ },

style-loader 是必须的,否则样式的刷新就不热了。

很多人用 ExtractTextWebpackPlugin 把 css 文件单独弄出来就不用 style-loader了,不过推荐部署应用之前弄一份就行,开发用不着 ExtractTextWebpackPlugin 。

不用 style-loader 修改样式表就不会无刷新更新页面了。不过这一点容易想到。

还有一点就是 babel 配置文件里禁用 modules 很重要,否则导致各种问题,根本别想愉快的开发。这个对应用程序本身使用 import 没有影响,毕竟 webpack2 啥标准都支持,其他地方就用 require 吧。

react 热替换 ([HMR])的更多相关文章

  1. 模块热替换 HMR

    devserver:{hot:true},既及时更新代码,样式(需配合loader)变化,自动重编译,只适用于开发环境. 入口文件中,添加监视: + if (module.hot) {+ module ...

  2. webpack学习之—— 模块热替换(Hot Module Replacement)

    模块热替换(HMR - Hot Module Replacement)功能会在应用程序运行过程中替换.添加或删除模块,而无需重新加载整个页面.主要是通过以下几种方式,来显著加快开发速度: 保留在完全重 ...

  3. 【webpack】-- 模块热替换

    全称是Hot Module ReplaceMent(HMR),理解成热模块替换或者模块热替换都可以吧,和.net中的热插拔一个意思,就是在运行中对程序的模块进行更新.这个功能主要是用于开发过程中,对生 ...

  4. 【webpack学习笔记】a05-模块热替换

    什么是模块热替换? 这个功能会在程序运行过程中替换.添加或删除模块,而无需重新加载整个页面 有什么用呢? 保留在完全重新加载页面时丢失的应用程序状态. 只更新变更内容,以节省宝贵的开发时间. 调整样式 ...

  5. 启用 webpack 的模块热替换特性

    启用 webpack 的模块热替换特性: module.exports = { //... devServer: { hot: true } } 注意,必须有 webpack.HotModuleRep ...

  6. webpack学习_模块热替换(Hot Module Peaplacement)

    模块热替换(Hot Module Replacement 或 HMR) 是webpack提供的最有用的功能之一.允许在u女性是更新各种模块,而无需进行完全刷新. 启用HMR 承接之前的代码 webpa ...

  7. webpack 模块热替换的理解和使用

    模块热替换(webpack文档上也叫 Hot Module Replacement 或 HMR)是 webpack 提供的最有用的功能之一.它允许在运行时更新各种模块,而无需进行完全刷新. 这句话其实 ...

  8. Java_类的热替换

    转自:http://www.ibm.com/developerworks/cn/java/j-lo-hotswapcls/#ibm-pcon Java ClassLoader 技术剖析 在本文中,我们 ...

  9. 使用自己的ClassLoader实现热替换

    首先实现一个自己的ClassLoader,该ClassLoader重写findClass方法. 从classpath中加载类资源. 注意,不要重写loadClass方法.  因为在使用自定义的MyCl ...

随机推荐

  1. 使用mysql索引技巧及注意事项

    一.索引的作用 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化显然是重中之重. 在数据 ...

  2. [Mobile Web]Web中如何分辨移动设备?(iPad、iPhone、Android)

    第一种, Javascript [javascript] view plaincopyprint?在CODE上查看代码片派生到我的代码片 var deviceAgent = navigator.use ...

  3. 【Spark2.0源码学习】-4.Master启动

         Master作为Endpoint的具体实例,下面我们介绍一下Master启动以及OnStart指令后的相关工作   一.脚本概览      下面是一个举例: /opt/jdk1..0_79/ ...

  4. [ext4]空间管理 - 与分配相关的关键数据结构

     在块分配机制中,涉及到几个主要的数据结构. 通过ext4_allocation_request描述块请求,然后基于块查找结果即上层需求来决定是否执行块分配操作. 在分配过程中,为了更好执行分配, ...

  5. iOS开发 - Swift使用JavaScriptCore与JS交互

    一.前言 在这个提倡敏捷开发和H5横行的年代,原生App内嵌入一些H5页面已经成为一种流行的趋势.一套H5页面就可以适配复杂的iOS和Android页面,大量节省了开发和维护时间,如果本来就有移动端网 ...

  6. 【Atom】在一个中/大型项目中,那些好用而强大的atom功能

      作为一个学生党,一开始使用atom时候并没有意识到atom一些小功能的巨大作用,直到自己实习参与了项目,才知道这些功能在一个项目中是能极大提高工作效率的开发利器   下面是一位不愿意透露其姓名的彭 ...

  7. Vue2.x中的父子组件相互通信

    业务场景:(这里指的是直接父子级关系的通信) 美女(子组件)将消息发送给大群(父组件) 大群(父组件)收到美女发送的消息后再回个信息给美女(子组件) 父组件 template <template ...

  8. Windows7下安装IIS

    1.点击开始→控制面板,然后再点击程序,勿点击卸载程序,否则到不了目标系统界面. 2.然后在程序和功能下面,点击打开和关闭windows功能. 3.进入Windows功能窗口,然后看到internet ...

  9. 'k1': 大于66的所有值, 'k2': 小于66的所有值

    #!/usr/bin/env python # -*- coding: utf-8 -*- #有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值 ...

  10. 关于BSTR和SysStringLen方法的简单研究

    英文的我编不下去了,所以还是先写个中文的吧, 之前遇到了SysStringLen求Bstr长度不正确的问题,试验了几次都不行的情况下我觉得可能是这个方法的bug,所以就没管. 大概的情况是这样: in ...