Webpack:如何使用 webpack-dev-server 编译、写入磁盘和提供静态内容 (js/css)

IT技术 javascript node.js reactjs webpack ecmascript-6
2021-04-11 06:56:00

我想构建我的 js/css 代码,将其写入磁盘并在单个命令中使用 webpack-dev-server 为其提供服务。我不想为生产模式设置另一台服务器。我们该怎么做呢?在下面分享我的 webpack.config.js 文件内容:

module.exports = {
watch: true,
entry: [
    './src/index.js'
],
output: {
    path: __dirname +'/dist/',
    publicPath: '/dist/',
    filename: 'bundle.js'
},
module: {
    loaders: [
        {
            exclude:/(node_modules)/,
            loader: 'babel',
            query: {
                presets: ['es2015', 'react']
            }
        }
    ]
},
devServer: {
    historyApiFallback: true,
    contentBase: './'
}
};

请在下面的 package.json 中找到使用的启动脚本:

"start": "webpack-dev-server --progress --colors"

我正在运行“npm run start”。请帮忙。

5个回答

新的 webpack-dev-server发布,并且支持writeToDisk选项。

devServer: {
  writeToDisk: true
}
2021 年更新:对于 4.0.0,writeToDisk必须位于devMiddleware(Upvote this answer )
2021-05-27 06:56:00
这值得选择的答案。
2021-06-05 06:56:00

您可以将start脚本定义更改为:

"start": "webpack --watch & webpack-dev-server --inline --progress --colors".

这会将 webpack watch-and-rebuild 过程发送到后台,以便您还可以在使用webpack-dev-server.

编辑:

这些插件中的任何一个都可以满足您的需求:

我知道这些插件。我正在寻找最简单和最短的方法(对 3rd 方 nom 包的最小依赖)来运行基于 webpack 的 react 项目。你的第一种方法对我有用。谢谢。但是,我认为我们应该有一个单独的脚本用于生产构建。
2021-05-28 06:56:00
@JVM 嗯,实际上,我遇到了这个插件github.com/gajus/write-file-webpack-plugin他们使用这个插件写在这里束磁盘链接到有效的WebPack配置:github.com/gajus/write-file-webpack-plugin/blob/master/sandbox/...
2021-06-12 06:56:00
我认为只有当我打电话给开始时它才会起作用。热重载是否再次将文件写入磁盘?基本上,我想为 webpack-dev-server 提供写入磁盘功能。
2021-06-16 06:56:00
@JVM 是的,webpack --watch每次文件更改时,该命令都会将文件写入 /dist,而开发服务器会重新加载更新后的 src 文件。
2021-06-21 06:56:00

webpack-dev-server 使用“虚拟”Express 服务器和 Sock.js 来模拟在您的机器上运行的服务器。关于编译,webpack-dev-server 会bundle在检测到代码更改时重新编译然而,这种重新编译是从内存中提供的,而不是项目的build目录(或者,在您的情况下,是dist目录)。文档

使用此配置, webpack-dev-server 将为您build文件夹中的静态文件提供服务它将监视您的源文件,并在更改时重新编译包。

关于写入磁盘, webpack-dev-server 不会这样做。上面写的内容部分解决了这一问题。此外,请注意以下同样来自 Webpack 文档的内容:

这个修改后的包是从内存中指定的相对路径提供的publicPath(请参阅 API)。它不会写入您配置的output目录。如果捆绑已存在于同一 URL 路径中,则内存中的捆绑优先(默认情况下)。

要写入磁盘,请使用普通的 webpack module。当然,正如您的问题所暗示的那样,每次更改后手动重新编译是乏味的。为了解决这个麻烦,包括watch标志。从终端,您可以执行命令:

$ webpack --watch

但是,我更喜欢将其委托给 NPM 脚本。请注意,-w下面标志等效于编写--watch.

// NPM `scripts` field:
"watch": "webpack -w"

如果您想在运行 webpack-dev-server 的同时重新编译您的更改并写入您的输出目录,您可以添加一个额外的 NPM 脚本,如下所示:

"scripts": {
  "serve": "npm run watch && npm run start",
  "start": "webpack-dev-server --progress --colors",
  "watch": "webpack -w"
}

然后,在您的终端中,只需执行$ npm run serve即可完成此操作。



如果您对自动重新加载的额外便利感兴趣,可以通过在 Webpack 配置文件的 plugins 字段中定义以下内容来实现:

new webpack.HotModuleReplacementPlugin()

注意:这可能需要额外的 Babel 配置设置。如果我是你,我会query从你的 babel 加载器中取出这个字段,而是将你的 Babel 配置委托给一个外部.babelrc文件。与热重载兼容的好用程序可能如下所示:

{
  "presets": ["env", "es2015", "react"],
  "plugins": ["react-hot-loader/babel"]
}


附带说明一下,我创建了一个样板存储库,用于轻松启动具有我想要的结构的项目。的WebPack配置感兴趣的可能,具体。特别是,它采用 Webpack 2 并包括其他构建工具,如 Babel(用于转译)、ESLint(语法检查器)以及对 CSS/Sass 和各种其他文件格式的支持。

快速提问,因为我使用的是 web pack-dev-server,我不能像这样启用 HMR 吗?:start": "webpack --watch & webpack-dev-server --hot --inline --progress --colors"注意 --hot 选项
2021-05-24 06:56:00
我正在运行webpack --watch,我的文件只在第一次构建时编译。Subsequest 版本不显示。有什么建议吗?
2021-05-30 06:56:00
只需添加--hot,它就可以了。;)
2021-06-01 06:56:00
我相信这应该有效。但是,我认为如果您--hotpackage.json以及new webpack.HotModuleReplacementPlugin()Webpack 配置中包含该标志,它将不起作用。只使用一个
2021-06-10 06:56:00

使用webpack-dev-server v4.0.0+, devMiddleware

devServer: {
  devMiddleware: {
    writeToDisk: true
  }
}

webpack-dev-server 从内存中服务文件,你可以用webpack-simple-serve替换 webpack-dev-server ,它使用 webpack 的 watch 功能,将编译后的文件写入磁盘并使用serve-handler来服务。