webpack publicPath作用原理

详解一下webpack中publicPath的作用。

output中的publicPath是给其它loader或plugin使用的,它们会把publicPath拼在某些路径上。

比如file-loader,该loader的作用是遇到文件,就把文件复制到打包目录,并返回一个路径A,如果配置了publicPath,返回的路径就是publicPath+A。

比如HTMLWebpackPlugin,该plugin的作用是在打包文件夹下生成一个html,并引入打包好的js文件,如果配置了publicPath,引用js路径前就会加上publicPath。

publicPath本质就是一个字符串,它是给其它loader或plugin这样使用的,除此之外没有其它的功能。

那么,这样做有何深意,能解决什么问题?下面看一个这样的例子:

例子很简单,主要有三个文件:webpack.config.js配置文件,index.js业务文件,和一张图片文件file.png。

index.js文件的功能也很简单,只是导入图片,放到body中,代码如下:

js 复制代码
import png from "./file.png";
var img = document.createElement("img");
img.src = png;
document.body.appendChild(img);

重点在于webpack.config.js配置文件,那张图片需要file-loader解析,然后用到了HTMLWebpackPlugin插件,在打包目录中生成html文件,配置如下:

webpack.config.js 复制代码
module: {
    rules: [
        {
          test: /\.(png|jpe?g|gif)$/i,
          loader: "file-loader",
        },
    ],
},
plugins: [new HtmlWebpackPlugin(), new CleanWebpackPlugin()],

这样生成的打包结果,dist文件夹目录如下:

打开index.html,图片正常展示,说明路径没出问题:

现在我想换个配置,我希望打包后的图片在imgs文件夹下,index.html在html文件夹下,于是我修改了webpack配置:

webpack.config.js 复制代码
module: {
      rules: [
        {
          test: /\.(png|jpe?g|gif)$/i,
          loader: "file-loader",
          options: {
            name: "imgs/[name].[ext]",
          },
        },
      ],
},
plugins: [
      new HtmlWebpackPlugin({
        filename: "html/index.html",
      }),
      new CleanWebpackPlugin(),
],

这样生成打包结果,dist文件夹目录如下:

打开index.html,图片找不到,且在控制台看到图片的访问路径是:http://127.0.0.1:5500/html/imgs/file.png

这个图片的访问路径明显是有问题的,因为按照dist目录结构来看,正确的访问路径应该是http://127.0.0.1:5500/imgs/file.png

为什么会这样?

原因是,html页面访问地址是http://127.0.0.1:5500/html/index.html

经loader转换后的图片路径是相对路径是./imgs/file.png。

所以,图片最终路径为http://127.0.0.1:5500/html/imgs/file.png

注意: 浏览器中所有资源路径永远相对于"打开的HTML文件",不是JS文件!不管是在HTML直接引,还是在JS里引,全部以HTML所在文件夹为基准,因为js是寄生在HTML页面里运行的,JS执行上下文属于HTML页面)。

访问路径错了,那怎么解决这个问题呢?答案就是配置publicPath。

我们这样配置webpack:

webpack.config.js 复制代码
module: {
      rules: [
        {
          test: /\.(png|jpe?g|gif)$/i,
          loader: "file-loader",
          options: {
            name: "imgs/[name].[ext]",
          },
        },
      ],
},
plugins: [
      new HtmlWebpackPlugin({
        filename: "html/index.html",
      }),
      new CleanWebpackPlugin(),
],
output: {
      publicPath: "/",
},

publicPath设置"/"。

于是,总页面路径还是http://127.0.0.1:5500/html/index.html

但是图片路径从相对路径变成了绝对路径/imgs/file.png。

所以,绝对路径会以域名为起点查找,所以图片最终路径是http://127.0.0.1:5500/imgs/file.png ,这样就能找到图片。

总结

以上就是用output的publicPath配置解决文件丢失的用法,在多数情况下,**此选项的值是 / **。

相关推荐
__zRainy__12 分钟前
Node系列 · Node基础:全局变量与全局对象
开发语言·前端·javascript
码云骑士17 分钟前
104-实战论文搜索引擎-ArXiv爬取-Milvus存储-RAG问答-Gradio前端
前端·python·搜索引擎·milvus
sunly_28 分钟前
TypeScript总结:15、类型速查
前端·javascript·typescript
Brown.alexis28 分钟前
es6知识点3-自备使用
前端·javascript·es6
2601_9539880730 分钟前
Ricon组态系统vs传统组态软件:为什么选择新一代Web组态平台
前端·后端·物联网·tcp/ip·数学建模·前端框架
天空之城--35 分钟前
Claude Code 高效开发 Web 2D/3D 完全指南:心法、自定义 Skill 体系与社区技能包实战
前端·3d
IT_陈寒43 分钟前
SpringBoot自动配置坑了我三天,原来漏了这个注解
前端·人工智能·后端
逝水无殇1 小时前
HTML 文本格式化详解:掌握 <strong>、<em>、<mark>、<del> 等常用标签
前端·javascript·html
特立独行的猫a1 小时前
DeepSeek Harness插件和工具的区别介绍及开发入门指南
前端·ai·agent·插件·deepseek·harness
小新讲网安1 小时前
HTTP请求走私攻击实战:CL.TE与TE.CL绕过前端服务器全解析
服务器·前端·网络·web安全·http·架构·漏洞