webpack-manifest-plugin 生成 asset-manifest.json,建立带哈希的静态资源文件名与路径映射,支持 cdn 分发、路径替换和精准缓存控制;需启用 contenthash 命名、同步上传 manifest 文件并配合服务端动态替换资源路径。

用 webpack-manifest-plugin 输出静态资源清单,核心是让每个构建产物的文件名(含哈希)与实际路径一一映射,并生成一个可被服务端或前端读取的 JSON 文件(如 asset-manifest.json),从而支持 CDN 按需分发、路径替换和缓存精准控制。
安装并启用 manifest 插件
安装插件:
npm install webpack-manifest-plugin --save-dev
在 webpack.config.js 的 plugins 中配置:
const ManifestPlugin = require('webpack-manifest-plugin');<br><br>module.exports = {<br> plugins: [<br> new ManifestPlugin({<br> fileName: 'asset-manifest.json',<br> // 可选:只记录 publicPath 下的资源,避免绝对路径<br> publicPath: '',<br> // 可选:过滤掉非 JS/CSS/图片等主资源(如 .map 文件)<br> filter: (file) => !file.path.endsWith('.map'),<br> // 可选:自定义 key 映射逻辑,例如去掉 publicPath 前缀<br> generate: (seed, files) => {<br> const manifest = {};<br> files.forEach(file => {<br> // 默认 key 是原始文件名,value 是带 hash 的完整路径<br> manifest[file.name] = file.path;<br> });<br> return manifest;<br> }<br> })<br> ]<br>};
确保资源带内容哈希,避免缓存冲突
CDN 分发依赖文件名变化来触发更新,所以必须启用哈希命名:
- JS 文件用
[contenthash](推荐)或[chunkhash],例如:filename: 'js/[name].[contenthash:8].js' - CSS 文件配合
MiniCssExtractPlugin使用[contenthash]:filename: 'css/[name].[contenthash:8].css' - 图片/字体等资源通过
url-loader或file-loader同样启用哈希:name: 'media/[name].[contenthash:6].[ext]'
这样每次内容变更,文件名都会变,manifest 中记录的就是最新路径,CDN 缓存自然失效,无需手动清理。
配合服务端或模板动态替换资源路径
以 Flask 或 Express 等后端为例,可在渲染 HTML 时读取 asset-manifest.json,将 main.js 这类原始引用替换成带哈希的真实路径:
- Flask 示例中,通过
context_processor封装cdn_url_for函数,模板里写{{ url_for("static", filename="main.js") }},实际输出的是/static/js/main.a1b2c3d4.js - Node.js + Express 可类似实现中间件,在
res.locals注入映射函数 - 若用 SSR(如 Next.js / Nuxt),通常已有内置 manifest 支持,只需确认
public/asset-manifest.json随静态资源一并部署到 CDN 目录
关键点:manifest 文件本身也要上传到 CDN,且与静态资源在同一层级;否则服务端读不到或前端 fetch 失败。
部署时同步上传 manifest 和资源到 CDN
打包后,dist/asset-manifest.json 和所有静态文件需一同上传。常见做法:
- 写 Node 脚本读取 manifest,遍历
Object.values()获取所有路径,逐个上传至 OSS/S3/CDN - 使用 CLI 工具(如
aws s3 sync、ossutil)直接同步整个dist目录 - CI/CD 流程中增加一步:先构建 → 再上传
dist→ 最后刷新 CDN 缓存(如有必要)
注意:不要只上传 JS/CSS,漏掉 asset-manifest.json,否则路径替换逻辑会 fallback 到原始文件名,导致 404 或加载旧版本。











