相關文章和閱讀順序
專案地址
前言
在上一篇提升開發體驗中,我們一下子整合了一堆外掛和功能進去,導致專案結構比教混亂,重點問題就在webpack
的相關配置專案錄build
資料夾中,所以今天的工作較為輕鬆,重點就是進行專案結構整理,然後再進行一些雜項的新增。
- 整理專案結構
- 整合
Ant Design
並進行主題修改 - 整合常用函式,並且讓所有元件繼承這些函式
- 整合
mobx
進行專案的狀態管理 - 使用
react-hot-loader
進行熱載入 - 整合
svg-component
整理專案結構
在做這一步的時候首先我們來看看現在的專案結構是怎麼樣的:
那麼當前最先需要做的工作就是進行build
資料夾下webapck
的配置項整理。
針對webpack配置項的整理 做這一步的時候首先需要確定一點就是,我們根據什麼來整理webpack配置專案錄呢?要確定這一點只需要檢視一下webpack中有些什麼配置,然後就可以根據每個配置項進行模組劃分:
在這份配置項中,因為entry
、output
、resolve
內容相對較少,往後也不會有太多內容的新增,所以可以忽略。
- 首先將
plugins
相關內容移出來:
- 首先在
build
中新建檔案plugins.js
,然後將原先的plugin裡面的程式碼拷貝過去: - 在
webpack.config.js
中將plugins.js
的內容引入進來即可:
-
整合路徑選擇 在
之後在任何需要使用的地方引入這個函式使用即可:webpack.config.js
中你會看到許多使用path.join
的地方,這一塊也可以抽取出來作為一個工具模組。 新建build/utils.js
檔案,然後寫入如下程式碼,將路徑的目標指向根目錄,詳細路徑則通過引數的形式傳入: -
將
module
相關內容移出來: 因為在module
項中相關的配置相對較多,涵蓋了對ts(x)
和scss
等相關檔案的loader
,以後還需要新增針對圖片等檔案型別的loader
,所以這一塊需要分的更加細一些:
- 在
build
中新建rules
目錄,裡面新建jsRules
和styleRules
檔案: - 將之前
module
中的loader配置一如對應檔案中並匯出,然後在webpack.config.js
中引入: 首先是jsRules
內容: 然後是styleRules
內容: 最後是引入rules後的webpack.config.js
:
至此我們就將webpack
的配置項分離了出來,接下來我們整合Ant Design
UI庫(簡稱antd
),並且修改其主題色。
整合antd
-
整合antd 要整合antd非常簡單,只需要
你會發現已經生效了:npm install -S antd
即可,然後我們在components/Test
元件中引入其中一個元件: -
修改antd的主題配色 通常在開發中,我們採用的配色不是
antd
原本的配色,如果大面積引用antd
元件的話,一個個去修改配色確實是非常麻煩的事情,於是這個時候就需要一次性對antd
的主題色進行修改。
antd
的樣式使用less
進行編寫,對其主題的修改也就是對其中的less
變數進行修改,所以想要修改主題需要安裝less
和less-loader
:npm install -D less less-loader
- 然後我們在根目錄下新增一個
theme.js
檔案,裡面是需要修改的主題樣式程式碼,具體有什麼主題可以進行修改可以點選這裡檢視: - 然後編寫在
build/rules/styleRules
中新增針對less
檔案的loader,如下圖: 引入上一步的主題檔案: - 最後我們在
components/Test
元件中引入Button
元件的樣式less
檔案: 此時可以檢視效果,發現已經主題已經修改成功: - 存在的問題:
這個時候進行antd元件的引入和主題修改的步驟中還是存在一些問題的,比如在引入某個元件的同時還需要手動引入其對應的
less
檔案,這是非常麻煩的一件事,那麼找我們需要解決的就是在引入antd元件的同時也自動引入其對應的less
檔案。 另外,使用import {Button } from 'antd'
這樣的引入方式存在一個很大的弊端,就是在引入其中某個元件的同時會把整個antd
檔案都引入進來,影響構建速度,而且打包後體積會變大,這樣的話我們還需要做antd
的按需載入。 所以接下來我們需要解決掉這兩個問題,而這兩個問題也是可以同時解決的。
- antd按需載入
- 在
antd
官網中推薦使用babel-plugin-import來做按需載入,但是我們的專案用的是typescript
,走的是awesome-typescript-loader
編譯,所以在我們的專案中babel-plugin-impor
是不生效的,這時候需要就需要一個叫做ts-import-plugin的外掛npm install -D ts-import-plugin
- 第二步我們需要在
build/rules/jsRules.js
中進行配置,根據ts-import-plugin
的教程直接配置即可: - 回到
Test
元件中 將import 'antd/lib/button/style/index.less'
這句話刪掉,然後重新執行檢視效果:
整合常用函式
在上一步中,我們整合了antd
UI庫,在這個庫中有許多東西是非常常用的,例如訊息元件message
和通知元件notification
,但是要用到這兩個元件的話就得引入,當使用次數較多的時候,我們可以考慮將其整合在一個react元件中,然後所有的元件都繼承這個元件即可,這樣做的好處是當以後新增了例如axios
這樣的常用庫的時候也可以整合到這個react元件中,使繼承這個react元件的元件都可以用到。
- 整合常用函式
- 我們先在
src
下新建utils
目錄,然後在utils
中新建reactExt.tsx
檔案: - 然後在
tsconfig.json
中設定好utils
的路徑,方便以後的路徑引用: - 在
reactExt.tsx
中引入antd
常用元件,然後匯出這個整合了antd元件的元件,當然你也可以把它叫做類,其中需要注意的是,因為以後的每個react元件使用的都是componentExt
,然後在這裡我們需要使用typescript的interface
來對react元件的state
和props
進行資料型別上的限制,但與此同時並不能知道每個react元件針對state
和props
的interface
是怎麼樣的,所以在componentExt
中需要用到泛型來靈活化interface
: - 最後在
components/Test
元件中引入comonentExt
進行測試: 以後如果有常用的功能性函式也可以往components/reactExt
中進行新增。
整合mobx
mobx是react技術棧中一款優秀的狀態管理工具,它具有資料監測的功能,並且比redux用起來更加方便,也能脫離react進行單獨使用,安裝mobx只需要npm install -S mobx
即可,同時也要安裝他和react連線的工具npm install -S mobx-react
。
接下來就以一個經典的計算器元件來測試mobx
。
- 準備工作 在進行測試之前,我們還需要整理一下元件存放的目錄。首先區分一下元件目錄的作用。
components
目錄用於存放通用元件,該目錄存放的元件不包含任何業務性功能。- 新建
src/containers/views
目錄,這個目錄是用於存放業務元件的,並且這些元件不能複用。 - 新建
src/containers/shared
目錄,這個目錄用於存放可以複用的業務元件。 - 在
tsconfig.json
中設定簡短路徑方便以後呼叫: 這一步在該部落格中作用體現不大,但是對真實專案的條理性是存在較好作用的。 如下圖:
- 建立store
- 新建
src/store
目錄用於存放store
檔案,然後在該目錄下新建globalStore
目錄和其中的index.tsx
檔案: - 然後在這個
index.tsx
檔案中有如下程式碼: 其中的observable
和action
的功能請自行檢視mobx
文件: - 然後新建
src/store/index.tsx
檔案用於匯出這些store:
-
連線store 建立了store之後我們還需要將其和react進行連線,這個時候就需要用到
這裡面的mobx-react
這個庫,我們去到src/index.tsx
中進行修改:configure({enforceActions: 'observed'})
用於限制被observable
(也就是store中新增了@observable
)的資料的修改方式,讓其只能新增了@action
的函式中進行修改。 -
編寫
Counter
元件進行測試
- 我們去到
src/containers/views
目錄中,新增Counter/index.tsx
,並寫入如下程式碼: - 然後將這個元件用
mobx-react
變為可觀測物件,並使用@inject
注入globalStore
: - 最後我們在
src/index.tsx
中引入Counter
元件,順便看看它的props
中是否帶有資料: - 最後回到
Counter
元件中編寫方法檢驗功能是否正常:
- 給store新增全域性typescript校驗
在上面的例子中雖然我們在功能上已經可以正常的使用了,但是顯而易見的是有報錯,這個錯誤是因為沒有填寫針對元件
props
的驗證介面導致typescript認為globalStore
不存在而導致的。我們可以寫成如下程式碼解決問題: 但是每個引入了globalStore
的元件都需要寫一次顯得非常麻煩,那麼我們可以將IGlobalStore
這個校驗介面寫成全域性的校驗介面,直接以如下圖形式驗證即可: 步驟如下:
- 我們在
src/store/globalStore
下新建type.d.ts
: - 去到
globalStore/index.tsx
中,將GlobalStore
類匯出,我們將會利用這個類作為typescript校驗介面來使用(這種用法可以點這裡檢視詳情): - 在
type.d.ts
中引入這個類,然後定義並匯出一個全域性名稱空間(該用法詳解點這裡),接著在這個名稱空間中把介面匯出: - 回到
Counter
元件中,將介面改寫為如下: 這裡注意需要新增?
,因為這個屬性是從store中拿過來的,不填寫的話,父元件會報錯說沒有傳這個值。 但是因為新增了?
,所以這個globalStore
驗證為不一定有,從而在元件中會有如下報錯: 這個時候我們可以去tsconfig.json
中將strictNullChecks
項置為false
,去掉null
和undefined
的檢測即可: - 到了這一步我們整合Mobx就成功了,並且也針對store新增了對應的typescript驗證:
使用react-hot-loader
進行熱載入
這一步主要針對的是webpack-dev-server
的頁面自動重新整理功能不能保持資料一直都在,有時候在更新元件程式碼後需要保持資料不變的場景就會很不方便,所以這個時候就需要用到react-hot-loader
來進行頁面程式碼變更檢測並找到變更部分進行更新,同時保證資料不變。
- 首先我們安裝它
npm install -D react-hot-loader
- 然後我們還要用到它裡面的
react-hot-loader/babel
,但是因為我們使用了awesome-typescript-loader
,所以不需要在根目錄新增.babelrc
檔案了,直接進到build/rules/jsRules.js
中進行配置即可: - 接著我們去到
Counter
元件中引入react-hot-loader
中的hot
方法,直接以裝飾器的形式包裹元件: - 最後再去
package.json
中,在dev
命令後面加上--hot
即可: - 回到
Counter
元件中做個檢測,先增加一些數字,然後在增加字樣後面加上幾個字元,可以看到頁面更新的同時保留了資料: 實際上我們在控制檯看到輸出這個字樣就已經成功了:
整合svg-component
在前端開發中,svg格式的圖片使用的是非常頻繁的,而整合了svg-component
後,我們可以將svg圖片以元件的形式引入並使用:
- 要整合
svg-component
我們首先要安裝@svgr/webpack:npm install -D @svgr/webpack
,這是一個loader; - 然後我們在
build/rules
中新建fileRules.js
檔案,將svg
格式檔案用這個loader進行編譯: 然後在webpack.config.json
中匯入並重啟專案: - 接著我們隨便找一個
svg
格式圖片在Counter
中引入並測試,雖然可以使用了,但是也導致了一個typescript的報錯說找不到模組: 導致這個錯誤的原因是svg圖片本身並不具備模組化的功能,也不提供模組匯出,所以在匯入的時候是不能識別的,要解決這個問題可以模仿我們之前使用css moudles
的方式,給它宣告一個模組: 我們在typings
目錄下新建svg.d.ts
檔案,並寫入如下程式碼: 這個時候還可以為svg-component
的使用提供程式碼提示和傳入屬性校驗的支援: 我們宣告一個介面,然後在宣告的模組中用這個介面作為內容: 這個介面使用的是react
的無狀態元件宣告,傳入屬性則為svg檔案自帶的屬性比如color width
之類的,然後我們就可以愉快地使用svg-comonent
了:
至此我們就把webpack目錄整理完畢,並且新增了一些附帶各種作用的庫或者工具,下一步則會介紹專案打包部分的處理。