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

IT技术 javascript webpack vue.js webpack-dev-server
2021-03-05 21:03:21

我正在尝试使用 webpack-dev-server 来编译文件并启动一个开发网络服务器。

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

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

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

在我的webpack.config.js文件中,我设置了入口、输出和 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 启动,module加载器测试工作(即当我保存任何 .vue 文件时,它会导致 webpack 重新编译),但是:

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

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

问题的 Gif

我错过了什么?

6个回答

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

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'}
        ]
    }
};
webpack 的人应该在他们的工资单上有你的!这是迄今为止我在一年后看到的关于如何设置服务器的最佳文档。
2021-04-22 21:03:21
2021-04-25 21:03:21
medium.com/code-oil/...这帮助我理解为什么它不起作用。在我的情况下,我将 publicPath 设置为“/”,而它应该是“/js-lib/”,这就是它从不选择文件更改的原因,因为我在 js-lib 中提供静态文件而不是内存中'http:localhost:9001' + '/' 中的文件(你的 webpack-dev-server 主机 + publicPath)
2021-05-09 21:03:21
“publicPath”选项是开发服务器最容易混淆的部分。经验法则:如果您没有在“输出”块(webpack 配置)中设置“publicPath”,请不要在您的开发服务器中设置“publicPath”选项
2021-05-16 21:03:21
感谢您提到“publicPath”选项。这真的帮助了我!
2021-05-19 21:03:21

经过长时间的搜索,我找到了问题的解决方案,在我的情况下,输出路径配置不正确。

这个配置解决了我的问题:

const path = require('path');

module.exports = {
  "entry": ['./app/index.js'],
  "output": {
    path: path.join(__dirname, 'build'),
    publicPath: "/build/",
    "filename": "bundle.js"
  }....
通过在 publicPath 属性中的文件夹名称前添加斜杠解决了该问题。`输出:{文件名:'bundle.js',路径:path.resolve(__dirname,'dist/'),publicPath:'/dist',}`
2021-04-21 21:03:21
添加 publicPath 属性为我修复了它
2021-04-24 21:03:21

正确的解决方案

告诉dev-server观看由所服务的文件devServer.watchContentBase选项。

默认情况下它是禁用的。

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

例子:

module.exports = {
  //...
  devServer: {
    // ...
    watchContentBase: true
  }
};
我已经尝试了几个小时,你的建议终于奏效了。亲爱的开发人员,实际上 HMR 为我的项目工作。但是我通过代理将 webpack-dev-server 与 firebase-serve 相关联。当我应用此建议时,我的问题已解决。那谢谢啦。
2021-04-27 21:03:21

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

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

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

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

这对于指导postcss目标浏览器很有用

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

target: 'web', 

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

希望可以为某人节省几个小时的麻烦!

救命稻草!太感谢了。永远不会发现这一点。
2021-05-04 21:03:21

不知何故,就我而言,删除“--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]']
  },