使用Vue开发项目,每次编译后需要手动将dist目录上传到服务器,那有没有更便捷的方法呢?这个问题其实很常见,尤其是在需要频繁部署的时候。常见的解决方案可能包括使用自动化脚本、CI/CD工具,或者利用Git的钩子或平台功能。
方案一:Shell 脚本 + rsync(最快实现)
- 创建
deploy.sh
脚本
# deploy.sh
npm run build && \
rsync -avz --delete -e "ssh -p 22" ./dist/ user@yourserver:/path/to/target
- 在
package.json
中添加部署脚本
// package.json
"scripts": {
"deploy": "sh deploy.sh"
}
- 运行
npm run deploy
即可完成构建部署
方案二:GitHub Actions 自动化(推荐团队使用)
- 在项目根目录创建
.github/workflows/deploy.yml
name: CI/CD Pipeline
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install Node.js
uses: actions/setup-node@v3
with:
node-version: 18
- name: Install dependencies
run: npm ci
- name: Build project
run: npm run build
- name: Deploy to Server
uses: appleboy/scp-action@v0.1.3
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
port: 22
source: "dist/*"
target: "/var/www/your-project"
方案三:Webpack 插件自动上传(适合纯前端项目)
- 安装依赖
npm install ssh2-sftp-client --save-dev
- 修改
vue.config.js
文件
// vue.config.js
const Client = require('ssh2-sftp-client');
module.exports = {
chainWebpack: (config) => {
config.plugin('deploy').tap(() => [
{
apply: (compiler) => {
compiler.hooks.afterEmit.tapAsync('DeployPlugin', (compilation, callback) => {
const sftp = new Client();
sftp.connect({
host: 'your-server.com',
port: 22,
username: 'deploy-user',
privateKey: require('fs').readFileSync(require('os').homedir() + '/.ssh/id_rsa')
})
.then(() => sftp.uploadDir('dist', '/var/www/html'))
.finally(() => {
sftp.end();
callback();
});
});
}
}
]);
}
}
方案四:Docker 容器化部署(适合微服务架构)
- 创建
Dockerfile
FROM node:18-alpine as builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
- 创建部署脚本
#!/bin/bash
docker build -t vue-app .
docker save vue-app | ssh user@server "docker load"
ssh user@server "docker run -d -p 80:80 --restart always vue-app"
方案五:使用 Serverless 服务(最快上线)
- 安装 Vercel CLI
npm install -g vercel
- 创建
vercel.json
{
"version": 2,
"builds": [
{
"src": "dist/**/*",
"use": "@vercel/static"
}
],
"routes": [
{ "handle": "filesystem" },
{ "src": "/.*", "dest": "/index.html" }
]
}
- 部署命令
npm run build && vercel --prod
安全建议(所有方案通用)
- 使用 SSH 密钥认证代替密码
- 敏感信息处理
- 永远不要将凭证提交到代码仓库
- 使用环境变量(GitHub Secrets / .env 文件)
- 服务器目录权限设置:
chown -R www-data:www-data /var/www/html
chmod -R 755 /var/www/html
选择方案优先级建议:
- 个人项目 → 方案一
- 团队协作 → 方案二
- 需要灰度发布 → 方案四
- 快速原型 → 方案五
- 需要构建时触发 → 方案三
可以根据实际需求组合使用这些方案,例如用 GitHub Actions 触发 Docker 构建部署。