React Native babel編譯異常問題

熊建剛發表於2019-03-01

最近以React Native技術開發App應用,搭建專案時遇到坑頗多,網上查詢解決方法費時,費精力,總結一些問題,希望能對讀者有所幫助。

我的個人部落格

這次遇見的問題是babel編譯ES6原始碼時,丟擲的異常,導致無法啟動專案,執行react-native run-ios,啟動模擬器後報錯:

RN bundling error babel

可以看到,有用的資訊:Error bundling Cannot find module @babel/core,而使用react-native-cli建立的React Native App應用使用的是babel預設方案:babel-preset-react-native,這是它的最新版本的一個bug,我們可以將其版本退回至2.1.0,首先刪除它(使用yarn或npm進行安裝包管理皆可):

yarn remove babel-preset-react-native
or
npm unstall babel-preset-react-native
複製程式碼

然後安裝指定版本:

yarn add --dev babel-preset-react-native@2.1.0
or
npm install --save-dev babel-preset-react-native@2.1.0
複製程式碼

最後,再次啟動應用:

react-native run-ios
or 
react-native run-android
複製程式碼

應用正常執行。

React Native 版本問題

當然也許你還會遇到一個異常:

No Bundle Url Present

這個問題是由於最新React Native版本,需要Xcode版本大於9,Mac OS大於11,所以可以將React Native版本將至0.53.3

react-native init myApp --version 0.53.3
複製程式碼

Babel preset版本問題

前面對於babel編譯問題,指出將版本回降至2.1.0,正常是沒有問題的,但是如果使用了ES6新語法generator時,需要注意,下面這種export匯出寫法,將會報錯:

export default function * root () {
  yield ...
}
複製程式碼
Babel preset error

需要改成如下匯出方式,先賦值再匯出:

const root = function * root () {
  yield ...
}
export default root;
複製程式碼

當然,如果不希望修改程式碼,則需要將babel-preset-react-native版本降至2.0.0:

rm -rf ./node_modules
yarn cache clean or npm cache clean
yarn add --dev babel-preset-react-native@2.0.0
yarn install
watchman watch-del-all // 如果使用了watchman
複製程式碼

然後殺掉上次應用啟動的程式,重新啟動應用,即可正常編譯,執行:

react-native run-ios
複製程式碼

可以參考How to clear the react native packager

相關文章