webpack v3 結合 react-router v4 做 dynamic import — 按需加載(懶加載)

為什么要做dynamic import?

dynamic import不知道為什么有很多叫法,什么按需加載,懶加載,Code Splitting,代碼分頁等。
總之,就是在SPA,把JS代碼分成N個頁面份數的文件,不在用戶剛進來就全部引入,而是等用戶跳轉路由的時候,再加載對應的JS文件。
這樣做的好處就是加速首屏顯示速度,同時也減少了資源的浪費。

為什么選擇 webpack 3?

  • 更高的性能
  • 有scope hosting功能,不再需要rollup來處理代碼冗余
  • 可與react-router結合,更優雅的做dynamic import
  • 最重要的一點是,我正經學webpack的時候3已結出了- -

完整的 react spa 項目地址

GitHub項目地址

這個一個完整的項目,這節相關的內容可在router/routerMap.jsx中找到。

第一步:安裝 babel-plugin-syntax-dynamic-import

babel用的是babel-env,使用方法可以去babel官方學習,實踐可看我項目的源代碼。

npm i -D babel-plugin-syntax-dynamic-import 以后, 在.babelrc文件的plungins中加上"syntax-dynamic-import"

第二步:安裝 react-loadable

npm i -S react-loadable 以后,我們就能愉快得做dynamic import了。

第三步: 編輯routerMap

import React from 'react';
import { HashRouter as Router, Route, Switch } from 'react-router-dom';
import createHistory from 'history/createBrowserHistory';
const history = createHistory();import App from 'containers';// 按路由拆分代碼
import Loadable from 'react-loadable';
const MyLoadingComponent = ({ isLoading, error }) => {// Handle the loading stateif (isLoading) {return <div>Loading...</div>;}// Handle the error stateelse if (error) {return <div>Sorry, there was a problem loading the page.</div>;}else {return null;}
};
const AsyncHome = Loadable({loader: () => import('../containers/Home'),loading: MyLoadingComponent
});
const AsyncCity = Loadable({loader: () => import('../containers/City'),loading: MyLoadingComponent
});
const AsyncDetail = Loadable({loader: () => import('../containers/Detail'),loading: MyLoadingComponent
});
const AsyncSearch = Loadable({loader: () => import('../containers/Search'),loading: MyLoadingComponent
});
const AsyncUser = Loadable({loader: () => import('../containers/User'),loading: MyLoadingComponent
});
const AsyncNotFound = Loadable({loader: () => import('../containers/404'),loading: MyLoadingComponent
});// 路由配置
class RouteMap extends React.Component {render() {return (<Router history={history}><App><Switch><Route path="/" exact component={AsyncHome} /><Route path="/city" component={AsyncCity} /><Route path="/search/:category/:keywords?" component={AsyncSearch} /><Route path="/detail/:id" component={AsyncDetail} /><Route path="/user" component={AsyncUser} /><Route path="/empty" component={null} key="empty" /><Route component={AsyncNotFound} /></Switch></App></Router>);// 說明// empty Route// https://github.com/ReactTraining/react-router/issues/1982  解決人:PFight// 解決react-router v4改變查詢參數并不會刷新或者說重載組件的問題 }
}export default RouteMap;

大功告成

我們可以運行webpack,然后就能看到效果(圖僅為dev環境,build才會再打包一個vendor.js,為什么要有vendor.js,請見devDependencies和dependencies的區別 >>)

clipboard.png

參考文章

Code Splitting in Create React App

Q&A

有同學表示,我的方法做頁面分離并沒有什么好處,因為每個頁面都依賴了三方庫的代碼,所以其實頁面有很多冗余代碼,能想到這點很棒,已經開始有架構思維了。不過,注意這個想法在dev環境下,這個同學是對的。

那到了build環境,或者說到了發布環境,又是怎么樣的呢?的確,這篇文章我沒有提到,請見我的另一篇文章devDependencies和dependencies的區別。這篇文章主要解釋了npm的package.json中devDependencies和dependencies區別是什么。

看完以后,我們就可以知道,為什么我之前說“注意這個想法在dev環境下,這個同學是對的”了。因為,我們npm run build以后,webpack會把三方包打包到vendor.js文件,頁面邏輯代碼不會牽涉其中,每個頁面都會引用vendor.js這個文件,這樣的話,就不會出現重復引入冗余代碼的情況了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/455059.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455059.shtml
英文地址,請注明出處:http://en.pswp.cn/news/455059.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

go kegg_工具篇丨GO和KEGG富集不到通路?快試試這個超贊的功能分析工具吧

GO和KEGG富集分析是我們在篩選出差異表達基因之后&#xff0c;都會去做的套路性分析。然鵝……我相信&#xff0c;總有那么一些“倒霉孩子”會遇到跟我一樣的窘境吧&#xff0c;好不容易篩選出來的差異基因&#xff0c;嘗試了DAVID(https://david.ncifcrf.gov/)、Metascape(htt…

大齡程序員的未來在何方

來源&#xff1a;http://www.gad.qq.com//article/detail/30358?sessionUserTypeBFT.PARAMS.229862.TASKID&ADUIN114328649&ADSESSION1501026740&ADTAGCLIENT.QQ.5533_.0&ADPUBNO26719 作者&#xff1a;foruok 大家都對大齡技術人員的未來非常關心&#xff0c…

搭建Telnet服務器

搭建Telnet服務器 作者&#xff1a;尹正杰 版權聲明&#xff1a;原創作品&#xff0c;謝絕轉載&#xff01;否則將追究法律責任。 可能大家都知道現在已經很少有人用TELNET服務器&#xff0c; 因為它傳輸數據是以明文的方式&#xff0c;我們很容易通過抓包軟件講數據進行抓包&a…

table取tr對象 vue_Vue筆記

Vue集成了React和Angular的優點&#xff0c;摒棄了他們的缺點。Vue的官網&#xff1a;https://cn.vuejs.org/v2/api/Vue誕生于2016年&#xff0c;是現在非常流行的MVVM框架。Vue提供了“引包”的使用方法&#xff0c;初學者可以在這之下學習語法。不需要webpack&#xff0c;不需…

Beats入門簡介

使用Beat收集nginx日志和指標數據 項目需求 Nginx是一款非常優秀的web服務器&#xff0c;往往nginx服務會作為項目的訪問入口&#xff0c;那么&#xff0c;nginx的性能保障就變得非常重要了&#xff0c;如果nginx的運行出現了問題就會對項目有較大的影響&#xff0c;所以&…

PHP-curl

//初始化$curl curl_init();//設置抓取的urlcurl_setopt($curl, CURLOPT_URL, http://www.baidu.com);//設置頭文件的信息作為數據流輸出curl_setopt($curl, CURLOPT_HEADER, 1);//設置獲取的信息以文件流的形式返回&#xff0c;而不是直接輸出。curl_setopt($curl, CURLOPT_R…

MPlayer開發

一、介紹 不論是音頻數據還是視頻數據&#xff0c;我都為MPlayer項目開發過一些開源的解碼器。因此我個人認為我有資格寫一篇文檔來介紹如何開發新的編解碼器。 學習如何添加一個新的編解碼器的最好方法通常是學習大量的已有代碼。本文檔僅僅是對代碼的一個補充&#x…

可編程led燈帶原理_SCPSD-250-04-27派克真空壓力傳感器故障和工作原理

SCPSD-250-04-27派克PARKER真空壓力傳感器故障和工作原理PARKER壓力開關現貨 PARKER壓力傳感器特價 派克真空壓力傳感器 PARKER數字壓力開關2020年還剩最后2天了&#xff0c;這一年大家都過得不太容易&#xff0c;尤其是我自己這是30年以來過得最艱難的一年&#xff0c;經…

總結面試時沒有回答上的內存對齊問題

前兩天面試某公司時&#xff0c;沒有回答上的一個問題&#xff0c;總結如下&#xff0c;以供參考。 問&#xff1a;下面這個結構類型的實例變量占用多少內存&#xff1a; struct struct1 { int i; short j; char c; }; 我反問&#xff1a;是啥語言啥機器啥編譯環境…

Kibana入門安裝與介紹

Kibana入門 Kibana 是一款開源的數據分析和可視化平臺&#xff0c;它是 Elastic Stack 成員之一&#xff0c;設計用于和 Elasticsearch 協作。您可以使用 Kibana 對 Elasticsearch 索引中的數據進行搜索、查看、交互操作。您可以很方便的利用圖表、表格及地圖對數據進行多元化…

友善串口工具接收數據隨機換行_使用Python3+PyQT5+Pyserial 實現簡單的串口工具方法...

練手項目&#xff0c;先上圖先實現一個簡單的串口工具&#xff0c;為之后的上位機做準備代碼如下&#xff1a;pyserial_demo.pyimport sys import serial import serial.tools.list_ports from PyQt5 import QtWidgets from PyQt5.QtWidgets import QMessageBox from PyQt5.QtC…

Vue渲染函數

前面的話 Vue 推薦在絕大多數情況下使用 template 來創建HTML。然而在一些場景中&#xff0c;真的需要 JavaScript 的完全編程的能力&#xff0c;這就是 render 函數&#xff0c;它比 template 更接近編譯器。本文將詳細介紹Vue渲染函數 引入 下面是一個例子&#xff0c;如果要…

數據綁定原理

一、數據單向綁定原理指先把模板寫好&#xff0c;然后把模板和數據(數據可能來自后臺)整合到一起形成HTML代碼&#xff0c;最后把這段HTML代碼插入到文檔流里。缺點&#xff1a;一旦HTML代碼生成就沒有辦法改變&#xff0c;如果有新數據重新傳入&#xff0c;就必須重新把模板和…

視頻解碼優化

以下通過剖析一些經驗來了解視頻解碼優化 1. 在嵌入式系統中實現MPEG4的視頻解碼 有兩種方法可行 (1)采用ffmpeg(mplayer 的核心就是采用ffmpeg)&#xff0c;然后對ffmpeg mp4解碼優化 1).對IDCT匯編化,并優化VLD的實現 ->inline&匯編化 2).根據ARM9 cache&cache…

Logstash入門簡介

Logstash入門簡介 介紹 Logstash是一個開源的服務器端數據處理管道&#xff0c;能夠同時從多個來源采集數據&#xff0c;轉換數據&#xff0c;然后將數據發送到最喜歡的存儲庫中&#xff08;我們的存儲庫當然是ElasticSearch&#xff09; 我們回到我們ElasticStack的架構圖&a…

Django templates 和 urls 拆分

如果在Django項目 下面新建了blog和polls兩個APP應用&#xff0c;在每個APP下面都各自新建自己的url和templates&#xff0c;那么我們需要如何進行項目配置呢&#xff1f; INSTALLED_APPS [ django.contrib.admin, django.contrib.auth, django.contrib.contenttypes, dja…

springboot怎么殺進程_線上服務平均響應時間太長,怎么排查?

線上服務平均響應時間太長&#xff0c;怎么排查&#xff1f;https://xie.infoq.cn/article/914b5c56000a3880016abd8d6前言&#xff1a;最近線上環境某個接口服務響應時間偏長&#xff0c;導致用戶體驗超差&#xff0c;那平時該怎么快速的排查這類問題呢&#xff1f;①、為代碼…

Redis學習第五課:Redis Set類型及操作

Set是集合&#xff0c;它是string類型的無序集合。set是通過hash table實現的&#xff0c;添加、刪除和查找的復雜度都是O(1)。 對集合我們可以取并集、交集、差集。通過這些操作我們可以實現SNS中的好友推薦和blog的tag功能。 Set集合操作&#xff1a; sadd:向名稱為Key的set中…

MPEG音視頻編解碼之MP3編解碼概述

2 MP3編解碼原理 2.1 MP3音頻壓縮標準概述 MP3全稱是動態影像專家壓縮標準音頻層面3&#xff08;Moving Picture Experts Group Audio Layer III&#xff09;。是當今較流行的一種數字音頻編碼和有損壓縮格式&#xff0c;它設計用來大幅度地降低音頻數據量&#xff0c;而對于…

Python實現GitBook工具

寫在前面 本工具是通過Python腳本實現 GitBook 自動 生成 執行 編譯 發布的功能 你可以在這里下載exe 使用 1. exe下載,并移動位置 將exe文件放在你的gitbook文件夾中,或者放在空文件夾中 2. file.md 創建 名為file.md的文件,在你要寫book的目錄下 注意: 這里file.md文件名…