You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vite开发服务器无法处理含#的公共资源文件名,求解决方案

Vite + React + TypeScript项目中含#字符的资源加载问题解决

问题背景

我的ViteJS+React+TypeScript项目里有一批文件名带#字符的资源(例如images/foo#2.png),开发服务器解析这类路径时出现异常:即便用encodeURIComponent()将#转成%23,资源依然无法正常加载。

重命名文件是最直接的解决方案,但这些文件来自作为子模块引入的第三方仓库,我无法直接修改;若要处理需fork仓库并添加构建脚本批量重命名,这种方案并不理想,因此想通过中间件等方式解决。

复现示例

示例代码

// main.js
document.querySelector('#app').innerHTML = `
  <div>
    <ul>
      vite.svg: <img src="vite.svg" /><br/>
      vite#2.svg 未编码: <img src="vite#2.svg" /><br/>
      vite#2.svg 编码后: <img src="${encodeURIComponent(
        'vite#2.svg'
      )}" />
    </ul>
  </div>
`;

文件夹结构

文件夹结构

运行结果

运行结果

解决方案

  • 配置Vite服务器中间件修正请求路径
    在vite.config.ts中添加自定义中间件,将请求URL中的%23(#的编码值)替换为实际的#字符,让服务器能正确匹配到对应的文件:

    import { defineConfig } from 'vite';
    import react from '@vitejs/plugin-react';
    
    export default defineConfig({
      plugins: [react()],
      server: {
        async configureServer(server) {
          server.middlewares.use((req, res, next) => {
            // 替换请求URL中的%23为#
            if (req.url?.includes('%23')) {
              req.url = req.url.replace(/%23/g, '#');
            }
            next();
          });
        },
      },
    });
    
  • 前端正确编码资源路径
    注意不要用encodeURIComponent()编码整个路径(会把/也转成%2F导致路径错误),只需单独编码文件名中的#字符:

    // 正确写法:仅编码文件名中的#
    const fileName = 'vite#2.svg';
    const encodedFileName = fileName.replace(/#/g, '%23');
    const imgSrc = `/${encodedFileName}`;
    

这样前端发送的请求路径为/vite%232.svg,经过中间件处理后,服务器会以/vite#2.svg去查找文件,就能正常加载资源了。


内容的提问来源于stack exchange,提问作者Hissvard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 23:53:14