Webpack-dev-server编译文件,但不刷新或使编译的javascript可供浏览器使用

时间:2016-03-16 14:51:20

标签: javascript webpack vue.js webpack-dev-server

我尝试使用webpack-dev-server编译文件并启动开发Web服务器。

在我的package.json中,我将脚本属性设置为:

"scripts": {
  "dev": "webpack-dev-server --hot --inline",
 }

因此--hot--inline应该启用网络服务器和热重新加载(据我所知)。

在我的webpack.config.js文件中,我设置了entry,output和devServer设置,并添加了一个加载器来查找.vue个文件中的更改:

module.exports = {
    entry: './src/index.js',
    output: {
        path: __dirname + '/public',
        publicPath: '/public',
        filename: 'bundle.js'
    },
    devtool: 'source-map',
    devServer:{
        contentBase: __dirname + '/public'
    },
    module:{
        loaders:[
            { test: /\.vue$/, loader: 'vue'}
        ]
    }
};

因此,使用此设置,我运行npm run dev。 webpack-dev-server启动,模块加载器测试工作(即当我保存任何.vue文件时,它会导致webpack重新编译),但是:

  • 浏览器永不刷新
  • 存储在内存中的已编译的javascript永远不会对浏览器可用

在第二个项目符号中,我可以看到这一点,因为在浏览器窗口中,vue占位符永远不会被替换,如果我打开javascript控制台,Vue实例永远不会被创建或全局可用。

Gif of issue

我错过了什么?

13 个答案:

答案 0 :(得分:58)

这里有两件事导致了我的问题:

module.exports = {
    entry: './src/index.js',
    output: {

        // For some reason, the `__dirname` was not evaluating and `/public` was
        // trying to write files to a `public` folder at the root of my HD.
        path: __dirname + '/public', 

        // Public path refers to the location from the _browser's_ perspective, so 
        // `/public' would be referring to `mydomain.com/public/` instead of just
        // `mydomain.com`.
        publicPath: '/public',
        filename: 'bundle.js'
    },
    devtool: 'source-map',
    devServer:{

        // `contentBase` specifies what folder to server relative to the 
        // current directory. This technically isn't false since it's an absolute
        // path, but the use of `__dirname` isn't necessary. 
        contentBase: __dirname + '/public'
    },
    module:{
        loaders:[
            { test: /\.vue$/, loader: 'vue'}
        ]
    }
};

这里是固定的webpack.config.js

var path = require('path');

module.exports = {
    entry: [
        './src/PlaceMapper/index.js'
    ],
    output:{
        filename: 'bundle.js',
        path: path.resolve(__dirname, 'public/')
    },
    devtool: 'source-map',
    devServer:{
        contentBase: 'public'
    },
    module:{
        loaders:[
            { test: /\.vue$/, loader: 'vue'}
        ]
    }
};

答案 1 :(得分:12)

经过长时间的搜索后,我发现问题的解决方案,在我的情况下输出路径未正确配置。

此配置解决了我的问题:

const path = require('path');

module.exports = {
  "entry": ['./app/index.js'],
  "output": {
    path: path.join(__dirname, 'build'),
    publicPath: "/build/",
    "filename": "bundle.js"
  }....

答案 2 :(得分:8)

我的开发服务器也有问题,它停止工作。以前它有效,然后我添加了大量额外内容以获得生产版本。然后当我回到 devserver 时它不再工作了。

进行了大量调查 - 最终从 git 中的先前提交开始,然后一一重新引入更改,直到我弄清楚为止。

原来这是我对 package.json 所做的更改,特别是这一行:

  "browserslist": "> 1%, not dead",

这对于指导 postcss 很有用,关于要定位的浏览器。

但是,它会停止 devserver 工作。解决方法是将其添加到开发 webpack 配置中:

target: 'web', 

我在这里找到了解决方案:https://github.com/webpack/webpack-dev-server/issues/2812

希望能为某人省去几个小时的麻烦!

答案 3 :(得分:4)

我有同样的问题,我发现除了所有这些点之外,我们还必须将index.html与输出bundle.js放在同一个文件夹中,并将contentBase设置为此文件夹,或者根目录或子文件夹。

答案 4 :(得分:2)

由于 ExtractTextPlugin ,可能会发生这种情况。在开发模式下取消激活ExtractTextPlugin。仅用于生产构建。

答案 5 :(得分:1)

在同一个webpack-dev-server端口上运行两个不同的应用程序之后,这也发生在我身上。即使另一个项目被关闭,也会发生这种情况。当我改为未使用的端口时,它开始直接工作。

devServer: {
    proxy: {
        '*': {
            target: 'http://localhost:1234'
        }
    },
    port: 8080,
    host: '0.0.0.0',
    hot: true,
    historyApiFallback: true,
},

如果您像我一样使用Chrome,则只需打开Developer Tools并点击Clear site data即可。您还可以通过以隐身模式运行网站来查看是否存在此问题。

enter image description here

答案 6 :(得分:0)

就我而言,删除“ --hot”使其可行。因此,我删除了hot: true

webpack.dev.js

module.exports = merge(common, {
  mode: 'development',
  devtool: 'inline-source-map',
  devServer: {
    publicPath: '/js/',
    contentBase: path.resolve(__dirname, 'docs'),
    watchContentBase: true,
  }
});

webpack.common.js

  output: {
    path: path.resolve(__dirname, 'docs/js'),
    filename: '[name].min.js',
    library: ['[name]']
  },

答案 7 :(得分:0)

我的情况是,我对Webpack功能进行了非常深入的试验,但完全忘记了我一直将注入设置为虚假……

Public Sub INSERT_id(datee As Date)
    Dim cmd As New OleDbCommand("Insert into table1(id,DATE_PIVIé) values(@id,@DATE_PIVIé)", con)

    cmd.Parameters.Add("id", OleDbType.Integer).Value = Max_id() + 1
    cmd.Parameters.Add("DATE_PIVIé", OleDbType.Date).Value = datee
    con.Open()
    cmd.ExecuteNonQuery()
    con.Close()
End Sub

打开票是我的票。

答案 8 :(得分:0)

正确的解决方案

告诉dev-server 观看devServer.watchContentBase选项提供的文件。

  

默认情况下处于禁用状态。

启用后,文件更改将触发整页重新加载

示例:

module.exports = {
  //...
  devServer: {
    // ...
    watchContentBase: true
  }
};

答案 9 :(得分:0)

我遇到过类似的情况,其中webpack-dev-server正在提供我的index.html文件,但没有更新。阅读了几篇文章后,我意识到webpack-dev-server不会生成新的js文件,而是将一个文件注入index.html

我将html-webpack-plugin添加到了我的应用中,并在我的webpack.config.js文件中进行了以下配置:

const HtmlWebpackPlugin = require('html-webpack-plugin')

plugins: [
    new HtmlWebpackPlugin({
      filename: 'index.html',
      template: 'index.html',
      inject: true
    })
  ]

然后,我注释掉引用我在index.html中的入口js文件的脚本标记。现在,我可以运行webpack-dev-server,而无需任何其他标志,对文件的任何更改都将立即显示在浏览器中。

答案 10 :(得分:0)

在这里,我将自己关于Webpack --watch的特殊故事加到苦难中。

我在跑步

webpack --watch

以便构建Typescript项目。已编译的.js文件将更新,但浏览器看到的捆绑包不会更新。所以我基本上和OP处于同一位置。

我的问题归结于watchOptions.ignored参数。构建配置的原始作者已将ignored设置为过滤器函数,结果证明该参数不是有效值。用适当的RegExp替换过滤器功能后,--watch的构建再次为我工作。

答案 11 :(得分:0)

您的项目树尚不清楚,但是问题可能出在contentBase设置中。尝试设置contentBase:__dirname

答案 12 :(得分:-1)

开发服务器:{ watchContentBase: 真 }