最近項目由react0.14.X升級到react 15版本,因為react15還是做了一些相對大一點的更新的(詳情可以參考一下我的另一篇文章關於react15的一點總結),相對;來說react升級之后但react問題並不太多。但是react相應的配置,例如babel,react-hot-loader等相也做了一些升級。放到一起來說問題還是多一點的。這里把遇到的一些問題和注意點拿出來給大家分享一下,能避免的坑還是要盡量繞開的不是。
一、首先react15的包分成了react和react-dom兩部分分別打包,所以用到react-dom的地方,導入的位置就要換掉了。如下面圖示:
二、react,babel是環環相扣的。升級了react之后升級babel是在所難免的過程了,
注意升級的順序,babel->babel-*其他相關項->babel-core。原有相關依賴項不先行升級的話對babel-core的是有版本要求的,會導致升級失敗。
三、升級babel之后,原有babel5的寫法已經被廢棄,所以會報錯:
ReferenceError: [BABEL] XXXX.jsx: Unknown option: stage(或loose)
babel6只支持presets和plugins兩個屬性了。babel 最新版本babel6的相關配置解析可以看下這篇文章。此外,如果少引用了某個插件。會有類似下面的報錯:
Module build failed: SyntaxError: index.js: Unexpected token
四、
如果你用到了react-hot-loader實現熱加載的話,會遇見下面的錯誤:
Cannot resolve module 'react/lib/ReactMount'
switch to react-hot-loader 3.x!
剛才提到的相應配置也要升級,這是比較麻煩的一點。所以react-hot-loader要升級到3.X,不過我發現npm上最新的版本竟然也是beta版,希望不會有其他變動。
五、僅僅是把react-hot-loader升級到3.X還不算完,升級完之后react-hot-loader的用法也要有相應改變。此時會有下面的錯誤:
不能像原來一樣在webpack中直接加載react-hot-loader:
需要從webpack中移除react-hot loader。.barbelrc中增加plugins屬性:react-hot-loader/babel。此處問題比較多,大致應該裝以下預設和插件(babel 最新版本babel6的相關配置解析可以看下這篇文章,更好理解):
六、上面說到的相關配置還有一個,如果你用到react-router的話。同樣需要升級到3.X版本,如果是1.X的版本的寫法也需要做些改變,當遇到下面的錯誤時:
根據hash匹配的路由,不需要自己創建hsitory對象,直接導入react-router 3.X 現有的hashHistory對象即可。
七、react15官方文檔中提到,增加了比較人性化的報警和錯誤信息。但是個人認為有點矯枉過正的感覺,下面的warning是肯定會看到的:
官方解釋:You are using a non-standard DOM attribute, perhaps to represent custom data. Custom data attributes should always have a data- prefix, as described in https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Using_data_attributes
也就是說,如果不是dom元素原生的屬性的話,必須要帶上data-,否則認為是unknown的,就會報警。但是個人認為現在提這個所謂的規范有點為時已晚,因為大型的項目都已經比較成熟了,如果為了這個標准再去修改相應的內容,大部分人應該是不情願的,有種矯枉過正的感覺。考慮到大家的反饋,react開發小組的成員已經妥協了,未來的版本會去掉這種校驗。In future versions of React we plan to pass such props “through” without the whitelist。
八,建議避免bind來綁定this,可以用箭頭函數來替換。不然babel轉譯的時候會有報錯的情況。
以上就是本次項目升級過程中暫時碰到一些問題,做個總結為后面的同學做個參考。對於還沒有升級的項目,個人建議暫時不要升級了,畢竟有些配置還是非穩定版本,等穩定了再動。這次升級我只是在備用分支上做了操作,目前來看還是比較明智的。在升級的過程中有好多問題,搜索引擎是不給力的,還是需要自己摸索的,所以感覺有必要總結一下給后來者一個參考,共同學習提高。