Vite Rollup 打包多页应用

版本信息

JSON 复制代码
"vite": "^4.3.0"

要解决一个什么问题

公司的一个 React 多页项目,所有页面都放在项目 src/pages 目录下,像这样:

然后 vite.config.js 里头入口是这么配置的:

ts 复制代码
rollupOptions: {
  input: {
    exam: resolve(__dirname, 'src/pages/hhh/exam.html'),
    test: resolve(__dirname, 'src/pages/test.html'),
  }
}

这似乎非常合理,但是后面每当开发一个新页面的时候,你就得往 input 里面加一条,不管是看起来还是写起来都多少有点睿智。那既然所有页面都放在 pages 目录下,能不能改一下自动读取 pages 目录下的文件,然后打包,做到自动的多输入多输出?

解决的办法

Vite 本身基于 node 环境,完全可以利用 node 去访问指定目录,通过递归获取 Rollup 的 input 对象。

ts 复制代码
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import { join } from 'path';
import fs from 'fs'

const calcInputObject = () => {
  const inputObject = {};
  // 递归遍历文件夹
  const recursiveFunc = (dir: string) => {
    fs.readdirSync(dir)
       .forEach((fileName: string) => {
          const fullpath = join(dir, fileName);
          const stats = fs.statSync(fullpath);
          if (stats.isDirectory()) {
            // 是文件夹接着归
            recursiveFunc(fullpath);
          } else {
            inputObject[fileName.split('.')[0]] = fullpath
          }
     })
  }
  const sourcePath = join(__dirname, 'pages');
  recursiveFunc(sourcePath);
  return inputObject
}

export default defineConfig(() => {
  return {
    plugins: [react()],
    build: {
      rollupOptions: {
        input: calcInputObject();
      },
    },
  }
})

打包出来的结果:

后续还可以基于此增加 exclude 功能,排除目录中不需要的内容。

弯弯绕绕

在翻阅 Rollup 资料的时候,有好心人提到可以用 Rollup 的 multi-entry 插件来实现。但是正如人家 Readme 中写的一样

A Rollup plugin which allows use of multiple entry points for a bundle.

他的确可以读取指定目录下的文件,但是只输出一个 JS bundle ,我们总不能让用户访问一个页面的时候就让他把整个项目都给 down 下来吧。溜达了一圈,似乎也没有什么清晰的方式可以做到多输出,遂作罢。

相关推荐
cindershade2 天前
大包不是一个数字:Vite 构建体积的责任归因与边界治理
vite
cindershade9 天前
首屏不是 dist:用“加载账本”治理 Vite 的大包
性能优化·vite
陪我一起学编程11 天前
vue3笔记
前端·webpack·vue3·vite·脚手架·vue3笔记·组件式
向北丶25 天前
vite项目中配置alias别名
前端·vite
PedroQue991 个月前
修复 .uvue 页面路径残留问题
前端·vite
梦曦i1 个月前
修复 .uvue 页面路径残留问题
前端·vite
cindershade1 个月前
首屏在替谁付费:重做 Vite 产物治理的责任边界
vite
做前端的娜娜子1 个月前
施工蓝图:vite.config.js —— 项目的指挥中心
前端·react native·vite
D_jing201 个月前
【踩坑解决】pnpm+Vite引入@koi/core报错spark-md5找不到模块(幽灵依赖深度解析)
pnpm·vite·幽灵依赖·前端踩坑
Flynt1 个月前
pnpm 12 换上了 Rust 内核,我拿项目实测了一轮构建速度
rust·vite·前端工程化