"明明本地跑得好好的,怎么一上线就各种报错?" 凌晨2点,程序员小李盯着屏幕上那一串串红色错误日志,第5次尝试部署他的Node.js应用到生产环境,这场景你是不是也很熟悉?打包部署就像一场没有彩排的演出,稍有不慎就会在关键时刻掉链子,今天我们就来彻底解决这个痛点,手把手带你走通Node.js项目从打包到部署的全流程,顺便把那些常见的"坑"一个个填平。
首先打开你的package.json,好好检查一下dependencies和devDependencies:
{ "dependencies": { "express": "^4.18.2", "mongoose": "^6.11.3" }, "devDependencies": { "nodemon": "^3.0.1", "eslint": "^8.45.0" } }
黄金法则:生产环境用不到的调试工具、测试库统统扔进devDependencies!执行npm install --production
时它们就不会被打包。
新建个.env
文件:
DB_HOST=localhost
DB_PORT=27017
DB_USER=admin
DB_PASS=your_secure_password
然后在代码中使用dotenv
加载:
require('dotenv').config(); const dbUrl = `mongodb://${process.env.DB_USER}:${process.env.DB_PASS}@${process.env.DB_HOST}:${process.env.DB_PORT}`;
重要提示:记得把.env
加入.gitignore
,否则你的配置就会在GitHub上裸奔!
安装pkg:
npm install -g pkg
在package.json中添加:
"pkg": { "scripts": "build/**/*.js", "assets": "views/**/*", "targets": ["node16-linux-x64", "node16-win-x64"] }
执行打包:
pkg . --out-path=dist
常见问题:
path.join(__dirname, '../views')
绝对路径安装必要依赖:
npm install webpack webpack-cli webpack-node-externals clean-webpack-plugin --save-dev
创建webpack.config.js
:
const path = require('path'); const nodeExternals = require('webpack-node-externals'); const { CleanWebpackPlugin } = require('clean-webpack-plugin'); module.exports = { entry: './src/index.js', output: { filename: 'bundle.js', path: path.resolve(__dirname, 'dist') }, target: 'node', externals: [nodeExternals()], plugins: [new CleanWebpackPlugin()], module: { rules: [ { test: /\.js$/, exclude: /node_modules/, use: { loader: 'babel-loader' } } ] } };
优化技巧:
terser-webpack-plugin
压缩代码webpack-bundle-analyzer
分析包体积file-loader
以Ubuntu为例:
# 安装Node.js curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash - sudo apt-get install -y nodejs # 安装PM2进程管理 sudo npm install -g pm2 # 设置文件权限 sudo chown -R www-data:www-data /var/www/your-project
创建ecosystem.config.js:
module.exports = { apps: [{ name: 'api-server', script: './dist/bundle.js', instances: 'max', autorestart: true, watch: false, max_memory_restart: '1G', env: { NODE_ENV: 'production' } }] };
启动命令:
pm2 start ecosystem.config.js pm2 save pm2 startup
实用命令:
pm2 logs
查看实时日志pm2 monit
监控资源占用pm2 reload all
零停机重启症状:部署几天后服务越来越慢最终崩溃
解决方案:
安装node-memwatch
:
npm install memwatch-next
在代码中添加:
const memwatch = require('memwatch-next'); memwatch.on('leak', (info) => { console.error('内存泄漏 detected:', info); });
使用Chrome DevTools分析内存快照:
node --inspect-brk your-app.js
典型错误:
Error: ENOENT: no such file or directory, open './config.json'
正确做法:
const path = require('path'); const configPath = path.join(__dirname, 'config.json'); fs.readFileSync(configPath);
问题场景:在Windows开发,Linux部署时出问题
解决方案:
path.join()
git config --global core.autocrlf input
if (process.platform === 'win32') { // Windows特定逻辑 }
const cluster = require('cluster'); const os = require('os'); if (cluster.isMaster) { const cpuCount = os.cpus().length; for (let i = 0; i < cpuCount; i++) { cluster.fork(); } } else { require('./server'); }
遇到node-gyp
报错时:
sudo apt install build-essential npm config set python /usr/bin/python3 npm rebuild
添加路由:
app.get('/health', (req, res) => { res.json({ status: 'UP', uptime: process.uptime(), memory: process.memoryUsage() }); });
使用winston:
const winston = require('winston'); const logger = winston.createLogger({ level: 'info', format: winston.format.json(), transports: [ new winston.transports.File({ filename: 'error.log', level: 'error' }), new winston.transports.File({ filename: 'combined.log' }) ] }); if (process.env.NODE_ENV !== 'production') { logger.add(new winston.transports.Console({ format: winston.format.simple() })); }
使用prom-client
暴露指标:
const client = require('prom-client'); const collectDefaultMetrics = client.collectDefaultMetrics; collectDefaultMetrics({ timeout: 5000 }); app.get('/metrics', async (req, res) => { res.set('Content-Type', client.register.contentType); res.end(await client.register.metrics()); });
没有放之四海皆准的完美部署方案,根据你的项目规模选择合适工具,小型项目用pkg快速打包,复杂应用上webpack精细控制,遇到问题时,善用--inspect
调试和日志分析,最后送大家一句真理:能在本地复现的问题都不是问题,祝大家的Node.js应用都能平稳运行!
下次当你再遇到部署问题时,不妨回来看看这篇文章——它就像你的深夜加班咖啡,随时为你提神醒脑。
本文由 僧琼怡 于2025-07-30发表在【云服务器提供商】,文中图片由(僧琼怡)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/480795.html
发表评论