React使用serve -s启动服务失败,提示SyntaxError: Unexpected token '.' 问题解决

45 阅读1分钟

问题

在React项目中,使用npm run build命令编译后,尝试通过serve -s build启动服务。
但是在执行了serve -s build后有如下报错:

root@xxx:/opt/apps/demo/website# serve build
file:///usr/local/lib/node_modules/serve/build/main.js:169
      const ipAddress = request.socket.remoteAddress?.replace("::ffff:", "") ?? "unknown";
                                                     ^

SyntaxError: Unexpected token '.'
    at Loader.moduleStrategy (internal/modules/esm/translators.js:133:18)
    at async link (internal/modules/esm/module_job.js:42:21)

分析

查看报错信息中指示的代码:

const ipAddress = request.socket.remoteAddress?.replace("::ffff:", "") ?? "unknown";

可以看到使用了可选链运算符(?.)和 空值合并运算符(??
?.允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效。?. 运算符的功能类似于 . 链式运算符,不同之处在于,在引用为空(null或者 undefined) 的情况下不会引起错误,该表达式短路返回值是 undefined。与函数调用一起使用时,如果给定的函数不存在,则返回 undefined。
??是一个逻辑运算符,当左侧的操作数为null或者undefined时,返回其右侧操作数,否则返回左侧操作数。

这两个运算符都是node 14.0新增的。

查看当前的node版本:

node -v
# v12.22.9

发现是因为node版本较低所以不支持。

解决

可以通过升级node版本解决:

npm install -g n # 安装n工具 
n stable # 升级到最新稳定版 

# 执行完毕后新开一个终端 
node -v 
# 查看当前版本,此时已经升级到最新的稳定版
# v20.13.1

之后重新执行serve -s build,可以正常启动。