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

我正在运行我创build的docker容器内的基础Vue.js Webpack模板( https://github.com/vuejs-templates/webpack/ )的webpack / webpack-dev-server部分。 该容器还包含vue CLI以创build新项目(如果需要,可以在此处获取我的容器: 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( https:// github)中引用的其他中间件。 com / vuejs-templates / webpack / blob / master / template / build / dev-server.js )和webpack devconfiguration。

因为–watch-poll是在上一个项目中使WDS热重载function在Docker容器中工作的关键,我的想法是我需要对webpack-hot-middleware做类似的事情,但是我没有看到在他们的文档中的任何东西(在这里: https : //github.com/glenjamin/webpack-hot-middleware )谈到转向基于轮询的方法。

我不是100%确定轮询标志会做的伎俩,因为我可以看到容器重新编译我的来源,当我做出改变。 如果手动刷新,我也可以在浏览器中看到更改。

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

给上述我假设websockets(或我认为是使用的socket.io)正在工作和浏览器和WDS之间的通信,所以也许这是一种浏览器caching问题的某种?

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

在这里输入图像说明

为了引用来自该图像的文本错误(以使得具有相同问题的任何人更容易find该文章)是:

EventSource无法加载http:// __ webpack_hmr / 。 请求的资源上没有“Access-Control-Allow-Origin”标题。 原因' http://0.0.0.0:8080 '因此不被允许访问。

当使用webpack-simple Vue.js模板时,Hot-Reload / Hot Module Reload又一次使用了相同的容器设置。

我想知道是否有人遇到类似的事情或有任何想法如何添加投票选项。 我想我的select将回滚到一个更基本的webpackconfiguration和重build的东西部分使用传统的webpack-dev-server / webpackconfiguration,但给上述我不知道这是要解决它。

我作为一个单独的答案,因为它更具体地回答标题中的问题,而我的另一个答案更具体地解释了什么解决了我的实际问题。

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

我张贴这个答案,以便谁需要添加投票到他们的项目将能够了解如何/在哪里做的。

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

Vue.js“Webpack”模板目录结构

如果您尝试获取热模块重新加载工作,那么您关心的文件与主要使用webpack-dev-middleware创build服务器有关。 与此相关的最重要的文件在这里突出显示:

Vue.js Webpack模板开发服务器的重要设置

基本上,如果您想要将轮询代码添加到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”更改为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 hot模块重新加载)没有检测到更改时,这是由于webpack-hot-middleware或webpack-dev-middleware遇到了一个问题,即一些不可见的字符被添加到基础项目目录的名称(可能由某人构build基础Vue项目),因此某些操作系统上的webpack无法看到更改。

如果这种情况发生在你身上,而你在OSx上或者在Docker容器中运行webpack,并且你不能让HMR检测到更改,请尝试重命名你的vue-webpack项目目录,它应该可以工作。

好。 所以我不能真正承认这一点,因为它实际上是由讨论用户CristianPallarés在这里回答: http ://webpack.github.io/docs/webpack-dev-server.html#combining-with-an- 现有的服务器

基督教说:

我只是想一样的。 我只在localhost:8000上使用“php artisan serve”,在localhost:3000上使用Webpack Dev Server。 你应该这样做:

  • 设置你的webpackconfiguration“output.publicPath”为“ http:// localhost:3000 / static / ”而不是“/ static /”
  • 让你的PHP应用程序加载:

关键是output.publicPath是绝对的。 现在,你应该运行“PHP工匠服务”,并启动你的webpack开发服务器(在我的情况下,我用咕嘟咕嘟)。

基本上我拿了这个,通过Vue.js Webpack模板文件findwebpack寻找公共path的configuration文件。 公共path设置最终位于模板的/ config目录下的index.js文件中。

我改变了我的代码看起来像这样:

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

与之前的设置不一样,看起来像这样:

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

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