【问题标题】:Webpack dev server reload doesn't work on virtual boxWebpack 开发服务器重新加载在虚拟机上不起作用
【发布时间】:2015-11-12 20:46:27
【问题描述】:

我正在使用 vagrant over mac OSX 在 Ubuntu 15.10 的虚拟机上运行 webpack 服务器。

webpack 配置非常干净:

var HtmlWebpackPlugin = require('html-webpack-plugin');
var path = require('path');
var webpack = require('webpack');

var MINIFY = process.env.MINIFY === true;

var FRONTEND_ROOT = './static'
var SRC_PATCH = FRONTEND_ROOT + '/scripts';
var BUILD_PATH = './dist';


module.exports = {
  entry: SRC_PATCH + '/main.js',
  devtool: 'source-map',
  output: {
      path: BUILD_PATH,
      filename: 'bundle.js'
  },
  resolve: {
    extensions: ['', '.js', '.jsx'],
    modulesDirectories: [SRC_PATCH, 'node_modules']
  },
  plugins: [
    new HtmlWebpackPlugin({
      filename: 'index.html',
      template: path.resolve(FRONTEND_ROOT, 'index-template.html'),
      minify: MINIFY
    })
  ],
  module: {
    loaders: [
      {
        test: /\.jsx|js$/,
        exclude: /node_modules/,
        loader: 'babel-loader'
      }
    ]
  },
  eslint: {
    configFile: './.eslintrc'
  }
};

Webpack 是在 VM 上运行的

vagrant@vagrant-ubuntu-wily-64:/vagrant$ webpack-dev-server --port 8080 --devtool eval --progress --colors --hot --content-base dist

当我从 OSX 编辑文件时,它不会重新加载,但如果我从 VM 编辑相同的文件,它会重新加载。

有什么问题?我该如何解决?

【问题讨论】:

  • 您是否与虚拟机共享主机上的文件夹?
  • 是的,我的项目根目录安装到 VM os 上的 /vagrant 目录

标签: vagrant webpack webpack-dev-server


【解决方案1】:

我已经用 vagrant rsync-auto 解决了我的问题 https://docs.vagrantup.com/v2/cli/rsync-auto.html

我将config.vm.synced_folder ".", "/vagrant", type: "rsync", rsync_auto: true, rsync_exclude: ".git/" 添加到我的Vagrantfile,并在单独的标签下运行vagrant rsync-auto

【讨论】:

    【解决方案2】:

    这是在另一个问题下回答的: https://stackoverflow.com/a/34937378/5114

    如果添加 --watch-poll 选项,它会改变 webpack 查找文件更改的方式。

    webpack-dev-server --watch-poll --port 8080 --devtool eval --progress --colors --hot --content-base dist
    

    这使得 webpack 每 N 毫秒轮询一次文件的更改。轮询在 Vagrant 共享目录中起作用,而普通方法不起作用,因为它不查找 mtime 或其他文件系统属性,只是按时间间隔读取文件。它速度较慢并且使用更多的 cpu/内存,所以除非必须,否则不要使用轮询。

    https://webpack.github.io/docs/cli.html#watch

    【讨论】:

      【解决方案3】:

      长话短说:对主机系统 (MacOS) 上的文件所做的任何更改都不会作为事件传播到来宾框 synced_folder

      因此,依赖文件系统事件的功能,如 Webpack 的“热重载”(webpack-hot-middleware)、nodemon 的 --watch 选项等将无法工作。

      根本原因是,VirtualBox 有decided 没有实现inotify。 引用:

      原因是主机和来宾可能具有不同的文件系统,vboxsf 必须实施通用协议才能将该信息从主机转发到来宾。这必须在许多不同的主机/访客组合之间起作用。因此,将此票标记为“无法修复”,抱歉。

      解决方法是使用 Maxim Shepelin 的 this answer 中描述的 rsync

      【讨论】:

        【解决方案4】:

        您需要查看的第一件事是,在您运行服务器的控制台中,重新编译的过程是否正在发生。如果不是,答案就在上面@maxim-schepelin 所说的 SyncFolder 行中。如果正在重新编译并且网页没有重新加载,则可能是 webPack 解决方案。

        编辑

        文件夹同步无法正常工作的另一个原因可能是https://github.com/guard/listen/wiki/Increasing-the-amount-of-inotify-watchers

        【讨论】:

          猜你喜欢
          • 2017-11-03
          • 2019-05-22
          • 2018-11-24
          • 1970-01-01
          • 2017-05-03
          • 2020-03-06
          • 2017-04-15
          • 2017-06-07
          • 2021-12-14
          相关资源
          最近更新 更多