[ PROMPT_NODE_25190 ]
bundle-barrel-imports
[ SKILL_DOCUMENTATION ]
## 避免 Barrel 文件导入
直接从源文件导入,而不是从 Barrel 文件导入,以避免加载数千个未使用的模块。**Barrel 文件**是重新导出多个模块的入口点(例如 `index.js` 中执行 `export * from './module'`)。
流行的图标和组件库在入口文件中可能包含**多达 10,000 个重新导出**。对于许多 React 包,**仅导入它们就需要 200-800ms**,这会影响开发速度和生产环境的冷启动。
**为什么 Tree-shaking 无效:** 当库被标记为外部(不打包)时,打包工具无法对其进行优化。如果你为了启用 Tree-shaking 而对其进行打包,构建速度会因为分析整个模块图而变得非常缓慢。
**错误做法(导入整个库):**
tsx
import { Check, X, Menu } from 'lucide-react'
// 加载 1,583 个模块,开发环境额外耗时约 2.8s
// 运行时成本:每次冷启动 200-800ms
import { Button, TextField } from '@mui/material'
// 加载 2,225 个模块,开发环境额外耗时约 4.2s
**正确做法(仅导入你需要的内容):**
tsx
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'
// 仅加载 3 个模块(约 2KB vs 约 1MB)
import Button from '@mui/material/Button'
import TextField from '@mui/material/TextField'
// 仅加载你使用的内容
**替代方案(Next.js 13.5+):**
js
// next.config.js - 使用 optimizePackageImports
module.exports = {
experimental: {
optimizePackageImports: ['lucide-react', '@mui/material']
}
}
// 然后你可以保留符合人体工程学的 Barrel 导入:
import { Check, X, Menu } from 'lucide-react'
// 在构建时自动转换为直接导入
直接导入可使开发启动速度提高 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`。
参考:[我们如何在 Next.js 中优化包导入](https://vercel.com/blog/how-we-optimized-package-imports-in-next-js)