TypeScript ESM项目生产部署遇问题,寻求最优高性能解决方案
针对ES模块TypeScript项目的生产部署方案
一、修复PM2部署(适配现有尝试)
PM2对ES模块的支持需要明确配置,之前的问题大概率是未适配ES模块加载规则:
- 先完成项目构建:执行
npm run build,确认dist(或你的构建输出目录)下存在编译后的ES模块文件。 - 在
dist目录中添加package.json,内容为{"type": "module"}——Node会读取当前目录的package.json来判断模块类型,可在build脚本中加入自动生成命令:echo '{"type": "module"}' > dist/package.json。 - 创建PM2配置文件
ecosystem.config.js:
module.exports = { apps: [ { name: "your-project", script: "./dist/index.js", interpreter: "node", env: { NODE_ENV: "production" }, instances: "max", // 启用集群模式,最大化利用多核CPU exec_mode: "cluster", watch: false, // 生产环境禁用文件监听 autorestart: true, max_memory_restart: "1G" // 内存阈值触发自动重启 } ] };
- 启动服务:
pm2 start ecosystem.config.js
二、Node原生运行 + Systemd托管(轻量高性能)
如果追求低资源占用和系统级稳定性,用Node配合Systemd是更轻量的选择:
- 完成构建后,确保
dist目录有{"type": "module"}的package.json。 - 创建Systemd服务文件
/etc/systemd/system/your-project.service:
[Unit] Description=Your Project Production Service After=network.target [Service] Type=simple User=www-data # 使用非root用户运行,提升安全性 WorkingDirectory=/path/to/your/project/dist ExecStart=/usr/bin/node index.js Environment=NODE_ENV=production Restart=always RestartSec=5 MemoryLimit=1G [Install] WantedBy=multi-user.target
- 执行以下命令完成配置:
sudo systemctl daemon-reload sudo systemctl enable your-project sudo systemctl start your-project - 查看运行日志:
sudo journalctl -u your-project -f
三、Docker容器化部署(标准化与可扩展性)
需要多环境兼容、水平扩展或持续部署时,Docker是最优方案:
- 项目根目录创建
Dockerfile:
FROM node:20-alpine WORKDIR /app COPY package*.json ./ RUN npm ci --only=production COPY dist/ ./dist/ COPY dist/package.json ./dist/ EXPOSE 3000 # 替换为你的项目端口 CMD ["node", "dist/index.js"]
- 创建
.dockerignore文件:
node_modules/ dist/ .git/ .env.development
- 构建并运行容器:
后续可配合Docker Compose或Kubernetes实现集群负载,进一步提升服务性能。docker build -t your-project:latest . docker run -d --name your-project -p 3000:3000 -e NODE_ENV=production your-project:latest
四、通用性能优化措施
无论选择哪种部署方案,以下操作可显著提升生产环境性能:
- 强制启用多核利用:PM2集群模式、Node原生
cluster模块,或Docker多实例+负载均衡 - 优化TypeScript构建:tsconfig中设置
target: "ES2020"+moduleResolution: "node16",使用esbuild/tsup等极速构建工具并开启代码压缩 - 静态资源分离:将静态文件托管到CDN或Nginx,减轻Node服务压力
- 启用压缩:通过Nginx反向代理实现gzip/brotli压缩,或Node中间件(如
compression)处理请求压缩
内容的提问来源于stack exchange,提问作者silli0x
相关产品推荐
相关产品推荐

