如何使用TypeScript与PM2解决experimentalDecorators警告问题
问题根因
你本地是预先执行tsc命令读取tsconfig.json配置完成编译后再运行代码,而当前PM2配置直接执行.ts源文件,没有走tsc编译流程,运行时没有读取到装饰器相关配置,因此抛出特性不支持的错误。
解决方案
方案1:预编译后运行(推荐,全环境适用)
先执行tsc把TS代码编译为JS,再用PM2运行编译后的产物,性能更高,也不会出现配置不匹配的问题。
- 先修改
tsconfig.json的include配置,把根目录的index.ts纳入编译范围:
{ // 其余配置保持不变 "include": ["src", "index.ts"] }
- 在
package.json中添加执行脚本:
{ "scripts": { "build": "tsc", "start:dev": "npm run build && pm2 start ecosystem.config.js", "start:prod": "npm run build && pm2 start ecosystem.config.js --env production" } }
- 修改
ecosystem.config.js的入口文件指向编译后的产物:
module.exports = { apps : [{ name: "app", // 指向tsc编译后的JS入口文件 script: './dist/index.js', autorestart: true, exec_mode: "fork", // 生产环境建议关闭文件监听 watch: process.env.NODE_ENV === 'development', env: { NODE_ENV: 'development', }, env_production: { NODE_ENV: 'production', }, }], };
方案2:直接运行TS文件(仅适合开发环境)
如果需要开发阶段热更不用手动编译,可以给PM2配置ts-node作为解释器,运行时自动读取tsconfig.json配置。
- 先在服务器安装必要依赖:
npm install ts-node typescript --save-dev
- 修改
ecosystem.config.js配置解释器参数:
module.exports = { apps : [{ name: "app", script: './index.ts', // 指定ts-node作为解释器 interpreter: 'node_modules/.bin/ts-node', // 指定读取当前目录的tsconfig.json配置 interpreter_args: '--project tsconfig.json', autorestart: true, exec_mode: "fork", watch: true, env: { NODE_ENV: 'development', }, }], };
注意事项
- 部署时确认服务器上的
tsconfig.json文件和本地一致,没有被.gitignore规则过滤 - 生产环境优先使用方案1,ts-node运行TS会有额外的编译开销,性能远低于直接运行编译后的JS文件
内容的提问来源于stack exchange,提问作者Webplam Web
相关产品推荐
相关产品推荐

