成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

代碼拆分

warkiz / 3116人閱讀

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

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

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

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

這時(shí)我們會(huì)考慮將代碼拆分。

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

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

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

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

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

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

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

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

async-loadable

由于import()方法返回的是Promise對(duì)象,我們?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 的動(dòng)態(tài)導(dǎo)入,調(diào)用loadable方法可以方便的返回要使用的組件。

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

代碼拆分前

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

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



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

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

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

基于路由的代碼拆分

打開度娘的我臉色漸漸有了好轉(zhuǎn),通過搜索,看到了webpack有個(gè)code splitting功能(代碼拆分),
前面說過,代碼拆分其實(shí)就是使用動(dòng)態(tài)導(dǎo)入的技術(shù)實(shí)現(xiàn)的,那么我們就使用動(dòng)態(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 來動(dòng)態(tài)導(dǎo)入,它返回的是Loadable的結(jié)果,也就是我們想要的組件,我們把再把組件給對(duì)應(yīng)的路由,這就完成了基于路由的代碼拆分。

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

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

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

比如我點(diǎn)擊home頁面的路由時(shí):

我再點(diǎn)擊page1時(shí):

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

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

看著項(xiàng)目加載速度變快了,心里真特么高興

基于模塊拆分

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

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

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

對(duì)應(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切換,每個(gè)前端小伙伴都做過,其實(shí)說白了,就是顯示隱藏的效果。

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

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

我們使用動(dòng)態(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 方法動(dòng)態(tài)導(dǎo)入。

由于TabOne是第一個(gè)默認(rèn)顯示的,所以沒必要?jiǎng)討B(tài)導(dǎo)入。

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

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

再點(diǎn)擊Tab 3 :

簡直完美!

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/95356.html

相關(guān)文章

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

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

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

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

    freecode 評(píng)論0 收藏0
  • React組件拆分之道

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

    terasum 評(píng)論0 收藏0
  • MVC到三層的過渡

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

    G9YH 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<