publicPath 的作用是什么?
在 Webpack 中,publicPath 是一个非常关键的配置项,它的主要作用是:指定打包后的静态资源(如 JS、CSS、图片、字体等)在被浏览器加载时的“基础 URL 路径”(Prefix URL)。
简单来说,它决定了打包出来的代码中,各类资源引用地址的前缀是什么。
1. 核心区别:output.path vs output.publicPath
很多初学者容易混淆这两个概念:
output.path(本地物理路径):决定打包后的文件存在你电脑/服务器的哪个硬盘目录里(例如:/dist)。output.publicPath(线上访问路径):决定浏览器去哪里下载这些文件(例如:https://cdn.com/assets/)。
2. publicPath 的主要应用场景
根据不同的部署方式,publicPath 的设置也不同:
场景一:部署在域名根目录下(默认/最常见)
如果你打算把网站部署在 https://example.com/:
javascript
module.exports = {
output: {
path: path.resolve(__dirname, 'dist'),
publicPath: '/' // 根路径
}
}
- 生成的 HTML:
<script src="/main.js"></script> - 浏览器请求:
https://example.com/main.js
场景二:部署在子目录/子路径下
如果你打算把网站部署在 https://example.com/my-app/:
javascript
module.exports = {
output: {
path: path.resolve(__dirname, 'dist'),
publicPath: '/my-app/' // 指定子路径
}
}
- 生成的 HTML:
<script src="/my-app/main.js"></script> - 浏览器请求:
https://example.com/my-app/main.js - 注意:如果不加
/my-app/,页面可能会报 404 错误,因为浏览器会去根目录下找资源。
场景三:使用 CDN 托管静态资源(性能优化)
如果你把 JS/CSS/图片上传到了 CDN 存储桶(如阿里云 OSS、腾讯云 COS):
javascript
module.exports = {
output: {
path: path.resolve(__dirname, 'dist'),
publicPath: 'https://cdn.example.com/assets/' // CDN 绝对路径
}
}
- 生成的 HTML:
<script src="https://cdn.example.com/assets/main.js"></script> - CSS 中的图片:
background: url(https://cdn.example.com/assets/logo.png)
场景四:相对路径(Webpack 5 默认是 'auto')
如果你不确定部署路径,希望资源相对于当前的 index.html:
javascript
module.exports = {
output: {
publicPath: '' // 或 'auto'
}
}
- 生成的 HTML:
<script src="main.js"></script>
3. publicPath 影响了哪些具体内容?
publicPath 不仅影响 index.html 里的 <script> 和 <link> 标签,还会影响 Webpack 内部的机制:
- 按需加载(Code Splitting / 懒加载):
当你使用import('./module.js')异步加载代码块(Chunk)时,Webpack 内部的 runtime 会根据publicPath去拼接补全这个 Chunk 的下载地址。如果publicPath错了,异步加载就会失败(404)。 - CSS 中的资源路径:
CSS 中通过url('./bg.png')引入的图片,经过 Webpack 编译后,路径会被重写为publicPath + 图片名。 - 资源模块(Asset Modules):
字体文件、音视频等静态资源被加载时,其最终返回的 URL 都会带上publicPath。
4. 补充:运行时动态设置 publicPath
如果在编译时(打包时)无法确定 CDN 地址(比如需要根据环境动态注入),可以在入口 JS 文件的最顶部添加如下代码:
javascript
// 在项目的 entry 入口文件顶部
__webpack_public_path__ = window.resourceCdnHost;
Webpack 会在运行时使用这个全局变量作为 publicPath。
总结
publicPath 就是资源引用的前缀。配置它的核心原则是:你在浏览器控制台(Network 标签页)看到请求静态资源的 URL 应该是什么,publicPath 就应该怎么配置。
右滑查看面试常问