Expo运行NodeJS版本异常致async函数语法错误
听起来你遇到的问题挺让人头疼的——明明已经把Node版本升到了8.4.0(满足async/await的最低要求),但在Expo里调用_signInWithGoogleAsync()还是报语法错误。我之前帮朋友排查过类似的问题,大概率不是系统Node版本的锅,而是Expo自身的打包环境或者配置有问题,给你几个具体的排查方向:
1. 先检查你的async函数定义是否正确
有时候语法错误真的是因为函数写得不对,比如async关键字的位置错了。你可以对照下面的正确写法检查:
// 函数声明式的正确写法 async function _signInWithGoogleAsync() { // 这里写你的登录逻辑 try { const result = await GoogleSignIn.signInAsync(); // 处理登录结果 } catch (error) { // 处理错误 } } // 箭头函数的正确写法 const _signInWithGoogleAsync = async () => { // 同样的逻辑 };
确认一下你有没有把async放在函数声明的最前面,有没有拼写错误(比如写成asyn或者少了字母)。
2. 检查Expo实际使用的Node版本
虽然你系统的Node是8.4.0,但Expo CLI或者Expo的打包环境可能在使用另一个版本的Node。你可以运行这个命令查看Expo的诊断信息:
expo diagnostics
在输出里找到Node.js那一行,看看它显示的版本是不是和你终端运行node -v得到的一致。如果不一致,说明Expo在使用一个旧版本的Node,这时候你可以尝试:
- 重新安装Expo CLI:
npm install -g expo-cli - 检查你的环境变量,确保系统的Node路径在最前面,避免Expo调用到旧版本
3. 确认Babel配置正确
Expo依赖Babel来转译代码,如果Babel预设没有正确支持async/await,也会报语法错误。检查你的项目根目录下的babel.config.js,确保它用了Expo的官方预设:
module.exports = function(api) { api.cache(true); return { presets: ['babel-preset-expo'], }; };
如果你自定义了Babel配置,一定要确保包含支持async/await的插件,不过一般用Expo的预设就足够覆盖需求了。
4. 清除Expo的缓存试试
有时候旧的编译缓存会导致奇怪的语法错误,这时候清除缓存就能解决问题。运行这个命令重启项目并清除缓存:
expo r -c
或者完整写法:
expo start --clear
按照这几个步骤排查下来,应该能解决你的问题。如果还是不行,可以把expo diagnostics的输出和你的函数代码片段贴出来,方便进一步排查。
内容的提问来源于stack exchange,提问作者Curtis Chong

