1.項目初始化css
2.提高開發體驗html
3.整理項目和雜項node
4.項目打包react
5.團隊規範webpack
通過前面的初始化,提高開發體驗和集成了一堆工具,調整了項目結構等等以後,咱們是時候考慮進行項目打包了。 在這篇博客中,咱們不考慮開發環境和生產環境的配置分別,咱們只看打包須要進行的配置項,因此咱們須要作的以下: 0. 添加打包路徑工具git
html-webpack-plugin
配置項react-loadable
和react-router
,進行代碼分離和按需加載externals
咱們先去webpack.config.js
中觀察一下output
這個配置項: es6
webpack
的配置項中,
output
是必須有的。 接着咱們去到
package.json
中在
script
中添加打包命令
build
,該命令引用咱們的
webpack.config.js
配置文件:
以後試試運行
npm run build
,會發現已經將項目打包出來了:
在上一步中,咱們已經知道打包出來的文件位於根目錄下的dist
文件夾中,因此這個路徑工具的添加指向dist
文件夾: 咱們去到build/utils.js
文件中,添加以下代碼: github
在上面打包的結果中,咱們會發現只有一個app.js
文件,而實際上咱們是有寫css樣式的,可是如今的卻並無這個css文件,這是由於webpack
將全部的資源(包含js
, css
等等)都當作是chunk
,而後一塊兒打包進一個文件中,這樣會致使打包出來的js文件體積巨大,從而拖累頁面的加載速度。web
webpack 4+
版本中,咱們可使用mini-css-extract-plugin
進行css代碼的分離,因此首先安裝它npm install -D mini-css-extract-plugin
。build/plugins.js
中添加這個插件:
style-loader
用於將css-loader
編譯出來的代碼轉爲js代碼並寫入js文件中,因此在這裏,咱們須要用mini-css-extract-plugin
中的loader去替換掉style-loader
,讓它寫入單獨的css文件而不是js文件中: 咱們去到build/rules/styleRules.js
中,將本來的style-loader
全都替換成mini-css-extract-plugin
的loader(這一步能夠進行開發環境和生產環境的區分,在文章中不進行區分):
npm run build
能夠發現打包結果中css文件已經進行了分離:
而在打包出來的index.html
中也能夠發現這個css文件被引入了:
html-webpack-plugin
配置項這一步主要用於壓縮打包出來的index.html
文件,可是單頁面應用的話html
內容其實很少,因此作不作也差很少,在本文章中也只是作個介紹:npm
html-webpack-plugin
中利用的是html-minifier來作壓縮工做的,因此詳細配置點擊進去看便可,經常使用的以下:
inject
這個配置項,該項指定資源如何注入,咱們直接使用默認的true
便可,他會將js資源注入到<body>
標籤的底部,若是要注入到頭部填寫head
便可react-loadable
和react-router
,進行代碼分離和按需加載這一步和下一步都是在進行代碼的拆分,考慮的是若是全部文件都塞進一個js文件中,會致使這個js文件體積臃腫,而單頁面應用的全部構建又是依賴於這個js文件,因此須要進行代碼分離,只加載當前頁面須要構建的js文件。 一般來講,咱們會根據react-router
分的頁面來進行代碼分離,再用react-loadable進行分割出來的代碼的異步加載(固然你也能夠將全部組件都進行代碼分離而後異步加載)。 因此在這裏咱們先利用react-router
分兩個頁面home
和page
出來:
react-router
: npm install -S react-router-dom
,而後在src/containers/views
中新建Home
和Page
組件:
react-loadable
: npm install -S react-loadable
, 而後在src/containers/shared
中新建App
組件:
以後在裏面的index.tsx
中引用react-router
和react-loadable
進行組件按需加載: 固然不要忘了使用react-hot-loader
:
這一步須要注意的是,Loadable
這個函數中的loading參數是必須有的,至於如何使用能夠自行參考react-loadable
的github連接。/
路徑下,沒有加載page.js
這個文件,而切換到/page
路徑則會加載page.js
文件,這個時候按需加載就完成了:
optimization
進行第三方庫代碼分離optimization
是webpack4+版本中新出的配置項,這個配置項的功能主要是進行代碼壓縮,優化。 在本節中,咱們須要將用到的處於node_modules
中的第三方代碼進行分離,在這裏主要用到的是兩個配置項optimization.runtimeChunk
和optimization.splitChunks
,其中runtimeChunk
用於生成維繫各各代碼塊關係的代碼,splitChunks
則用於指定須要進行分塊的代碼,和分塊後文件名。
build
目錄下,新建optimization.js
,並添加以下代碼:
而後在webpack.config.js
中引入這個配置:
vendor.js
文件中了:
你能夠經過比對在添加optimization
以前和以後打包出來的app.js
文件來看出效果。在這一步中,咱們主要是作js和css的代碼壓縮和優化
npm install -D uglifyjs-webpack-plugin
,而後去到build/optimization.js
中添加以下代碼便可,具體的優化見代碼:
PS: 這裏有一個點須要注意,在uglifyjs-webpack-plugin
這個插件中,若是是2.x版本的話是不支持es6規範的,因此建議安裝1.x版本,而我這裏的版本是:
npm install -D optimize-css-assets-webpack-plugin
。 咱們先去Home
組件中隨意添加一個樣式並使用它:
而後再去到build/optimization.js
添加以下代碼:
具體的插件使用方式能夠自行上github查看該插件。 最後查看打包出來後的css代碼:
到如今壓縮代碼步驟也作完了,最後將介紹一下webpack.externals
這個選項。
externals
webpack.externals配置項用於在構建過程當中忽略一些經常使用包的集成,從而下降構建時間和打包後的包大小,它的配置也很簡單,在本章中只作簡單介紹: 在本項目中,咱們能夠將react
和react-dom
添加進externals
中,而後在html模板中引入它們的外部連接:
webpack.config.js
中,添加externals
選項,而且把react
和react-dom
添加進去:
這個配置項接收的是一個對象(其餘形式請自行查閱webpack文檔),對象的鍵是指webapck在獲取這個模塊時候require
時候的參數,而對應的值則是標明你打算將這個模塊掛載的變量名,這裏是掛載在window對象中的。build/tpl/index.html
中,引入cdn中react
和react-dom
的連接:
npm run dev
中可以正常使用,而且也已經引入了二者的外部資源: