【问题标题】:Webpack 4 devServer HMR plus full reload on other file changes (like views)Webpack 4 devServer HMR 加上其他文件更改的完全重新加载(如视图)
【发布时间】:2019-02-18 17:34:24
【问题描述】:

我有一个使用 webpack-dev-server 并启用了 HMR 并通过 npm 脚本以这种方式启动的 Webpack4 配置的 Web 项目:

cross-env NODE_ENV=development webpack-dev-server --inline --hot

一切正常,HMR 适用于我的 js 和 scss 文件。现在我想知道当我修改视图模板文件时是否可以扩展我的 Webpack 配置以在浏览器中完全重新加载。

在我看来webpack-dev-server 自己无法做到这一点,所以我想我需要一些其他插件。谷歌搜索了一下,这是我得到的:

  1. webpack-dev-server + browser-sync-webpack-plugin
  2. 将我的配置重写为webpack-serve,因为它看起来像it can do it
  3. chokidar + webpack-dev-middleware(用于重新加载的API?)

所以我的问题是使用 Webpack 4(.17.2) 获取 HMR + 观察给定路径并在文件更改时重新加载浏览器 (blade/twig/php/etc...) 的最佳方法是什么?

我当前配置的相关部分:

devServer: {
  index: '',
  open: true,
  hotOnly: true,
  publicPath: '/build/',
  host: 'mysite.test',
  proxy: {
    '**': {
      target: 'http://mysite.test',
      changeOrigin: true,
      headers: {
        'X-Dev-Server-Proxy': 'http://mysite.test'
      }
    }
  }
}

【问题讨论】:

    标签: node.js webpack browser-sync livereload webpack-serve


    【解决方案1】:

    回答自己,也许其他人可以从中受益。请注意:我有一个 Laravel 项目,我使用 Webpack4 来捆绑它,而不是它自己的 Laravel Mix 解决方案。我的测试 Laravel 站点由 mysite.test 上的 nginx 提供服务

    1) webpack-dev-server + BrowserSync

    效果很好,BrowserSync 有很多不错的功能,我喜欢!唯一的缺点是它在 Webpack 的 devserver 之上创建了另一个代理。您可以按照以下步骤尝试:

    按照说明安装browser-sync-webpack-plugin,然后:

    const BrowserSyncPlugin = require('browser-sync-webpack-plugin');
    
    // Webpack config, plugins section
    plugins: [
      new BrowserSyncPlugin({
        host: "mysite.test",
        port: 3000,
        proxy: "mysite.test:8080",
        open: "external",
        files: [
          './resources/views/**/*.blade.php'
        ]
      },{
        // prevent BrowserSync from reloading the page
        // and let Webpack Dev Server take care of this
        reload: false
      })
    ]
    

    2) webpack-serve

    由于 webpack-contrib/webpack-serve 已弃用,因此不再可选。

    3) webpack-dev-server + Chokidar

    最后我开始使用它。简单快速。 Chokidar 是一个文件观察器,它也被 Webpack 的开发服务器在内部用于观察文件。您可能已经在 node_modules 中安装了它,但如果没有,请使用 npm 或 yarn 安装它。

    这是我最初想要的整个 devServer 配置。 HMR 处理 CSS 注入和 Javascript 更改,当视图文件更改时,devserver 会自动重新加载浏览器:

    const chokidar = require('chokidar');
    
    // Webpack's devServer config
    devServer: {
      before(app, server) {
        chokidar.watch([
          './resources/views/**/*.blade.php'
        ]).on('all', function() {
          server.sockWrite(server.sockets, 'content-changed');
        })
      },
      index: '',
      open: true,
      host: 'mysite.test',
      proxy: {
        '**': {
          target: 'http://mysite.test',
          changeOrigin: true,
          headers: {
            'X-Dev-Server-Proxy': 'http://mysite.test'
          }
        }
      }
    }
    

    在 Webpack 4.19.1 上测试

    【讨论】:

    • 感谢您发布您的解决方案。找到它是因为我正在尝试做同样的事情!关于这方面的信息很少。我们不能成为唯一在 webpack 中混合后端和前端的人!
    • 我现在正在亲吻你。我已经全职尝试了两天。你知道那种你必须直截了当的怪胎感觉吗?哦,我的上帝,谢谢你!!!! PS:去抖手表功能对性能有很大帮助! :)
    • 澄清一下,这个问题是关于观看任意源文件(据我所知)。可以使用watch-content-base option 来查看构建文件中的文件更改。
    猜你喜欢
    • 2019-05-14
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-25
    • 2017-07-20
    • 2016-11-29
    相关资源
    最近更新 更多