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

如何将所有Vite入口文件统一存放至非根目录?

问题描述

当前项目结构:

│   vite.config.ts
│   index.html
│
└───admin
│   │ index.html
│
└───info
    │ index.html

对应的Vite配置:

build: {
    target: "esnext",
    rollupOptions: {
        input: {
            main: resolve(__dirname, "index.html"),
            admin: resolve(__dirname, "admin/index.html"),
            info: resolve(__dirname, "info/index.html")
        }
    }
}

想要把所有入口文件统一放到entry文件夹,期望结构:

│ vite.config.ts
│
└───entry
      │   index.html
      └───info
      │   │ index.html
      └───admin
          │ index.html

修改后的Vite配置如下,但访问admin或info入口时,总是被重定向到主index.html:

build: {
    target: "esnext",
    rollupOptions: {
        input: {
            main: resolve(__dirname, "entry/index.html"),
            admin: resolve(__dirname, "entry/admin/index.html"),
            info: resolve(__dirname, "entry/info/index.html")
        }
    }
}

需要解决这个重定向问题,实现入口统一存放的需求。

解决办法

1. 修复开发环境的重定向问题

Vite开发服务器默认以项目根目录为静态资源根目录,访问/admin时,它会优先查找根目录下的admin文件夹,找不到就自动 fallback 到主入口。你可以通过配置服务器重写规则解决:

修改vite.config.ts,添加服务器配置:

import { defineConfig, resolve } from 'vite';

export default defineConfig({
  server: {
    fs: {
      strict: false, // 关闭严格模式,避免路径解析限制
    },
    // 重写路径,让访问/admin指向entry下的admin入口
    rewrite: {
      '^/admin': '/entry/admin/index.html',
      '^/info': '/entry/info/index.html',
    },
  },
  build: {
    target: "esnext",
    rollupOptions: {
      input: {
          main: resolve(__dirname, "entry/index.html"),
          admin: resolve(__dirname, "entry/admin/index.html"),
          info: resolve(__dirname, "entry/info/index.html")
      }
    }
  }
});

2. 生产构建后的部署配置

构建完成后,dist目录里会生成index.html、admin.html、info.html三个入口文件。部署时需要给服务器添加路由规则,确保访问对应路径能指向正确的HTML:

以Nginx为例,配置示例:

server {
  listen 80;
  server_name your-domain.com;
  root /path/to/your/dist;

  # 主入口路由
  location / {
    try_files $uri $uri/ /index.html;
  }

  # admin入口路由
  location /admin {
    try_files $uri $uri/ /admin.html;
  }

  # info入口路由
  location /info {
    try_files $uri $uri/ /info.html;
  }
}

3. 更友好的构建结构(可选)

如果想让构建后的目录结构更贴合路由习惯,可以修改rollup的输出配置,让每个入口的HTML文件放在对应子目录下:

rollupOptions: {
  input: {
      main: resolve(__dirname, "entry/index.html"),
      admin: resolve(__dirname, "entry/admin/index.html"),
      info: resolve(__dirname, "entry/info/index.html")
  },
  output: {
    // 把每个入口的资源放到对应子目录的assets文件夹中
    entryFileNames: '[name]/assets/[name]-[hash].js',
    chunkFileNames: '[name]/assets/[name]-[hash].js',
    assetFileNames: '[name]/assets/[name]-[hash].[ext]',
  }
}

构建后的dist结构会变成这样:

├───dist
│   │ index.html
│   └───admin
│   │   │ index.html
│   │   └───assets
│   └───info
│       │ index.html
│       └───assets

这种结构部署时,服务器只需要配置每个子目录的fallback到自身的index.html即可,逻辑更清晰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 16:20:56