publicPath理解

230 阅读1分钟

在vue这种框架中,通常会需要配一个publicPath(vue-cli是publicPath,vite中是base)。这个属性有什么影响呢?

它会影响打包结果中index.html里对script和css等资源的引用,举个例子,如果base配的是 / (默认值),那么index.html中是这样的:

<script type="module" crossorigin src="/assets/index-bd6fd748.js"></script>
<link rel="modulepreload" crossorigin href="/assets/__commonjsHelpers__-7a77ea84.js">
<link rel="stylesheet" href="/assets/index-135e50ca.css">

如果base配的是 xx

<script type="module" crossorigin src="/xx/assets/index-bd6fd748.js"></script>
<link rel="modulepreload" crossorigin href="/xx/assets/__commonjsHelpers__-7a77ea84.js">
<link rel="stylesheet" href="/xx/assets/index-135e50ca.css">

这就是这个属性的全部作用,仅此而已!

为什么要这样做呢?举个例子:如果你的网站的首页是 www.aaa.com/xx,在你的服务器的配置中,遇到/xx这个路径,会去你配置的静态文件夹下寻找文件:

server {
    listen 80;
    server_name your_domain.com;  # 替换为你的域名或 IP

    location /xx {
        root /path/to/your/static/files;  # 替换为静态文件的路径
        index index.html;  # 设置默认文档
        try_files $uri $uri/ =404;  # 尝试访问文件,不存在则返回404
    }
}

你的项目打包后的dist是这样的:

dist
- index.html
- assets
-- aaa.js
-- bbb.css

所以要访问到aaa.js的话,则需要浏览器请求这个地址:www.aaa.com/xx/assets/aaa.js,在index.html文件中对这个js文件的引用应该是:

<script type="module" crossorigin src="/xx/assets/aaa.js"></script>

tips: src值是相对于网站的host的,不是path,如果你的网页地址是 www.aaa.com/,src值配的是/assets/aaa.js,最终请求的url是 www.aaa.com//assets/aaa.js。这就是需要publicPath的原因。