Ubuntu 20.04启动Node.js v10.19.0服务报=符号语法错误
问题根因
该报错和符号书写错误、nano编辑器操作、Git配置均无关系,核心原因是服务器上运行的Node.js v10.19.0版本不支持类静态字段赋值语法。
你代码中static websiteRegex = /xxx/这种在类体内部直接给静态属性赋值的写法,是ES2022正式纳入标准的语法特性,Node.js 10.x版本的语法解析器完全不识别该结构,解析到赋值用的=时就会抛出Unexpected token =错误,和你贴出的报错栈完全匹配。
补充说明:你本地Windows开发环境大概率实际运行的Node版本高于10.x,或是使用了babel等转译工具处理过源码,所以本地运行不会触发该问题;而Ubuntu 20.04默认apt软件源提供的Node.js版本恰好就是v10.19.0,直接安装运行未转译的源码就会触发报错。
解决方案
二选一即可:
- 方案1(推荐):升级服务器Node.js到LTS版本
类静态字段语法在Node.js 16.0.0及以上版本默认开启支持,且和你项目用到的puppeteer依赖兼容性更好。操作时先卸载系统原有旧版Node.js,安装16/18/20任意一个长期支持版本即可,安装完成后执行node -v确认版本符合要求,重新安装项目依赖后启动服务即可恢复正常。 - 方案2:不升级Node,修改源码为v10兼容写法
把类体内部直接定义的静态属性,移到类定义完成后从外部挂载,Node 10可完全识别该写法,修改示例:
注意如果项目其他代码里还存在类体内部直接写实例属性赋值(比如class ScrapingBot { // 保留类内部所有原有方法逻辑不变 } // 类定义完成后挂载静态属性 ScrapingBot.websiteRegex = /^(https?\:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})(\/[\w\W]*)*$/gm ScrapingBot.phoneRegex = /\+?\d{1,4}?[-.\s]?\(?\d{1,3}?\)?[-.\s]?\d{1,4}[-.\s]?\d{1,4}[-.\s]?\d{1,9}/g; ScrapingBot.addressRegex = /(([a-zA-Z-éÉèÈàÀùÙâÂêÊîÎôÔûÛïÏëËüÜçÇæœ'.]*\s)\d*(\s[a-zA-Z-éÉèÈàÀùÙâÂêÊîÎôÔûÛïÏëËüÜçÇæœ']*)*,)*\d*(\s[a-zA-Z-éÉèÈàÀùÙâÂêÊîÎôÔûÛïÏëËüÜçÇæœ']*)+,\s([\d]{5})\s[a-zA-Z-éÉèÈàÀùÙâÂêÊîÎôÔûÛïÏëËüÜçÇæœ']+/class A { name = 'test' })的写法,也要同步改成兼容写法,否则会触发同类报错。
常见无效操作说明
- 单独替换代码里的
=符号无法解决问题:报错不是符号输入错误,是旧版本解析器不支持对应的语法结构,替换符号只会触发其他语法错误。 - 调整Git配置、更换编辑器不会对该问题产生任何影响:报错发生在Node.js加载编译JS文件阶段,和版本管理工具、文本编辑器没有关联。
内容的提问来源于stack exchange,提问作者Nogaruki
相关产品推荐
相关产品推荐

