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

如何在Vite/Rollup中修改资源构建路径保留原有目录结构?

为什么修改assetFileNames不生效

assetFileNames仅控制图片、字体、提取出的CSS等非JS静态资源的输出路径。JS产物分为入口脚本、共享分包两类,分别由entryFileNames、chunkFileNames两个独立配置项控制输出规则,和assetFileNames同属Rollup output的平级配置,改静态资源规则自然不会影响JS输出路径。

另外要保留原始目录结构,不能使用Vite默认的单页入口配置,必须先明确声明所有HTML入口,Rollup才能识别原始文件的层级关系。


完整可落地配置

// vite.config.js
import { defineConfig } from 'vite'
import path from 'node:path'

export default defineConfig({
  build: {
    outDir: 'dist',
    rollupOptions: {
      // 多页入口配置:key直接写「期望输出的相对路径/入口名」,会直接作为[name]变量供后续命名规则使用
      input: {
        'parent/parent': path.resolve(__dirname, 'parent/parent.html'),
        'parent/child/child': path.resolve(__dirname, 'parent/child/child.html')
      },
      output: {
        // 入口JS直接复用入口配置的路径,不需要额外拼接
        entryFileNames: '[name].js',
        // 共享分包/动态导入的JS统一放shared目录,避免和业务文件路径冲突
        chunkFileNames: 'shared/[name]-[hash].js',
        // 静态资源统一放根目录assets,如需跟随页面路径可改为对应动态规则
        assetFileNames: 'assets/[name]-[hash][extname]'
      }
    }
  }
})

特殊场景适配

如果项目存在大量动态导入的业务JS,需要动态保留原始目录层级,可以把chunkFileNames改为函数形式做路径解析:

chunkFileNames: (chunk) => {
  // 第三方依赖统一输出到vendor目录
  if (chunk.facadeModuleId?.includes('node_modules')) {
    return 'vendor/[name]-[hash].js'
  }
  // 提取业务文件在parent目录下的相对路径,保留原有层级
  const relativePath = chunk.facadeModuleId.split('parent/')[1]
  return relativePath.replace(/\.js$/, '-[hash].js')
}

配置完成后执行构建,HTML文件会自动跟随入口配置的路径输出,最终dist目录结构完全匹配预期:

dist
|-parent
|--parent.html
|--parent.js
|--child
|---child.html
|---child.js
|-assets
|-shared
|-vendor

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 00:33:20