Vite 静态资源处理之隔壁小孩也看懂了

配置 vite.config.ts 中的 options.resolve.alias 选项:

ts 复制代码
import { defineConfig } from 'vite';

export default defineConfig({
  resolve: {
    alias: {
      '@public': ''
    }
  }
})

这会让Vite知道这个路径别名。

我们在小学二年级就学到过,Vite在打包时,public文件夹中的静态资源会被自动拷贝到根目录下, 所以你需要使用 import Logo from '/logo.svg' 而不是 import Logo from '/public/logo.svg'。 像上面那样配置后, @public/logo.svg 将会等价于 /logo.svg, 因为 @public 被配置为等价于一个空字符串''

然后,你会发现别名已经可以正常运行了,但是还没有智能提示。

配置 tsconfig.jsonjsconfig.json 中的 paths 选项:

yaml 复制代码
{
  "compilerOptions": {
    "baseUrl": "./",
    "paths": {
      "@public/*": ["public/*"],
    },
    // ...
  },
  // ...
}

这会让vscode知道 @public/* 指向了 /public/*。现在开始,你就拥有ide的智能提示了!

使用

你可以在任何JS上下文中使用:

js 复制代码
import Logo from '@public/logo.svg'

document.querySelector('#app').innerHTML = `
  <img src="${Logo}" />
`
vue 复制代码
<script setup>
import Logo from '@public/logo.svg'
</script>

<template>
  <img :src="Logo" />
</template>
jsx 复制代码
import Logo from '@public/logo.svg'

export default function MyApp() {
  return (
    <img src={Logo} />
  );
}

易错点

我们在小学二年级语文课上,学到过这么一篇文章:共享选项 | Vite 官方中文文档 (vitejs.dev)

在文章中明确指出,alias配置项将会被传递到 @rollup/plugin-alias。而这个别名插件是在引入中处理别名的,也就是说:

js 复制代码
// 正常生效
import Logo from '@public/logo.svg'

// !错误。这会向路径 `@public/data.json` 发出请求
fetch('@public/data.json')
html 复制代码
<!-- !错误。这会向路径 `@public/icon.svg` 发出请求 -->
<img src="@public/icon.svg" />

你需要显式的引入这个文件,从而获得处理后的路径。

插件

今天早上日常刷discussion时,发现了这方面的讨论。我没有找到静态资源处理方面的插件,于是顺便就做了一个,开源在github: s3xysteak/vite-plugin-public-transform

这个插件非常简单粗暴:他在编译时,在你的代码中搜索匹配内容(比如 /public/ ),然后替换为正确的字符串。这样一来,你就能直接在任何地方使用静态资源,不需要显式引入,甚至在默认情况下(使用 /public/ 时)不需要配置 tsconfig.json,他用起来像这样:

js 复制代码
// 直接使用静态资源路径!
fetch('/public/data.json')
html 复制代码
<!-- 直接使用静态资源路径! -->
<img src="/public/logo.svg" />

显然这个插件相当简单粗暴,我不喜欢这样的方案,也不认为这样的方案是正确的道路。

但是他真的很方便!

相关推荐
javaDocker1 小时前
电视台自建AI短视频生产线与算力底座:技术架构、关键实现与优化实践
人工智能·架构·音视频
haishikeji696_2 小时前
市域空中智能治理建设:无人机巡检管控平台功能架构与行业落地方案
架构·无人机·低空经济·无人机巡检·无人机管理系统·飞控管理平台
m0_587383002 小时前
点餐预约核销系统的架构脉络
java·架构·系统架构·需求分析
jianqiang.xue2 小时前
审查技能库(上):内存安全四件套
stm32·单片机·物联网·架构·esp32
纪卓志George3 小时前
打破语言范式:在 Go 里用动态代理实现 AOP
架构·go
ZYJCSZKJ3 小时前
基于微服务架构的本地生活POI团购系统设计与高并发实践
微服务·架构·生活
kkai人工智能3 小时前
GPT-6 细节泄露:提示词工程已死,蜂群 Agent 正式接管 AI 架构
人工智能·gpt·架构
漂着的圆木4 小时前
MCP 2026-07-28 长任务改造:别再用 HTTP 超时判断任务失败
分布式·架构·状态模式·ai agent
LorryJovens4 小时前
【LAAP架构与安全伦理】LAAP框架与具身智能大脑:从认知架构到自主意识与人机共生社会--LAAP先导愿景片发布
人工智能·架构·agi
阳明山水5 小时前
销量预测2025—2026:从模型竞赛到系统融合的范式转型
人工智能·深度学习·算法·机器学习·架构