【问题标题】:Hot reload in Electron/React applicationElectron/React 应用程序中的热重载
【发布时间】:2017-05-13 03:10:07
【问题描述】:

热重载似乎不再起作用。我不确定我的设置会发生什么变化,事实上据我所知,git 日志显示,什么都没有改变。

无论如何,我正在尝试重新加载 CSS 和 Reacts .jsx 文件。

目前,我在另一个控制台选项卡中运行npm run watch,然后运行npm run start。应用程序启动,但不会重新加载文件中的任何更改。我的 package.json 如下所示:

{
  ...
  "main": "main.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "cross-env ENVIRONMENT=DEV electron main.js",
    "watch": "webpack-dev-server --hot --inline",
    "build": "webpack"
  },
  "dependencies": {
    "axios": "^0.15.2",
    "babel": "^6.5.2",
    "babel-loader": "^6.2.5",
    "babel-plugin-transform-class-properties": "^6.19.0",
    "babel-preset-es2015": "^6.6.0",
    "babel-preset-react": "^6.5.0",
    "babelify": "^7.2.0",
    "cross-env": "^3.1.1",
    "electron": "^1.3.4",
    "electron-prebuilt": "^1.4.2",
    "json-loader": "^0.5.4",
    "react": "^15.3.2",
    "react-dom": "^15.3.2",
    "react-router": "^2.8.1",
    "react-tap-event-plugin": "^1.0.0",
    "semantic-ui-react": "^0.56.13",
    "socket.io-client": "^1.5.0",
    "store": "^1.3.20",
    "webpack": "^1.13.3"
  },
  "devDependencies": {
    "css-loader": "^0.25.0",
    "style-loader": "^0.13.1",
    "webpack-dev-server": "^1.16.2"
  }
}

省略了一些不必要的依赖。我的webpack.config.js 如下所示:

var path = require("path");

module.exports = {
  entry: path.resolve(__dirname, "app/index.jsx"),
  output: {
    path: path.resolve(__dirname, "build"),
    publicPath: 'http://localhost:8080/build/',
    filename: 'app.js'
  },
  module: {
    loaders: [
        {
            test: /\.jsx?$/,
            loader: 'babel',
            exclude: /node_modules/
        },
        { 
            test: /\.css$/,
            loader: "style-loader!css-loader"
        },
        { 
            test: /\.json$/, 
            loader: "json-loader"
        }
    ]
  }    
};

为了在此设置中进行热重载工作,我缺少什么?

编辑: 如您所见,入口点定义为index.jsx。这个文件非常简单,如下所示:

import React from 'react';
import ReactDOM from 'react-dom';
import styles from './styles.css'
import routes from './router.jsx'

ReactDOM.render(
  routes,
  document.getElementById('app')
);

每当我对此文件进行更改时,都会触发热重载。此外,此处导入的文件(如 styles.css)的更改也会重新加载。问题是,我的所有组件显然都导入了我的路由器。因此,对我的组件的任何更改都不会热重载。我怎样才能让它正常工作?

【问题讨论】:

  • 你所有的JS文件都是jsx的扩展名吗?您的第一个加载程序通知考虑扩展 jsx。可以更新您的问题吗?
  • 是的,所有组件都有.jsx 扩展名。
  • 任何使用组件都必须大写,试试看。我知道这很奇怪,但我已经看到了。路线 -> 路线

标签: reactjs webpack electron webpack-dev-server


【解决方案1】:

我用成webpack.config.js这个选项:

var path = require('path');
var webpack = require('webpack');

module.exports = {
  name: 'client',
  entry: './client.js',
  output: {
    path: __dirname, filename: 'bundle.js'
  },
  module: {
    loaders: [
      { 
        test: /\.jsx?$/,         // Match both .js and .jsx files
        exclude: /node_modules/, 
        loader: "babel-loader", 
        query:
        {
          presets: ['es2015', 'react']
        }
      }
    ]
  },
  devServer: {
    historyApiFallback: true
  },
}

并进入package.json这个选项:

  "scripts": {
    "start": "npm run dev",
    "webpack": "webpack --progress --colors",
    "dev": "webpack-dev-server --devtool eval --progress --colors --inline"
  },

【讨论】:

    【解决方案2】:

    有时组件不知道如何自行热重载。您可以尝试添加到您的index.jsx

    if (module.hot) {
      module.hot.accept()
    }
    

    如果这不起作用,我建议依靠react-hot-loader

    您必须安装 webpack-hot-middleware,并更改您的 entry 以包含它。

    entry: [
      'webpack-hot-middleware/client',
      path.resolve(__dirname, 'build')
    ]
    

    鉴于您使用的是--hot 选项,我认为您不需要添加HotModuleReplacementPlugin,但我可能错了。

    还有 v3 的 react-hot loader 即将发布,您可以研究一下,但我认为如果您使用的是 Webpack 1,最好保持稳定版本。

    您还可以查看完整的 react-transform-boilerplate 存储库,它为使用 Webpack 进行热重载提供了完整的工作配置。

    【讨论】:

    • 我尝试将您提到的声明if (module.hot){} 添加到我的index.jsx,但没有看到任何改进。我想强调 index.jsxrouter.jsx 会在更改时进行热重载,但其他 UI 组件不会这样做。因此,热重载应该可以工作,并且我认为某些配置不正确。
    • 很抱歉,您的问题已经出现了。那很奇怪,您的回购是否有机会公开?调试起来会更容易。如果没有,您可能想试用React Hot Loader 3 beta,如果您有兴趣,我可以更新我的答案。
    • 它不公开,但我可以根据需要发布代码的 sn-ps。我认为问题出在配置文件之一(webpack.config.js、package.json 等)而不是任何组件文件。
    【解决方案3】:

    如果您使用 WebStorm 或其他支持“SafeWrite”的编辑器,您可能需要禁用它。

    https://webpack.github.io/docs/webpack-dev-server.html

    “使用支持“安全写入”的编辑器/IDE 请注意,许多编辑器支持“安全写入”功能并默认启用它,这使得开发服务器无法正确观看文件。 “安全写入”是指更改不是直接写入原始文件,而是写入临时文件,当保存操作成功完成时,临时文件被重命名并替换原始文件。此行为会导致文件观察程序丢失轨道,因为原始文件已被删除。为了防止这个问题,你必须在你的编辑器中禁用“安全写入”功能。

    VIM - 设置 :set backupcopy=yes(见文档) IntelliJ - 设置 ▶︎ 系统设置 ▶︎ 同步 ▶︎ 禁用安全写入(可能在各种 IntelliJ IDE 中有所不同,但您仍然可以使用搜索功能)”

    【讨论】:

    • 我目前正在使用 Sublime Text。请注意,正如我在原始帖子的编辑中所述,会针对少数几个文件触发热重载,因此这不是问题。
    • 看看我链接的页面底部的 cmets。第一个可能是“...Webpack 对输出配置属性的路径和文件名属性的值非常挑剔...”。
    • 输出路径不是问题,因为应用程序确实在我的/build 目录中正确放置了一个包。
    • 但不应该。文档说:“这个修改过的包是从内存中的 publicPath 中指定的相对路径提供的(参见 API)。它不会被写入您配置的输出目录。”
    • 我不确定您的建议,publicPath 在我的输出配置中指定。
    猜你喜欢
    • 2021-04-03
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    • 2018-02-15
    • 2019-04-26
    • 2018-07-04
    • 2018-08-07
    相关资源
    最近更新 更多