Electron / React应用中的热重载

问题描述 投票:7回答:3

热重装似乎不再有效。 我不确定在我的设置中可以改变什么,事实上据我所知,git日志显示,没有任何改变。

无论如何,我试图重新加载CSS和.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)的更改。 问题是,我的所有组件显然都是在我的路由器中导入的。 因此,我的组件的任何更改都不会热重新加载。 我怎样才能正常工作?

reactjs webpack electron webpack-dev-server
3个回答
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"
  },

0
投票

有时组件不知道如何热重新加载自身。 您可以尝试添加到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即将到来,您可以查看,但我认为如果您使用Webpack 1,那么如果您保持稳定版本,那么对您来说会更好。

您还可以签出完整的react-transform-b​​oilerplate repo,它为Webpack的热重载提供了完整的工作配置。


-1
投票

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

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

“使用支持”安全写入“的编辑器/ IDE”请注意,许多编辑器支持“安全写入”功能并默认启用它,这使得dev服务器无法正确查看文件。“安全写入”意味着更改不会直接写入原始文件保存操作成功完成后重命名并替换原始文件。这种行为会导致文件监视器因原始文件被删除而丢失轨道。为了防止出现此问题,您必须禁用“安全”在编辑器中写下“功能”。

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

© www.soinside.com 2019 - 2024. All rights reserved.