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配置解决文件丢失的用法,在多数情况下,**此选项的值是 / **。

相关推荐
咩咩啃树皮1 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
阳光是sunny1 小时前
LangGraph中的Reducer是什么
前端·人工智能·后端
触底反弹1 小时前
一文搞懂 Tailwind CSS 弹性布局:从原理到实战
前端·css·html
阳光是sunny1 小时前
从链到图:LangGraph 入门基础全解析
前端·人工智能·后端
小林ixn2 小时前
从 ??= 到 onKeyDown:一个 React 组件的“自我修养”
前端·javascript·react.js
REDcker3 小时前
显示分辨率标准对照详解
前端·网络·分辨率·显示·屏幕
এ慕ོ冬℘゜3 小时前
前端实战:jQuery 多条件联合搜索(标题模糊查询 + 日历时间段筛选)
前端·javascript·jquery
武子康3 小时前
Search Console Platform Properties 扩大 SEO 资产边界:从 Page Ranking 到 Topic Coverage(5 类误读边界 + 3 表数据层设计)
前端·人工智能·后端
一点一木4 小时前
从60首歌到1个网站:输入你的故事,还你一首歌
前端·github
IT_陈寒5 小时前
Vue这个特性差点让我加班到凌晨,谁懂啊
前端·人工智能·后端