從零開始開發一個react腳手架(五)

前言:最近天天加班做新項目,Taro版的小程序,還要實現富文本加海報,踩了不少坑,下次專門開個坑說一下。 回到腳手架,說實話從頭寫一個,即便是參考create-react-app,還是遇到了很多很多問題,這些都是需要自己親自寫過,纔能有所體會。
這次會寫的有雜亂一點,就說說自己遇到的哪些問題。雖然還沒有全部完工,但是已經能夠基本使用,最下面會貼git地址

問題一 現在基本實現了兩個命令,start和build,start就是啓動webpack-dev-server,這是開發環境, build就是構建,是production環境。 不管什麼命令都需要依賴 NODE_ENV=development或者production,這樣會導致每次npm run 的時候都要加上NODE_ENV,而且這個還不能直接寫在script命令裏面,因爲window是不支持,需要安裝第三方庫。最後參考create-react-app

clipboard.png

直接賦值,簡單粗暴。 一開始沒想到可以這麼簡單粗暴,走了歪路,想要通過DefinePlugin來實現賦值,但其實這反倒是錯誤的路線。需要理解編譯工具所依賴的NODE_ENV和業務代碼裏面的NODE_ENV是不同的,DefinePlugin其實就是個簡單的全局變量替換,只能替換chunk裏面的。

問題二 優化createWebpack,一開始的做法極爲簡單,直接export一個對象,導致靈活性很差,後來改成導出一個方法,接收各種配置參數,返回一個webpackConfig。

clipboard.png

問題三 webpack-dev-serve,這個問題搗鼓了很久很久。關於webpack-dev-serve的contentBase配置。一開始我設置的是dist目錄,也就是打包後的目錄,即output設置的path。因爲以前都是這樣玩的,但是這樣意味着服務依賴了一個打包構建後的目錄dist,否則沒有辦法找到index.html。這樣就很詭異,難道第一次start都必須先build一下嗎?很不合理,而且build的時候NODE_ENV必須是development,否則js的引用地址就成了線上地址。而根據上面一個問題,簡單粗暴在代碼裏面寫死NODE_ENV就很難改變環境變量了,build出來的只能是線上。
看了很久的create-react-app的源碼,因爲這個腳手架並不需要先build,一開始以爲他在start的時候做了什麼特殊處理,後來才發現壓根不是,它的webpack-dev-server配置的cotentbase竟然不是dist,而是原始目錄src/index.html。。。
這樣我很震驚啊,因爲我想的是,js什麼的,css什麼的引入都必須是在webpack build之後才知道的,因爲會做拆分剝離的處理,JS的文件個數和名字不確定,如果引入的是原始目錄,那麼到底是在哪兒做的JS和CSS插入操作呢,爲此尋遍了源碼,一個個去找plugin,但最後發現其實壓根很簡單。
在於html-webpack-plugin,貌似它會先在內存中生成一份html,想要訪問內存地址直接就是
localhost:3000,而webpack-dev-server應該是優先去取內存中的index.html,沒取到就會去cotentbase中找,也就是說和cotentbase壓根沒有半毛錢關係。
產生錯覺的原因在於,內存中沒找到,而cotentbase中同樣沒找到,就會報404。至於爲嘛沒有取到內存中的值,在於我閒的沒事,設置了publicPath,爲/assets/這樣導致,想要訪問html的地址就變成了localhost:3000/assets/index.html。其實開發環境壓根沒必要設置assets,沒半毛錢作用。

問題四 這個就是很蠢的一個問題了,很粗心。關於dependencies和devDependencies,其實單純問兩者的區別,大家都知道,一個是開發依賴,一個是線上依賴。但是我們實際開發中,不管是你開發依賴還是線上依賴,其實所有的包都會安裝,所以有的時候裝錯地方,也沒啥的。but。。。如果你開發的是第三方包,這個問題就大了。。。如果是第三方包,只會安裝第三方包的dependencies。因爲一開始的開發不規範,導致我隨意亂裝。。結果查了半天,一直報XXX包找不到。。搗鼓了很久,才發現是個這麼簡單的問題。

問題五 關於npm publishi的時候如果報權限或者什麼其他問題的錯,十有八九是 設定了源的路徑,如果是淘寶源或者公司源,需要切換回npm默認源,纔可以發佈。

問題暫時就想到這麼多了。其實腳手架最簡單的反而是webpack配置了,這些東西一搜索網上一大把,配置消息我就不多說了。說幾個值得注意的地方。。第一就是splitChunks,這個設置拆包大小的時候記得注意單位,30000這個是30kb。所以我寫的是100000,意味着要拆成獨立的包,壓縮前必須有100KB,其實還可以設置大一點,你想想100KB壓縮後估計就50,再來個GZIP就是20KB左右了。一個包可以再大點。
但如果是http2,也可以不用拆太大,畢竟多路複用嗎。 第二就是關於靜態資源引用的問題,其實我覺得本地業務代碼裏面完全不用引入靜態資源,通通丟到雲服務器就好,比如靜態圖片,我都是通通扔到七牛服務器,代碼裏面直接寫死,爽歪歪,還能享受CDN加成和http2.

clipboard.png

react+router+redux

說的有點亂,想到啥寫啥。主要是事件間隔有點久了,最近加班太忙。

腳手架已經實現了三分之一,現在是直接clone git來作爲腳手架,到最後效果應該是npx的形式,不過命令內容已經實現 easy-react start和 easy-react build。
代碼已經更新到git了,方便給個star。 easy-react即命令的實現源碼還沒扔上去,等後續完工了再扔上去。畢竟還有服務器端的部分沒實現。

腳手架工具很多,我覺得有時間還是自己維護一份的好,想咋玩就咋玩,想升級就升級,自己定製。

git init
git clone https://github.com/417673259/...
npm install
npm run start

有問題就留言,必定回覆,給個讚唄

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章