问题
在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,可以正常启动。