关于 bundle-barrel-imports
面向 JavaScript 和 React 开发者的编码技能,介绍如何通过直接导入模块和 Next.js 包导入优化,减少 barrel 文件带来的额外加载。
主要功能
- 01说明 barrel 文件的导入开销
- 02建议直接导入模块
- 03介绍 Next.js 包导入优化
- 04列出常见受影响的库
适用场景
- 01加快开发启动速度
- 02减少冷启动导入开销
- 03为组件库选择导入方式
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ theorcdev/ 8bitcn-ui --skill bundle-barrel-imports安装后在 Claude Code 中输入/bundle-barrel-imports确认已加载。
详细介绍
避免从 Barrel 文件导入
直接从源文件导入,而不是从 Barrel 文件导入,以避免加载数千个未使用的模块。Barrel 文件是用于重新导出多个模块的入口点(例如,执行 export * from './module' 的 index.js)。
热门图标和组件库的入口文件中可能有多达 10,000 个重新导出项。对于许多 React 包,仅导入它们就需要 200-800ms,影响开发速度和生产环境的冷启动。
为什么 Tree-shaking 无济于事: 当库被标记为外部依赖(不打包)时,打包工具无法对其进行优化。如果将其打包以启用 Tree-shaking,构建速度就会大幅下降,因为需要分析整个模块依赖图。
错误(导入整个库):
import { Check, X, Menu } from 'lucide-react'
// Loads 1,583 modules, takes ~2.8s extra in dev
// Runtime cost: 200-800ms on every cold start
import { Button, TextField } from '@mui/material'
// Loads 2,225 modules, takes ~4.2s extra in dev
正确(仅导入所需内容):
import Check from 'lucide-react/dist/esm/icons/check'
import X from 'lucide-react/dist/esm/icons/x'
import Menu from 'lucide-react/dist/esm/icons/menu'
// Loads only 3 modules (~2KB vs ~1MB)
import Button from '@mui/material/Button'
import TextField from '@mui/material/TextField'
// Loads only what you use
替代方案(Next.js 13.5+):
// next.config.js - use optimizePackageImports
module.exports = {
experimental: {
optimizePackageImports: ['lucide-react', '@mui/material']
}
}
// Then you can keep the ergonomic barrel imports:
import { Check, X, Menu } from 'lucide-react'
// Automatically transformed to direct imports at build time
直接导入可使开发启动速度提高 15-70%、构建速度提高 28%、冷启动速度提高 40%,并显著加快 HMR。
常受影响的库:lucide-react、@mui/material、@mui/icons-material、@tabler/icons-react、react-icons、@headlessui/react、@radix-ui/react-*、lodash、ramda、date-fns、rxjs、react-use。
评论
支持 Markdown