vue3-express最小化项目实战
一、配置后端
- 创建express-vue-login项目
mkdir express-vue-login
- 进入express-vue-login 项目
cd express-vue-login
- 创建服务端server目录
mkdir server
cd server
- 初始化项目
npm init -y
- 安装依赖
npm install express cors
- 配置文件
nano server.js
内容如下
// server.js
const express = require('express');
const cors = require('cors');
const app = express();
const port = 5000;
// 使用 express 内置的 json 解析中间件
app.use(cors());
app.use(express.json()); // 代替 body-parser.json()
// 模拟用户数据
const users = [
{ username: 'test', password: 'password123' }
];
// 登录接口
app.post('/login', (req, res) => {
try {
const { username, password } = req.body;
const user = users.find(u => u.username === username && u.password === password);
if (user) {
res.json({ message: '登录成功', success: true });
} else {
res.status(401).json({ message: '用户名或密码错误', success: false });
}
} catch (err) {
res.status(500).json({ message: '服务器错误', success: false });
}
});
app.listen(port, () => {
console.log(`服务器正在运行在 http://localhost:${port}`);
});
二、配置前端
- 安装vue
cd /express-vue-login
npm install -g @vue/cli
- 创建vue项目
vue create client
- 进入vue项目
cd client
- 安装依赖
npm install axios
- 配置文件
nano src/components/HelloWorld.vue
内容如下
<template>
<div>
<h1>登录</h1>
<form @submit.prevent="login">
<div>
<label for="username">用户名:</label>
<input v-model="username" id="username" type="text" required />
</div>
<div>
<label for="password">密码:</label>
<input v-model="password" id="password" type="password" required />
</div>
<button type="submit">登录</button>
</form>
<p v-if="message">{{ message }}</p>
</div>
</template>
<script>
import axios from 'axios';
export default {
data() {
return {
username: '',
password: '',
message: '',
apiBaseUrl: ''
};
},
created() {
// 自动获取当前页面的域名或IP
this.apiBaseUrl = `http://${window.location.hostname}:5000`;
},
methods: {
async login() {
try {
const response = await axios.post(`${this.apiBaseUrl}/login`, {
username: this.username,
password: this.password
});
if (response.data.success) {
this.message = '登录成功!';
}
} catch (error) {
this.message = error.response?.data?.message || '登录失败';
}
}
}
};
</script>
三、启动项目
- 启动后端
cd express-vue-login/server/
node server.js
- 启动前端
cd express-vue-login/client/
npm run serve
浏览器访问http://ip:8080
账户:test
密码:password123
四、打包项目
- 打包后端
删除node_modules模块目录,保留必要文件
cp -r server dist_server
tar -czvf dist_server.tar.gz dist_server
- 打包前端
dist目录会生成所有的静态文件,可以使用nginx部署
cd express-vue-login/client/
npm run build
tar -czvf dist.tar.gz dist
五、生产环境部署项目
- 部署后端
tar -xzvf dist_server.tar.gz
cd dist_server
npm install --production
- 使用pm2部署后端
#安装pm2
npm install pm2 -g
#启动后端
pm2 start server.js
#配置开机自启
pm2 startup
#保存当前进程列表
pm2 save
- 部署前端
tar -xzvf dist.tar.gz
cp -r dist /
- 使用nginx部署前端
这里把访问端口改为了8000,区别开发环境8080端口
apt install nginx -y
nano /etc/nginx/nginx.conf
内容如下
worker_processes auto;
events {
worker_connections 1024;
}
http {
server {
listen 8000;
# 设置 server_name,绑定域名或 IP 地址
server_name example.com; # 你可以用实际的域名,或者直接使用 localhost 或 IP 地址
# 设置根目录
root /dist; # 这里指向你打包后的 dist 目录
# 默认的首页
index index.html;
# 配置 Vue 3 路由的处理(解决刷新时 404 问题)
location / {
try_files $uri $uri/ /index.html;
}
}
error_log /var/log/nginx/error.log debug;
}
- 检查nginx配置
nginx -t
- 配置nginx服务
systemctl enable nginx
systemctl restart nginx
浏览器访问http://ip:8000