最稳妥做法是用 copy-webpack-plugin 将 public 目录整体复制到 dist,保留原始结构且不参与构建流程;需用 path.resolve(__dirname, 'public') 指定绝对路径,to 设为 './' 复制到 dist 根目录。

直接用 copy-webpack-plugin 把 public 目录整体复制到 dist,是最常用也最稳妥的做法。关键不是“复制文件”,而是保留原始目录结构、不参与构建流程、不被 Webpack 解析。
安装插件并引入
先安装(开发依赖):
npm install copy-webpack-plugin --save-dev
在 webpack.config.js 中引入:
const CopyPlugin = require('copy-webpack-plugin');
配置 patterns 复制整个 public 目录
推荐使用 patterns 写法(v6+ 版本标准用法),确保路径清晰、行为可预期:
-
from指向源目录的绝对路径,建议用path.resolve(__dirname, 'public') -
to设为'./'或'dist',表示复制到输出根目录(即dist下) - 不加额外选项时,默认递归复制全部内容,包括子目录和文件,结构完全保留
示例配置:
plugins: [
new CopyPlugin({
patterns: [
{
from: path.resolve(__dirname, 'public'),
to: './'
}
]
})
]
注意路径写法和常见陷阱
避免用相对路径字符串如 'public' 或 './public' —— 它们依赖当前工作目录,容易出错。
- 如果
public在项目根目录,path.resolve(__dirname, 'public')是安全写法 - 如果
public在src下(如src/public),就写成path.resolve(__dirname, 'src/public') -
to: './'表示复制到output.path(通常是dist)的根下;若想放进dist/public,则写to: 'public'
验证是否生效
打包后检查 dist 目录结构是否与 public 一致:
-
public/favicon.ico→dist/favicon.ico -
public/robots.txt→dist/robots.txt -
public/img/logo.png→dist/img/logo.png
这些文件不会被打包进 JS/CSS,也不会被 loader 处理,就是原样搬运。











