闽公网安备 35020302035485号
import _ from 'lodash'; // 导入了整个 lodash(71.78KB)
import { motion } from 'framer-motion'; // 导入了整个 framer-motion(111.19KB)
这种方式的问题显而易见:2.如果你的项目总体积是 1MB,那么仅这两个库就占了约 18%(~180KB)。
// before: import _ from 'lodash'; // 71.78KB // 堆代码 duidaima.com // after: import debounce from 'lodash/debounce'; // 仅 3.41KB import merge from 'lodash/merge'; // 仅 16KB但,这样就够了吗?尽管这种导入方式节省了空间,但在实际开发中可能面临以下问题:
合并冲突麻烦:当多个分支都修改了相同的导入方式,合并时可能出现繁琐的冲突。
LodashWrapper.tsx:
import debounce from 'lodash/debounce';
const lodashWrapper = {
debounce,
};
export default lodashWrapper;
使用时直接导入封装文件:import lodashWrapper from './lodashWrapper';
const SearchInput = () => {
const [query, setQuery] = useState('');
const handleSearch = useCallback(
lodashWrapper.debounce((searchTerm) => {
console.log('Searching for:', searchTerm);
}, 500),
[]
);
return <input onChange={(e) => setQuery(e.target.value)} />;
};
注意:Wrapper 本身并不能减少包的体积(需要具体导入才能减少体积),但能提高代码的维护性和灵活性。
优化后:仅导入 debounce 为 3.41KB(gzip 压缩后只有 1.2KB)
3.维护简单:如果某个库的导入方式改变,只需要修改封装文件即可。
但也有一些缺点:2.增加了文件数量:封装多个库可能导致项目中出现大量额外的封装文件。
import { BarChart } from 'recharts'; // 导入整个库
而 Nivo 则支持树摇(tree-shake)导入,可以只导入特定图表组件。import { ResponsiveBar } from '@nivo/bar'; // 只导入特定组件
这种差别,会极大影响应用的性能表现与最终打包体积。// vite.config.ts 示例
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import path from 'path';
export default defineConfig({
plugins: [react()],
build: {
rollupOptions: {
output: {
manualChunks(id) {
if (id.includes('node_modules')) {
if (id.includes('lodash')) return 'lodash';
if (id.includes('framer-motion')) return 'framer-motion';
return 'vendor';
}
},
},
},
},
resolve: {
alias: {
'@': path.resolve(__dirname, './src'),
components: path.resolve(__dirname, './src/components'),
},
},
});
总结(Key Takeaways)