Docker容器中的Vue.js Webpack模板:如何添加Webpack-Dev-Server --watch-poll标志?

时间:2017-01-04 18:55:30

标签: node.js docker webpack vue.js webpack-dev-server

我正在我创建的docker容器中运行基础Vue.js Webpack模板(https://github.com/vuejs-templates/webpack/)的webpack / webpack-dev-server部分。容器还包含vue CLI以创建新项目(如果需要,可以在此处获取我的容器:https://hub.docker.com/r/ncevl/webpack-vue/)。

  

从webpack-simple模板转移到此模板后,热重新加载不起作用。

使用Webpack-Simple模板可以正常工作,您可以在此处克隆/查看:https://github.com/vuejs-templates/webpack-simple

我能够使用以下webpack-development-server启动命令运行简单模板(使用热重载按预期工作):

webpack-dev-server --hot --inline --progress --host 0.0.0.0 --watch-poll

那就说webpack模板的完整(不简单)版本似乎没有使用webpack-dev-server启动命令,而是使用build / dev-server.js中引用的其他中间件({{3和webpack dev config。

由于--watch-poll是让WDS热重载功能在上一个项目中的docker容器中工作的关键,我的想法是我需要做一些类似于webpack-hot-middleware但是我在他们的文档中没有看到任何内容(在这里:https://github.com/vuejs-templates/webpack/blob/master/template/build/dev-server.js),它涉及改变基于轮询的方法。

  

我不是百分之百确定轮询标志会起作用,因为我可以看到容器在我做出更改时重新编译我的源代码。如果我手动刷新,我也可以在浏览器中看到更改。

     

如果我在chrome dev工具中检查我的浏览器页面,然后转到network / XHR,我可以看到浏览器确实从webpack-dev-server接收信息,但在视觉上它不是更新。

上面我假设websockets(或者我认为使用的socket.io)正在浏览器和WDS之间进行通信,所以这可能是某种浏览器缓存问题吗? < / p>

我检查了我的控制台,发现这看起来像是一个标题问题:

https://github.com/glenjamin/webpack-hot-middleware

作为参考,该图片中的文字错误(为了让任何有同样问题的人更容易找到这篇文章)是:

  

EventSource无法加载enter image description here。 No&#39; Access-Control-Allow-Origin&#39;标头出现在请求的资源上。起源&#39; http://__webpack_hmr/&#39;因此不允许访问。

使用webpack-simple Vue.js模板时,Hot-Reload / Hot Module Reload再次使用这个相同的容器设置。

我想知道是否有人遇到类似的事情,或者对如何添加投票选项有任何想法。我想我的替代方案是回滚到更基本的webpack配置并重建那部分东西以使用传统的webpack-dev-server / webpack配置但是给出上面的我不确定是否会修复它。

2 个答案:

答案 0 :(得分:6)

我将此作为单独的答案添加,因为它更具体地回答标题中的问题,而我的其他答案更具体地解释了解决我实际问题的原因。

vue.js webpack模板项目(可以从Vue CLI初始化,也可以从它的repo中取出:https://github.com/vuejs-templates/webpack)将其配置文件分成几个不同的目录。

  

我发布这个答案,以便任何遇到需要在项目中添加民意调查的人都能够了解如何/在何处这样做。

Vue.js webpack模板项目的基础项目结构如下所示:

Vue.js "Webpack" template directory structure

如果您正在努力使热模块重新加载工作,那么您关心的文件与主要使用webpack-dev-middleware创建服务器有关。与此相关的最重要文件在此处突出显示:

Important Settings for Vue.js Webpack template dev server

基本上,如果要将轮询代码添加到webpack-dev-middleware服务器,则需要位于第20到24行的/build/dev-server.js文件中,如下所示:

var devMiddleware = require('webpack-dev-middleware')(compiler, {
  publicPath: webpackConfig.output.publicPath,
  quiet: true
})

要添加轮询,您可以在quiet:之前或之后添加它:true。作为旁注,如果您遇到HMR问题,我会将“quiet:true”改为queit false,以便从webpack-dev-middleware中获取更详细的信息。我在上面的代码中包含了详细和轮询修改:

var devMiddleware = require('webpack-dev-middleware')(compiler, {
  publicPath: webpackConfig.output.publicPath,
  quiet: false, //Changed to for additional verbosity
  watchOptions: { //Add Polling
    aggregateTimeout: 300,
    poll: 1000 
  }
})

我的另一个答案是关于最终解决我的问题的方法,不一定是如何实际添加轮询(这对其他人来说可能是必要的,但最终不需要使我的dockerized设置工作)。

还应该注意,有时当HMR(webpack热模块重新加载)没有检测到更改时,这是由于webpack-hot-middleware或webpack-dev-middleware正在遇到一个问题,其中一些不可见的字符是/被添加到基础项目目录的名称(可能由构建基础Vue项目的人),因此某些操作系统上的webpack无法查看更改。

  

如果您遇到这种情况并且您使用的是OSx或在docker容器内运行webpack并且无法让HMR检测到更改,请尝试重命名您的vue-webpack项目目录,它应该可以正常工作。

答案 1 :(得分:2)

确定。所以我真的不能相信这个,因为它实际上是由讨论用户CristianPallarés在这里回答:http://webpack.github.io/docs/webpack-dev-server.html#combining-with-an-existing-server

克里斯蒂安说:

  

我只是尝试了同样的事情。我只在localhost:8000上使用“php artisan serve”,在localhost:3000上使用Webpack Dev Server。你应该这样做:

     
      
  • 将您的webpack配置“output.publicPath”设置为“http://localhost:3000/static/”而不是“/ static /”
  •   
  • 让你的php应用程序加载:
  •   
     

关键是output.publicPath是绝对的。现在,您应该运行“php artisan serve”并启动您的webpack开发服务器(在我的情况下,我使用gulp)。

基本上我接受了这个并挖掘了Vue.js Webpack模板文件,找到了webpack正在寻找公共路径的配置文件。公共路径设置最终位于模板的/ config目录中的index.js文件中。

我将代码更改为:

    assetsSubDirectory: 'http://localhost:8080/static/',  //!!Changed from /static/
    assetsPublicPath: 'http://localhost:8080/', //!!Changed from /

与之前没有工作的设置相反,看起来像这样:

    assetsSubDirectory: '/static/',  
    assetsPublicPath: '/',

之后,我能够在我的docker容器中运行vue.js Webpack模板时看到我的更改热重载。