成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

代碼拆分

warkiz / 3066人閱讀

摘要:原文來自我的代碼拆分與動態(tài)導(dǎo)入當(dāng)項目越做越大時,體積過大導(dǎo)致加載速度過慢,性能問題直接影響用戶體驗。這時我們會考慮將代碼拆分。

原文來自我的github: https://github.com/Vibing/blog

代碼拆分與動態(tài)導(dǎo)入

當(dāng)項目越做越大時,體積過大導(dǎo)致加載速度過慢,性能問題直接影響用戶體驗。

這時我們會考慮將代碼拆分。

拆分,顧名思義就是將一個大的東西拆分成N個小的東西,用公式表示就是:Sum = n * Sub

代碼拆分基于動態(tài)導(dǎo)入

什么是動態(tài)導(dǎo)入?就是我需要什么,你給我什么,我不需要的時候,你別給我,我嫌重。

動態(tài)導(dǎo)入可以將模塊分離成一個多帶帶的文件 在需要的時候加載進來。

對于動態(tài)導(dǎo)入,webpack 提供了兩個類似的技術(shù)。

第一種,也是優(yōu)先選擇的方式是,使用符合 ECMAScript 提案 的 import() 語法。

第二種,則是使用 webpack 特定的 require.ensure。

從webpack 2以后,一般使用第一種。

async-loadable

由于import()方法返回的是Promise對象,我們?yōu)榱四芊奖愕姆祷亟M件,
這里推薦使用async-loadable插件

例子代碼:

import loadable from "async-loadable";
import Loading from "./my-loading-component";

const LoadableComponent = loadable({
  loader: () => import("./my-component"),
  loading: status => ,
});

export default class App extends React.Component {
  render() {
    return ;
  }
}

代碼里有熟悉的 import() 方法。async-loadable 使用 webpack 的動態(tài)導(dǎo)入,調(diào)用loadable方法可以方便的返回要使用的組件。

下面我將以我本人的項目經(jīng)歷,來講解代碼拆分(code splitting)

代碼拆分前

當(dāng)初還是小白的我,一開始哪知道有代碼拆分這個技術(shù)啊,就一個人負責(zé)一個小項目,一開始項目不大,跑起來也是嗖嗖的,這里先貼一下路由代碼:

import Home from "./home";
import Page1 from "./page1";
import Page2 from "./page2";



這里沒有使用動態(tài)導(dǎo)入,而是直接將所有頁面靜態(tài)引入進來,然后賦到對應(yīng)路由上。
這么做的壞處就是:打包時,整個項目所有的頁面都會打包到一個文件中,隨著頁面增多,這個文件也越來越大,最后我看了一下,達到了近25M(我嚇得打開度娘...)。

如果用一張圖來表示的話,這張圖在適合不過了:

哈哈,整個一坨有沒有。所有路由在這一坨紅色里,看著真特么憋屈啊

基于路由的代碼拆分

打開度娘的我臉色漸漸有了好轉(zhuǎn),通過搜索,看到了webpack有個code splitting功能(代碼拆分),
前面說過,代碼拆分其實就是使用動態(tài)導(dǎo)入的技術(shù)實現(xiàn)的,那么我們就使用動態(tài)導(dǎo)入來優(yōu)化一把之前的路由:

import Loadable from "async-loadable";
import Loading from "./my-loading-component";

const Home = Loadable({
    loader: () => import(`./home`),
    loading: Loading
  });

const Page1 = Loadable({
    loader: () => import(`./page1`),
    loading: Loading
  });

const Paeg2 = Loadable({
    loader: () => import(`./page2`),
    loading: Loading
  });

} />
 } />
 } />

我們不再使用 import module from "url" 來靜態(tài)引入模塊,而是使用 loadComponent 來動態(tài)導(dǎo)入,它返回的是Loadable的結(jié)果,也就是我們想要的組件,我們把再把組件給對應(yīng)的路由,這就完成了基于路由的代碼拆分。

使用以后,鄙人懷著激動的心情開始打包項目,當(dāng)我看到控制臺的打包日志時,我的表情是這樣的:

咳咳,這種好事情當(dāng)然要分享一下啦,你要的結(jié)果:

可以看到,webpack打包時已經(jīng)將之前的一個臃腫文件按路由拆分成了三個文件,當(dāng)我們點擊一個路由時,會動態(tài)加載對應(yīng)的文件。

比如我點擊home頁面的路由時:

我再點擊page1時:

嗯,是按照路由來拆分的代碼,完美~

這樣看來,我們需要將之前的那張圖改成這樣的:

看著項目加載速度變快了,心里真特么高興

基于模塊拆分

其實基于路由的代碼拆分已經(jīng)可以滿足絕大多數(shù)項目了,再大的項目也能滿足。

但隨著項目做的多了,慢慢的發(fā)現(xiàn)了一個問題:代碼浪費。

比如我要做一個Tab切換的功能,像醬紫的:

對應(yīng)的代碼大概是醬紫的:

import { Tabs } from "antd";
import TabOne from "./component/tab1";
import TabTwo from "./component/tab2";
import TabThree from "./component/tab3";

const TabPane = Tabs.TabPane;

export default class Home extends Component {
  render() {
    return (
      
        
          
        
        
          
        
        
          
        
      
    );
  }
}

Tab切換,每個前端小伙伴都做過,其實說白了,就是顯示隱藏的效果。

但是在這個頁面中,已經(jīng)把每個Tab里的代碼都加載進來了,如果用戶只看第一個Tab,其他Tab不點擊,就造成了代碼浪費。

如何解決這個問題呢?還是那句話:我需要什么,你給我什么,我不需要的時候,你別給我,我嫌重。

我們使用動態(tài)導(dǎo)入的方式改造一下代碼:

import { Tabs } from "antd";
import Loadable from "async-loadable";
import TabOne from "./component/tab1";
import Loading from "./component/loading";

const TabPane = Tabs.TabPane;

const loadComponent = path =>
  Loadable({
    loader: () => import(`${path}`),
    loading: Loading
  });

const Tab2 = loadComponent("./component/tab2.tsx");
const Tab3 = loadComponent("./component/tab3.tsx");

export default class Home extends Component {
  render() {
    return (
      
        
          
        
        
          
        
        
          
        
      
    );
  }
}

同樣 我們不再使用import module from "url"的方式,而是使用 loadComponent 方法動態(tài)導(dǎo)入。

由于TabOne是第一個默認顯示的,所以沒必要動態(tài)導(dǎo)入。

現(xiàn)在我們來點擊Tab 2看看效果:

非常棒,正是我們想要的。

再點擊Tab 3 :

簡直完美!

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/95356.html

相關(guān)文章

  • 利用 Pandas 將數(shù)據(jù)集中的某列文本拆分為多行

    摘要:按照的要求我需要將的坐標(biāo)拆分為多行。到這里相當(dāng)于將列中所有文本拆成了一個巨大的表,表中每個單元格有一個值。有些行拆分后的元素比較少,沒有值可以填充的單元格補充會把整個表逐行堆疊成一列。彩蛋我在列拆分為多行的基礎(chǔ)上,還將拆分成了兩個變量。 背景 手頭的項目要求用 Tableau 創(chuàng)建一個 story,數(shù)據(jù)集是摩拜上海城區(qū)用戶使用數(shù)據(jù)。其中有一個維度的數(shù)據(jù)處理起來有點棘手。 數(shù)據(jù)格式 sh...

    BWrong 評論0 收藏0
  • Fundebug前端JavaScript插件更新至1.7.1,拆分錄屏代碼,還原部分Script e

    摘要:拆分了錄屏代碼,監(jiān)控插件壓縮至,另外我們還原了部分,幫助用戶更方便地。請大家及時更新哈拆分錄屏代碼從版本開始,我們拆分了錄屏代碼。自從年雙十一正式上線,累計處理了億錯誤事件,付費客戶有金山軟件百姓網(wǎng)等眾多品牌企業(yè)。 摘要: BUG監(jiān)控插件壓縮至18K。 showImg(https://segmentfault.com/img/bVbpIPC?w=900&h=383); 1.7.1拆分了...

    freecode 評論0 收藏0
  • React組件拆分之道

    摘要:劃分標(biāo)準(zhǔn)根據(jù)稿,不同的展示模塊分為不同的組件。比如頂部底部導(dǎo)航列表等容器組件業(yè)務(wù)組件與數(shù)據(jù)源后臺本地存儲進行數(shù)據(jù)傳輸操作不止是劃分標(biāo)準(zhǔn)根據(jù)業(yè)務(wù)功能劃分。最常見的是列表組件。 為什么要拆分組件 提高可讀性、可維護性 如果不拆分 代碼量大,所有內(nèi)容集中在一起 相同組件無法復(fù)用 業(yè)務(wù)開發(fā)分工不明確,開發(fā)人員要關(guān)心非業(yè)務(wù)的代碼 改代碼時,可能會影響其他業(yè)務(wù),牽一發(fā)動全身(耦合) 任何一個操作...

    terasum 評論0 收藏0
  • MVC到三層的過渡

    摘要:初代架構(gòu)組成控制器視圖業(yè)務(wù)邏輯數(shù)據(jù)訪問實體業(yè)務(wù)實體數(shù)據(jù)訪問優(yōu)勢簡單粗暴缺點代碼臃腫職責(zé)混亂可維護性差可重用性差加入組成層層層業(yè)務(wù)實體數(shù)據(jù)訪問架構(gòu)相比初代架構(gòu)的優(yōu)勢把拆分為兩層和,職責(zé)分明代碼開始根據(jù)職責(zé)進行層級拆分,但未算拆分完整可維護性得 初代架構(gòu) 組成 1、jsp (控制器+視圖) 2、javabean (業(yè)務(wù)邏輯+數(shù)據(jù)訪問+實體) 業(yè)務(wù)Bean、實體Bean、數(shù)據(jù)訪問Bean...

    G9YH 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<