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 下来吧。溜达了一圈,似乎也没有什么清晰的方式可以做到多输出,遂作罢。

相关推荐
夕夕木各1 天前
从第一个 PR 到 Vite 官方中文文档维护者
github·vite
布兰妮甜2 天前
从 0 搭建企业级 Vue3/Vite 脚手架(规范、eslint、husky、打包、环境变量全流程)
typescript·vue3·vite·脚手架·前端工程化
HexCIer4 天前
面向未来的原子化 CSS:UnoCSS 核心架构分析与 Tailwind CSS 现状
前端·css·vite
触底反弹6 天前
🔥 保姆级教程|SSE + BFF + 跨域三件套,从零实现 ChatGPT 流式输出(附完整代码)
人工智能·node.js·vite
先吃饱再说6 天前
LLM 流式输出的“中间商”方案:BFF 层到底在做什么?
llm·vite
小林ixn7 天前
从BFF到SSE:我在Vue项目里藏了个“AI翻译官”
前端·vue.js·vite
还是大剑师兰特11 天前
Vite6 + Vue3 + TS 完整版标准配置模板
vite·大剑师·vite6配置
Linsk12 天前
前端开发:如何优雅引入polyfill
webpack·vite·rollup.js
荒诞英雄15 天前
从 17MB Vendor 大包到按需加载:Vite 多入口 Vue 组件库首屏优化实践
vue.js·vite
程序员晓琪16 天前
深入解析:从 Webpack 到 Vite,多入口多端项目的工程化迁移实战
前端·webpack·vite