问题描述
在本地环境是没有这个问题的,但是到测试环境构建的话就出现这个问题了。
> XXX@1.0.0 build:stag_gg
> cross-env MODE=staging_gg next build
/mnt/www/ttmall_front_next/node_modules/next/dist/build/index.js:347
...pageKeys.app ?? [],
^
SyntaxError: Unexpected token '?'
at wrapSafe (internal/modules/cjs/loader.js:915:16)
at Module._compile (internal/modules/cjs/loader.js:963:27)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10)
at Module.load (internal/modules/cjs/loader.js:863:32)
at Function.Module._load (internal/modules/cjs/loader.js:708:14)
at Module.require (internal/modules/cjs/loader.js:887:19)
at require (internal/modules/cjs/helpers.js:74:18)
at Object.<anonymous> (/mnt/www/ttmall_front_next/node_modules/next/dist/cli/next-build.js:10:37)
at Module._compile (internal/modules/cjs/loader.js:999:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10)
[PM2] Applying action deleteProcessId on app [ttmall_front_next](ids: [ 0 ])
[PM2] [ttmall_front_next](0) ✓问题出现的环境背景及自己尝试过哪些方法
查了一下,双问号的语法是nodejs12以后的版本支持的,理论上只要将Nodejs的版本升到12以上应该就不会出现这个问题。
+ node -v
v16.13.2
SSH: Failed to get hostname [XXX: XXX: Name or service not known]
SSH: Connecting with configuration [XXX] ...
SSH: EXEC: STDOUT/STDERR from command [cd /mnt/www/ttmall_front_next
tar -zxf tmp.tar.gz
#nvm ls
#nvm use v14.10.0
nvm use v16.13.2
node -v
npm -v
npm install --registry=https://registry.npm.taobao.org
#npm install node-sass --unsafe-perm=true --allow-root
#npm run build:stag
npm run build:stag_gg
#npm run build:stag_gg2
chown -R www.www /mnt/www/ttmall_front_next
/usr/local/bin/pm2 delete ttmall_front_next
/usr/local/bin/pm2 start npm --name ttmall_front_next --error log/error.log --output log/output.log -- run start_stag_gg
] ...
Now using node v16.13.2 (npm v8.1.2)
v16.13.2
8.1.2我也看了服务器的node版本是v16.13.2,按理说不应该出现这样的问题。
我也尝试过在package.json里面固定了nodejs的版本,但是依然还是不管用
补充信息:
继续尝试了一下 使用v14.10.0的版本构建是没有问题的是正常的。
但是使用v16.13.2 和 v17.0.0 都会出现同样的报错
也尝试了使用v18.0.0 但是因为服务器缺少很多必须的文件所以没有安装成功,就没有继续尝试了
你的理解不太对。
??运算符在你的 node 环境里是支持的,这个不假;但是负责转译的程序并非 node,而是开发环境里的 babel 或者 swc 或者什么。所以它不认得这个运算符,就会报错。本地环境是你自己的,一般来说比较灵活和新。测试环境可能是一套固定环境,并不会执行
npm i安装依赖,所以不支持。你可以问问负责测试环境的同学,升级一下环境,或者每次构建都重新安装依赖。(其实也不难,只要有外网环境,换用 pnpm,很快。)