当前位置: 首页 > news >正文

WHAT - 组件库单入口打包和多入口打包

文章目录

  • 一、什么是单入口与多入口打包?
    • 单入口打包(Single Entry Build)
    • 多入口打包(Multi Entry Build)
  • 二、两种方式对比
  • 三、构建方式实践(以 Vite + Rollup 为例)
    • 单入口打包实践
      • 项目结构
      • index.ts 示例
      • vite.config.ts 配置
    • 多入口打包实践
      • 项目结构
      • 每个组件都有一个独立入口
      • vite.config.ts 配置
  • 四、额外建议
    • 类型声明
    • 混合模式
  • 五、NPM 发布结构建议
  • 总结推荐

在手写组件库时,选择“单入口打包”还是“多入口打包”是一个非常重要的架构和构建决策。

下面我将从概念、优缺点、适用场景、构建方式(以 Vite/Rollup 为主)、实践建议等方面为你全面展开介绍。


一、什么是单入口与多入口打包?

单入口打包(Single Entry Build)

  • 所有组件通过一个统一入口(如 index.ts)导出并打包为一个文件(或多个格式,如 ESM/CJS)。

  • 使用方式:

    import { Button, Modal } from 'my-ui-lib';
    

多入口打包(Multi Entry Build)

  • 每个组件都有独立的入口文件(如 button/index.ts),可以单独按需打包。

  • 使用方式:

    import Button from 'my-ui-lib/button';
    import Modal from 'my-ui-lib/modal';
    

二、两种方式对比

项目单入口多入口
打包产物体积大,包含所有组件小,可按需引入
Tree-shaking支持,但依赖使用者工具配置更加彻底地按需引入
用户使用体验更简单,一次性引入更灵活,适合大型项目
维护成本低,只有一个入口文件高,每个组件需独立配置入口和构建
编译速度慢(构建多个入口)
推荐场景小型组件库中大型组件库,强调性能

三、构建方式实践(以 Vite + Rollup 为例)

单入口打包实践

项目结构

src/
├── components/
│   ├── Button.tsx
│   └── Modal.tsx
├── index.ts

index.ts 示例

export { default as Button } from './components/Button';
export { default as Modal } from './components/Modal';

vite.config.ts 配置

import { defineConfig } from 'vite';
import dts from 'vite-plugin-dts';export default defineConfig({build: {lib: {entry: './src/index.ts',name: 'MyUILib',fileName: 'my-ui-lib',},rollupOptions: {external: ['react', 'react-dom'],output: {globals: {react: 'React','react-dom': 'ReactDOM',},},},},plugins: [dts()],
});

多入口打包实践

项目结构

src/
├── button/
│   ├── index.ts
│   └── Button.tsx
├── modal/
│   ├── index.ts
│   └── Modal.tsx

每个组件都有一个独立入口

src/button/index.ts

export { default } from './Button';

vite.config.ts 配置

import { defineConfig } from 'vite';
import dts from 'vite-plugin-dts';
import path from 'path';
import fs from 'fs';// 自动扫描所有组件目录
const entryPoints = fs.readdirSync(path.resolve(__dirname, 'src')).reduce((acc, dir) => {const fullDir = path.resolve(__dirname, 'src', dir);const entryFile = path.resolve(fullDir, 'index.ts');if (fs.existsSync(entryFile)) {acc[dir] = entryFile;}return acc;
}, {} as Record<string, string>);export default defineConfig({build: {lib: {entry: entryPoints,formats: ['es'],},rollupOptions: {external: ['react', 'react-dom'],output: {entryFileNames: '[name]/index.js',preserveModules: true,preserveModulesRoot: 'src',},},},plugins: [dts({entryRoot: 'src',outputDir: 'dist',})],
});

四、额外建议

类型声明

配合 vite-plugin-dts 插件或使用 tsc --emitDeclarationOnly 输出 .d.ts 类型文件。

混合模式

你也可以支持单入口 + 多入口共存:

// 用户既可以用:
import { Button } from 'my-ui-lib';// 也可以用:
import Button from 'my-ui-lib/button';

通过构建两个打包产物:一个 index.ts 打全库,一个多入口输出每个子模块。


五、NPM 发布结构建议

my-ui-lib/
├── package.json
├── index.js             # 单入口构建产物
├── button/
│   ├── index.js         # 多入口
│   └── index.d.ts
├── modal/
│   └── ...

总结推荐

目标推荐方式
简单快速上线 MVP单入口打包
注重组件体积、性能多入口或混合模式
提供全量和按需引入能力混合单入口 + 多入口
http://www.xdnf.cn/news/962209.html

相关文章:

  • “液态玻璃”难解苹果AI焦虑:WWDC25背后的信任危机
  • 自动化三维扫描检测赋能汽车铸造件高效检测
  • 笔记 操作系统复习
  • 供应链管理-物流:自动驾驶分为几个级别/L0无自动化/L1驾驶辅助/L2部分自动化/L3有条件自动化/L4高度自动化/L5完全自动化
  • 云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
  • SDC命令详解:使用uniquify命令进行唯一化
  • 菲尔斯特传感器,超声波风速风向传感器助力绿色能源发展
  • idea中黄色感叹号打开
  • RPC调用三 使用代理进行服务自动注册
  • CppCon 2015 学习:RapidCheck Property based testing for C++
  • 计算机基础(一):ASCll、GB2312、GBK、Unicode、UTF-32、UTF-16、UTF-8深度解析
  • 记录chrome浏览器的一个bug
  • 零基础入门 线性代数
  • 上位机开发过程中的设计模式体会(2):观察者模式和Qt信号槽机制
  • 经典的多位gpio初始化操作
  • 基于FPGA的PID算法学习———实现PI比例控制算法
  • React Native 基础语法与核心组件:深入指南
  • 篇章三 论坛系统——环境搭建
  • 如何将数据从 iPhone 传输到笔记本电脑
  • ACM70V-701-2PL-TL00
  • CPP基础(2)
  • Linux 删除登录痕迹
  • rapidocr v3.1.0发布
  • 什么样的登录方式才是最安全的?
  • 高频交易技术:订单簿分析与低延迟架构——从Level 2数据挖掘到FPGA硬件加速的全链路解决方案
  • Numpy7——数学2(矩阵基础,线性方程基础)
  • 看板会议如何高效进行
  • 设计模式和设计原则回顾
  • React动态渲染:如何用map循环渲染一个列表(List)
  • VsCode 离线插件下载