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

如何配置Vite + React多入口构建,使JS文件与对应HTML同目录?

问题描述

我正在使用Vite搭配React进行多入口多输出构建,但需要将每个JS构建文件放在引用它的HTML文件所在的同一目录中——因为我使用的开发框架禁止访问/graphics或/dashboard以外的文件夹。

目前JS文件会生成在独立的/assets文件夹中。

当前vite.config.js配置

import { defineConfig, resolve } from 'vite';
import react from '@vitejs/plugin-react';

export default defineConfig({
  root: 'src',
  plugins: [
    react(),
  ],
  build: {
    rollupOptions: {
      input: {
        dashboard: resolve(__dirname, 'src/dashboard/index.html'),
        graphics: resolve(__dirname, 'src/graphics/index.html'),
      },
      output: {
        dashboard: resolve(__dirname, 'dashboard/index.html'),
        graphics: resolve(__dirname, 'graphics/index.html') 
      }
    },
  },
})

当前构建后目录结构

├── dashboard
│   └── index.html
│
├── graphics
│   └── index.html
└── assets
    ├── graphicsfile.js
    └── dashboardfile.js

期望的构建后目录结构

├── dashboard
│   ├── index.html
│   └── dashboardfile.js
│
└── graphics
    ├── index.html
    └── graphicsfile.js    

请问是否有办法实现这样的构建配置?


解决方案

可以通过调整Vite的Rollup输出配置实现需求,以下是修改后的vite.config.js:

import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import { resolve } from 'path';

export default defineConfig({
  root: 'src',
  base: './', // 配置相对路径引用资源
  plugins: [react()],
  build: {
    outDir: '../', // 将构建产物输出到项目根目录(对应root为src的上级目录)
    assetsDir: '', // 取消默认的assets文件夹
    rollupOptions: {
      input: {
        dashboard: resolve(__dirname, 'src/dashboard/index.html'),
        graphics: resolve(__dirname, 'src/graphics/index.html'),
      },
      output: {
        // 指定入口JS文件的输出路径:[name]对应入口名称(dashboard/graphics)
        entryFileNames: '[name]/[name].js',
        // 禁用代码分割,确保每个入口只生成单独的JS文件(按需启用)
        manualChunks: undefined,
      },
    },
  },
});

关键配置说明

  • base: './':让HTML中的资源引用使用相对路径,确保能正确加载同一目录下的JS文件。
  • build.outDir: '../':因为root设为src,所以将输出目录指定为上级目录,直接把产物放到项目根目录的dashboard和graphics文件夹下。
  • build.assetsDir: '':取消默认的assets文件夹,避免资源被统一放到该目录。
  • entryFileNames: '[name]/[name].js':利用Rollup的占位符[name]匹配入口名称,将每个入口的JS文件输出到对应名称的目录下,和HTML文件同目录。
  • manualChunks: undefined:禁用自动代码分割,防止生成额外的公共chunk文件;如果需要提取公共模块,可以自定义manualChunks规则。

补充说明

如果项目中还有图片、CSS等其他静态资源,可添加assetFileNames配置来统一放到对应目录:

output: {
  entryFileNames: '[name]/[name].js',
  assetFileNames: '[name]/[name].[ext]', // 其他资源也输出到对应入口目录
  manualChunks: undefined,
},

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:13:21