Sails.js使用扩展运算符(...)出现Unexpected Token错误求助
嘿,作为Node.js新手碰到这种ES特性兼容问题太正常啦!我之前用Sails.js的时候也踩过这个坑,给你一步步讲清楚怎么解决,包括本地配置Babel和CircleCI的部署步骤,保证你能看懂~
为什么会报错?
对象扩展运算符(...a这种写法)其实是ES2018的特性,而Sails.js默认的Node.js运行环境可能没开启对这个特性的支持,或者你用的Node版本低于8.3.0(这个版本才原生支持对象扩展)。所以我们需要用Babel来转译这部分代码,让它能在现有环境下运行。
第一步:本地配置Babel(新手友好版)
1. 安装Babel相关依赖
打开终端,进入你的Sails项目根目录,运行下面的命令:
npm install --save-dev @babel/core @babel/cli @babel/preset-env @babel/node npm install @babel/polyfill
给你简单解释下每个包的作用:
@babel/core:Babel的核心编译工具@babel/cli:让你在终端里用Babel命令转译代码@babel/preset-env:自动根据你的目标Node版本转译需要的ES特性,不用手动指定版本@babel/node:让Node.js用Babel来执行代码,启动Sails的时候会自动转译@babel/polyfill:补全Node环境缺失的ES API,避免运行时报错
2. 创建Babel配置文件
在项目根目录新建一个名为.babelrc的文件,把下面的内容复制进去:
{ "presets": [ ["@babel/preset-env", { "targets": { "node": "current" } }] ] }
这个配置告诉Babel:根据我当前使用的Node版本,自动转译所有不支持的ES特性。
3. 修改项目启动脚本
打开项目根目录的package.json文件,找到scripts部分,把原来的启动命令(一般是"start": "sails lift")改成下面这样:
"scripts": { "start": "babel-node node_modules/sails/bin/sails.js lift", "build": "babel api config --out-dir dist" }
start命令:用babel-node来启动Sails,这样所有代码都会先经过Babel转译,扩展运算符就不会报错了build命令:把api和config目录下的代码转译后放到dist目录,方便后续部署用
4. 测试效果
现在在终端运行npm start启动Sails,然后测试你的扩展运算符代码:
const a = {test: 'test'}; const b = { something: 'something', ...a }; console.log(b); // 应该输出 { something: 'something', test: 'test' }
如果没有报错,说明配置成功啦!
第二步:配置CircleCI添加Babel构建步骤
假设你已经把项目连接到CircleCI了(如果还没,先登录CircleCI官网,关联你的GitHub/GitLab仓库就行),接下来我们修改CircleCI的配置文件:
1. 创建CircleCI配置文件
在项目根目录新建.circleci文件夹,然后在里面创建config.yml文件,把下面的内容复制进去:
version: 2.1 jobs: build-and-deploy: docker: - image: circleci/node:14 # 选一个和你本地一致的Node版本,比如14.x steps: - checkout # 拉取仓库里的代码 - restore_cache: # 缓存node_modules,加快下次构建速度 keys: - v1-dependencies-{{ checksum "package.json" }} - v1-dependencies- - run: name: 安装项目依赖 command: npm install - save_cache: paths: - node_modules key: v1-dependencies-{{ checksum "package.json" }} - run: name: 用Babel转译代码 command: npm run build # 对应package.json里的build命令 - run: name: 部署到服务器(根据你的部署方式修改) command: | # 举个例子:如果用SSH部署到VPS # scp -r dist/ your-username@your-server-ip:/path/to/your/sails/project # ssh your-username@your-server-ip "cd /path/to/your/sails/project && pm2 restart app"
2. 配置说明
docker:指定CircleCI用的Node镜像,版本最好和你本地开发一致,避免兼容问题restore_cache和save_cache:缓存依赖包,不用每次构建都重新安装,节省时间npm run build:执行我们之前配置的Babel转译命令,生成可部署的代码- 最后一步的部署命令:根据你的实际部署方式修改,比如用Heroku的话可以改成
git push heroku main,用AWS的话可以用AWS CLI上传文件
3. 测试CircleCI构建
把修改后的代码推送到GitHub/GitLab,然后登录CircleCI查看构建状态。如果构建成功,说明Babel的构建步骤已经生效啦!
内容的提问来源于stack exchange,提问作者aiiwa

