国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【翻譯】基于 Create React App路由4.0的異步組件加載(Code Splitting

fredshare / 2563人閱讀

摘要:基于路由的異步組件加載本文章是一個額外的篇章,它可以在你的中,幫助加快初始的加載組件時間。但是,我們靜態(tài)地在頂部導入路由中的所有組件。當然我們的程序是相當小的,并且分離在各個部分的小組件,是不需要這樣子按需加載的。

基于 Create React App路由4.0的異步組件加載

本文章是一個額外的篇章,它可以在你的React app中,幫助加快初始的加載組件時間。當然這個操作不是完全必要的,但如果你好奇的話,請隨意跟隨這篇文章一起用Create React Appreact路由4.0的異步加載方式來幫助react.js構(gòu)建大型應(yīng)用。

代碼分割(Code Splitting)

當我們用react.js寫我們的單頁應(yīng)用程序時候,這個應(yīng)用會變得越來越大,一個應(yīng)用(或者路由頁面)可能會引入大量的組件,可是有些組件是第一次加載的時候是不必要的,這些不必要的組件會浪費很多的加載時間。

你可能會注意到 Create React App 在打包完畢之后會生成一個很大的.js文件,這包含了我們應(yīng)用程序需要的所有JavaScript。但是,如果用戶只是加載登錄頁面去登錄網(wǎng)站,我們加載應(yīng)用程序的其余部分是沒有意義的。在我們的應(yīng)用程序還很小的時候,這并不是一個問題,但是它卻是我們程序猿優(yōu)化的一個東西。為了解決這個問題,Create React App有一個非常簡單的代碼分割的的方案。

代碼分割和 react-router

在我們 react app 中,常見的路由配置可能是像下面一樣的

/* Import the components */
import Home from "./containers/Home";
import Posts from "./containers/Posts";
import NotFound from "./containers/NotFound";


/* Use components to define routes */
export default () => (
  
    
    
    
  
);

我們一開始引入這些組件,然后定義好的路徑,會根據(jù)我們的路由去匹配這些組件。

但是,我們靜態(tài)地在頂部導入路由中的所有組件。這意味著,不管哪個路由匹配,所有這些組件都被加載。我們只想加載對匹配路由的時候才加載響應(yīng)的組件。下面我們一步步來完成這個使命。

創(chuàng)建一個異步組件

創(chuàng)建一個js 文件,如:src/components/AsyncComponent.js,代碼如下

import React, { Component } from "react";

export default function asyncComponent(importComponent) {
  class AsyncComponent extends Component {
    constructor(props) {
      super(props);

      this.state = {
        component: null
      };
    }

    async componentDidMount() {
      const { default: component } = await importComponent();

      this.setState({
        component: component
      });
    }

    render() {
      const C = this.state.component;

      return C ?  : null;
    }
  }

  return AsyncComponent;
}

我們在這里做了一些事情:

這個asyncComponent 函數(shù)接受一個importComponent 的參數(shù),importComponent 調(diào)用時候?qū)討B(tài)引入給定的組件。

componentDidMount 我們只是簡單地調(diào)用importComponent 函數(shù),并將動態(tài)加載的組件保存在狀態(tài)中。

最后,如果完成渲染,我們有條件地提供組件。在這里我們?nèi)绻粚?b>null的話,也可提供一個菊花圖,代表著組件正在渲染。

使用異步組件

現(xiàn)在讓我們使用我們的異步組件,而不是像開始的靜態(tài)去引入。

import Home from "./containers/Home";

我們要用asyncComponent組件來動態(tài)引入我們需要的組件。

tip: 別忘記 先 import asyncComponent from "./AsyncComponent

const AsyncHome = asyncComponent(() => import("./containers/Home"));

我們將要使用 AsyncHome 這個組件在我們的路由里面

現(xiàn)在讓我們回到Notes項目并應(yīng)用這些更改。

src/Routes.js

import React from "react";
import { Route, Switch } from "react-router-dom";
import asyncComponent from "./components/AsyncComponent";
import AppliedRoute from "./components/AppliedRoute";
import AuthenticatedRoute from "./components/AuthenticatedRoute";
import UnauthenticatedRoute from "./components/UnauthenticatedRoute";

const AsyncHome     = asyncComponent(() => import("./containers/Home"));
const AsyncLogin    = asyncComponent(() => import("./containers/Login"));
const AsyncNotes    = asyncComponent(() => import("./containers/Notes"));
const AsyncSignup   = asyncComponent(() => import("./containers/Signup"));
const AsyncNewNote  = asyncComponent(() => import("./containers/NewNote"));
const AsyncNotFound = asyncComponent(() => import("./containers/NotFound"));

export default ({ childProps }) => (
  
    
    
    
    
    
    { /* Finally, catch all unmatched routes */ }
    
  
);

只需幾次更改就相當酷了。我們的app都是設(shè)置了代碼分割而的。也沒有增加太多的復雜性。
這里我們看看之前的這個src/Routes.js路由文件

import React from "react";
import { Route, Switch } from "react-router-dom";
import AppliedRoute from "./components/AppliedRoute";
import AuthenticatedRoute from "./components/AuthenticatedRoute";
import UnauthenticatedRoute from "./components/UnauthenticatedRoute";

import Home from "./containers/Home";
import Login from "./containers/Login";
import Notes from "./containers/Notes";
import Signup from "./containers/Signup";
import NewNote from "./containers/NewNote";
import NotFound from "./containers/NotFound";

export default ({ childProps }) => (
  
    
    
    
    
    
    { /* Finally, catch all unmatched routes */ }
    
  
);

注意,不要在頂部的引入所有的組件。我們正在創(chuàng)建這些代碼分割的功能,以便在必要時為我們進行動態(tài)導入。

現(xiàn)在你運行npm run build 您將看到代碼已經(jīng)被分割成一個個小文件。

下面是部署好的在網(wǎng)站的真實截圖

每個.chunk.js都是需要的時候才加載的。當然我們的程序是相當小的,并且分離在各個部分的小組件,是不需要這樣子按需加載的。還是看你項目的需求。

原文地址:http://serverless-stack.com/c...

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

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/83857.html

相關(guān)文章

  • 2017-07-06 前端日報

    摘要:前端日報精選專題之類型判斷下百度生態(tài)構(gòu)建發(fā)布基于的解決方案將全面支持從綁定,看語言發(fā)展和框架設(shè)計掘金譯機器學習與一付費問答上線,向你心目中的大牛提問吧產(chǎn)品技術(shù)日志中文第期團隊技術(shù)信息流建設(shè)翻譯基于路由的異步組件加載個必備的裝逼 2017-07-06 前端日報 精選 JavaScript專題之類型判斷(下) · Issue #30 · mqyqingfeng/Blog 百度Web生態(tài)構(gòu)...

    shiguibiao 評論0 收藏0
  • Webpack 4.0 CommonsChunkPlugin 和 optimization spli

    摘要:可以通過配置屬性進行修改,默認將會自動創(chuàng)建個庫文件僅含有依然會創(chuàng)建個庫文件僅含有假設(shè)所有的體積都大于將會創(chuàng)建一個庫文件和一個通用組件文件僅含有當這些體積小于是,會故意將該模塊復制到三個文件中。 該文章內(nèi)容大致翻譯自 webpack 4: Code Splitting, chunk graph and the splitChunks optimization 原有的問題 webpack...

    Caizhenhao 評論0 收藏0
  • 拒絕Redux文檔“毒害” 一個項目告訴你Redux最新真正哲學

    摘要:之前分享過幾篇關(guān)于技術(shù)棧的原創(chuàng)文章解析前端架構(gòu)學習復雜場景數(shù)據(jù)設(shè)計干貨總結(jié)打造單頁應(yīng)用一個項目理解最前沿技術(shù)棧真諦一個工程實例今天進一步剖析一個實際案例移動網(wǎng)頁版。目前面臨的問題在于提高產(chǎn)品的各方面性能體驗。 之前分享過幾篇關(guān)于React技術(shù)棧的原創(chuàng)文章: 解析Twitter前端架構(gòu) 學習復雜場景數(shù)據(jù)設(shè)計 React Conf 2017 干貨總結(jié)1: React + ES next ...

    YuboonaZhang 評論0 收藏0
  • The Cost Of JavaScript 2018 精讀

    摘要:目前我們的業(yè)務(wù)項目采用的來進行優(yōu)化和首屏性能提升。可變性需要讓開發(fā)人員降低開發(fā)時的基準線,來保證每一個用戶的體驗。對于路由的切分以及庫的引入來說,這一個原則至關(guān)重要。快速生成一份站點的性能審查報告。 The Cost Of JavaScript 2018 關(guān)于原文 原文是在Medium上面看到的,Chrome工程師Addy Osmani發(fā)布的一篇文章,這位的Medium上面的自我介紹里...

    lushan 評論0 收藏0

發(fā)表評論

0條評論

fredshare

|高級講師

TA的文章

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