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

相关推荐
陈随易3 小时前
Postman 被曝自动往 Claude Code 和 Codex 装插件
前端·后端·程序员
Csvn6 小时前
性能监控
前端
Csvn7 小时前
构建工具
前端
FRing037 小时前
vue2干货总结3(computed计算属性、watch监听器)
开发语言·前端·vue.js·vue2
kyriewen9 小时前
Skills 榜前 10 我全装了:只有 3 个能直接用
前端·javascript·程序员
IT_陈寒10 小时前
当Java的hashCode遇上Lombok,我的缓存被全清了
前端·人工智能·后端
李剑一10 小时前
他是数字世界的开创者,41岁走完了被亏欠的天才人生,拯救千万人,却被祖国定罪
程序员
工控丫丫10 小时前
帆软看板中经常使用的公式函数及经常搭的组合
前端·javascript·数据库
jerrywus11 小时前
我用 GPT-6.1-sol 做了台会讲解的 3D 售货机:60 罐饮料,一口没喝上
前端·agent·claude
孟陬12 小时前
Foobar 技术周刊#159:当看不懂代码时,如何高效排障调试。脏页陷阱:一条只读查询,写入数 TB 数据。推测解码:大模型加速利器
前端·人工智能·后端