Node应用开发部署指南这是一份简单的node项目开发部署指南,可以满足一些node服务的敏捷开发以及快速上线。通常我们
开发
这是一份简单的node项目开发部署指南,可以满足一些node服务的敏捷开发以及快速上线
项目分类
通常我们可以将可部署的项目分为两类:
- node server
- node 定时任务
server
类任务可以基于koa、express、nest等进行开发部署;
定时任务
可以基于node-schedule等进行开发部署,比如定时发送邮件通知等。
你可以根据需要,选择对应的应用进行开发。
项目初始化
通过npm init
初始化你的项目,配置好package.json
:
{
"name": "node-demo",
"version": "1.0.0",
"description": "一个node模版项目",
"license": "ISC"
}
项目目录结构
node-demo
├── dist
├── src
| └── index.js
├── test
├── .gitignore
├── package-lock.json
├── package.json
└── README.md
其中:
dist
:构建输出目录,用于部署src
:源码目录,存放源代码test
:测试目录,对源码进行单元测试README.md
:项目说明书,用于介绍项目的功能、如何调试等.gitignore
:git忽略文件
项目调试
nodemon
Nodemon 是一个用于开发 Node.js 应用程序的实用工具。它会监视你在 Node.js 应用程序中的文件变化,并在检测到变化时自动重启应用程序。这在开发过程中非常有用,因为你不必手动停止和重新启动服务器,nodemon 会在你保存文件后立即重新启动应用,从而加快开发速度。
安装
npm install nodemon -D
调试
在npm script
中添加nodemon
调试指令:
"scripts": {
"serve": "nodemon ./src/index.js"
}
在src/index.js
中添加测试代码:
console.log('hello world!')
启动项目:
npm run serve
此时我们更改代码并保存就能在控制台实时输出
构建
我们可以选择rollup
或者webpack
对项目进行打包构建,二者皆可满足需求,也都能对代码进行tree shaking;
但我更倾向于使用rollup进行构建,因为他的配置非常简单,非常适合中小型node项目的构建;而对于构建复杂的大型应用程序,特别是单页应用(SPA),webpack则更为合适。
rollup
依赖安装
npm install rollup @rollup/plugin-json @rollup/plugin-node-resolve @rollup/plugin-commonjs -D
rollup.config.js
在项目根目录下添加rollup.config.js
const path = require('path')
// 将json 文件转换为ES6 模块
const json = require('@rollup/plugin-json')
// 在node_模块中查找并绑定第三方依赖项(将第三方依赖打进包里)
const resolve = require('@rollup/plugin-node-resolve')
// 将CommonJS模块转换为ES6
const commonjs = require('@rollup/plugin-commonjs')
const generateConfig = (input, output, plugins = []) => {
return {
input,
output,
plugins: [
resolve(), //快速查找外部模块
commonjs(), //将CommonJS转换为ES6模块
json() //将json转换为ES6模块
]
}
}
const configList = [
generateConfig(path.resolve('./src/index.js'), [
{
file: './dist/index.js',
format: 'cjs',
sourcemap: false
}
])
]
module.exports = configList
添加构建指令
"scripts": {
"serve": "nodemon ./src/index.js",
"build": "rollup -c"
}
然后执行npm run build
即可在dist
目录下生成index.js
文件,我们可以运行以下命令对构建产物进行测试
node ./dist/index.js
webpack
依赖安装
npm install webpack@^4 webpack-cli@^4 webpack-node-externals -D
webpack.config.js
在项目根目录下添加webpack.config.js
配置文件
const path = require('path')
const nodeExternals = require('webpack-node-externals')
module.exports = {
target: 'node', // 设置打包目标为 Node.js
mode: 'production',
entry: './src/index.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'index.js',
},
externals: [nodeExternals()], // 排除 Node.js 内建模块和 npm 依赖
optimization: {
minimize: false
},
// stats: {
// warningsFilter: [/some warnings filter/] // 过滤掉某些警告
// }
}
添加构建指令
"scripts": {
"serve": "nodemon ./src/index.js",
"build": "rollup -c",
"build:webpack": "webpack"
}
然后执行npm run build:webpack
即可在dist
目录下生成index.js
文件,我们可以运行以下命令对构建产物进行测试
node ./dist/index.js
部署
前提:你有一台可以使用的远程服务器
@weilinerl/deploy-helper
这个是我开发的一个简易代码构建部署工具,可以将本地代码进行:打包、上传、部署
仓库地址:deploy-helper
安装
npm install @weilinerl/deploy-helper -D
.deploy.config.js
在项目根目录下配置.deploy.config.js文件(也可以是json文件,即.deploy.config.json)
module.exports = {
host: 'your server ip', // 替换成你的服务器ip地址
port: 22,
localPath: './dist',
remotePath: '/node-demo', // 替换成你想在服务器存放的地址,需要你提前把这个目录建好
shellScripts: 'node ./dist/index.js',
readyTimeout: 20000
}
在配置里把host
替换成你的服务器公网ip地址
,并提前在服务器上建好应用放置目录,比如上面放到了服务器根目录下的node-demo目录中。
上面的shellScripts
会在项目完成上传后自动执行,因此你的服务器还需具备对应的环境,比如上面的node ./lib/index.js
需要基于node
环境运行
添加部署指令
"scripts": {
"serve": "nodemon ./src/index.js",
"build": "rollup -c",
"build:webpack": "webpack",
"deploy": "npm run build && deploy-app"
}
部署
运行以下命令完成部署:(将服务器的用户名和密码通过命令行参数传递)
npm run deploy -- --username=${服务器用户名} --password=${服务器密码}
pm2
M2 是一个用于 Node.js 应用程序的流行生产过程管理工具,它可以让你的应用程序保持永久运行,无需停机即可重新加载,并有效管理日志。以下是 PM2 的一些关键特性和常用命令:
关键特性:
- 进程管理: 轻松启动、停止、重启和删除应用程序。
- 负载均衡: PM2 可以管理多个 Node.js 应用实例,实现负载均衡。
- 日志管理: 自动记录应用程序的输出日志,并提供查看、归档和清理功能。
- 进程监控: 实时监控应用程序的运行状态,并自动重启出现故障的进程。
- 集群模式: 可以让应用程序在多核 CPU 上运行多个实例,提高性能。
具体用法见:pm2
我们可以通过pm2来运行我们的node应用,从而实现负载均衡和自动重启,保证其可靠运行,因此我们需要经过两步:
- 在服务器上通过
npm install pm2 -g
安装pm2到全局 - 更改上面配置文件中的
shellScripts
为:
shellScripts: 'pm2 delete nodeDemoServer ; pm2 start --name nodeDemoServer ./lib/index.js',
重新执行上面的deploy
命令,就会在控制台输出pm2启动的相关信息:
我们也可以登陆服务器使用pm2 list
、pm2 log
等查询pm2的运行状态与日志信息
可选
接入ts
monorepo
有时我们的项目需要使用monorepo
来管理,以便同时部署多个功能隔离的服务,或者有workspace
的概念;那么都2024年了,我在这儿是比较推荐使用pnpm workspace来实现此功能的。
pnpm-workspace.yaml
将node版本切换到16以上,在项目根目录添加pnpm-workspace.yaml
配置文件:
packages:
- 'packages/*'
删除package-lock.json
,将目录更改为:
node-demo
├── README.md
├── dist
| └── index.js
├── lib.zip
├── package.json
├── packages
| ├── project-a
| | ├── package.json
| | ├── rollup.config.js
| | ├── src
| | | └── index.js
| | └── webpack.config.js
| └── shared
| ├── package.json
| └── src
| └── index.js
├── pnpm-workspace.yaml
└── test
然后执行:
pnpm install
更改根目录的npm script
为:
"scripts": {
"serve": "pnpm -r --filter '!node-demo-shared' run serve",
"build": "pnpm -r --filter '!node-demo-shared' run build",
"build:webpack": "pnpm -r --filter '!node-demo-shared' run build:webpack",
"deploy": "pnpm -r --filter '!node-demo-shared' run deploy"
}
其中node-demo-shared
为shared目录下的package.json
的name
,因为这部分代码作为公共方法等,提供给其他项目使用,因此不必参与构建或部署,由其他项目引入这部分代码进行构建部署。
然后对于packages
下的各目录,按照单npm包的方式开发即可。
转载自:https://juejin.cn/post/7403151883135860763