成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

不要再像我這樣使用 React 導入了,試試 Wrapper 模式吧!

開發 前端
在本文中,將向你介紹這個問題,以及如何通過?Wrapper(封裝)模式?創建一種更靈活的方式,成功解決這一問題的。

在之前的實際項目中發現了一種 React.js 中非常低效的導入策略。在本文中,將向你介紹這個問題,以及如何通過 Wrapper(封裝)模式 創建一種更靈活的方式,成功解決這一問題的。

問題所在

在一個項目中,我發現 lodash 和 Framer Motion 這樣的庫被以下方式導入:

import _ from 'lodash'; // 導入了整個 lodash(71.78KB)
import { motion } from 'framer-motion'; // 導入了整個 framer-motion(111.19KB)

這種方式的問題顯而易見:

  • 你直接導入了整個庫,導致包的體積激增。
  • 如果你的項目總體積是 1MB,那么僅這兩個庫就占了約 18%(~180KB)。

?? 更好的解決方案:直接導入特定方法

要降低包體積,應該具體導入所需方法:

// before:
import _ from 'lodash'; // 71.78KB

// after:
import debounce from 'lodash/debounce'; // 僅 3.41KB
import merge from 'lodash/merge';       // 僅 16KB

但,這樣就夠了嗎?

盡管這種導入方式節省了空間,但在實際開發中可能面臨以下問題:

  1. 重構成本:如果 lodash 被十幾個文件引用,你就需要修改每個文件中的導入語句,這不僅麻煩而且容易出錯。
  2. 容易漏掉修改:容易遺漏某些文件,導致代碼不一致或產生難以排查的問題。
  3. 合并沖突麻煩:當多個分支都修改了相同的導入方式,合并時可能出現繁瑣的沖突。

更靈活的方式:Wrapper 模式(封裝模式)

為了解決這些問題,可以使用一個簡單的封裝文件(Wrapper):

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 本身并不能減少包的體積(需要具體導入才能減少體積),但能提高代碼的維護性和靈活性。

可視化結果(使用 vite-bundle-visualizer 生成)

圖片圖片

優化后的導入方式:

  • 原本大小:71.78KB
  • 優化后:僅導入 debounce 為 3.41KB(gzip 壓縮后只有 1.2KB)

?? 為什么總是建議使用 Wrapper?

使用 Wrapper 的優點顯而易見:

  • 開發者更容易管理導入:所有人使用預定義的優化方式導入庫。
  • 避免冗余導入:統一管理導入方式,避免重復導入相同內容。
  • 維護簡單:如果某個庫的導入方式改變,只需要修改封裝文件即可。

但也有一些缺點:

  • 增加了抽象層:可能會略微增加代碼復雜性。
  • 增加了文件數量:封裝多個庫可能導致項目中出現大量額外的封裝文件。

如何選擇合適的庫?

在選擇第三方庫時,也需要注意它們是否支持單獨導入:

  • 比如 Recharts,目前不支持單獨導入,會導入整個庫。
import { BarChart } from 'recharts'; // 導入整個庫
  • 而 Nivo 則支持樹搖(tree-shake)導入,可以只導入特定圖表組件。
import { ResponsiveBar } from '@nivo/bar'; // 只導入特定組件

這種差別,會極大影響應用的性能表現與最終打包體積。

如何快速查看導入大小?

推薦在 VS Code 中使用 Import Cost 插件,可以直觀看到每個導入語句帶來的體積增加。

優化后的 vite 配置文件

分享我的 vite.config.ts,內置了壓縮、手動分塊(manual chunk splitting)、路徑別名(alias)等優化方式:

// 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)

  • 不要直接導入整個庫,使用具體方法導入減小體積。
  • 使用 Wrapper 封裝庫,可以提高代碼維護性、降低修改成本。
  • 選擇支持具體導入(樹搖優化)的庫,確保應用性能。
  • 使用 VS Code 插件監控導入體積,及時優化。

責任編輯:武曉燕 來源: 大遷世界
相關推薦

2017-12-18 09:56:38

DIY電腦DIY玩家

2024-12-30 08:22:35

2023-08-31 09:10:18

JavaScript調試

2024-01-23 13:20:00

分庫分表分布式

2022-03-28 08:21:49

適配器模式項目升級接口

2020-11-10 07:08:08

API程序外接口

2022-02-28 10:30:03

架構代碼Native

2020-04-03 14:25:55

diff Meld工具

2024-06-19 10:01:50

2023-12-12 07:18:47

Linux系統虛擬化

2021-03-12 18:25:09

開發前端React

2023-04-27 13:25:22

索引合并MySQL

2018-10-17 11:20:55

SQL數據庫程序員

2021-07-28 06:51:08

Nacos代理模式

2021-03-05 22:57:25

遞歸閉包 Python

2024-03-11 08:21:49

2022-06-17 11:10:43

PandasPolarsPython

2020-12-02 08:31:47

Elasticsear

2022-06-05 21:27:40

Reacteffect

2022-06-15 22:33:07

React逃生艙
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久在线观看 | 99综合网 | 欧美性网 | 日韩有码一区 | 成在线人视频免费视频 | 天天曰夜夜操 | 网络毛片 | 中文字幕在线一区二区三区 | 日本小电影在线 | 欧美日韩国产一区二区三区不卡 | 91视频18 | 国产一区999 | 日韩久久精品电影 | 一级黄色夫妻生活 | 亚洲一区二区在线视频 | av片在线观看 | m豆传媒在线链接观看 | 国产98色在线 | 日韩 | 四虎影音| 欧美aaaa视频| 国产男女视频网站 | 日韩精彩视频 | 国产美女网站 | 亚洲国产aⅴ成人精品无吗 综合国产在线 | 美女黄色在线观看 | 国产成人jvid在线播放 | 欧美老少妇一级特黄一片 | 一级大片 | 亚洲色图图片 | 色综合天天天天做夜夜夜夜做 | 9999国产精品欧美久久久久久 | 黄色日本片 | 国产精品av久久久久久毛片 | 日韩有码在线播放 | 日韩精品在线观看一区二区 | 美女国内精品自产拍在线播放 | 久久高清 | 一区二区三区四区电影视频在线观看 | 国产精品久久久久无码av | 人人叉| 欧美日韩久久 |