# 部署配置

## NPM 脚本

```json
"scripts": {
  "dev": "vite",
  "start": "pnpm run dev",
  "build": "vite build",
  "preview": "vite preview",
  "build:stage": "pnpm run build --mode staging",
  "build:prod": "pnpm run build --mode production",
  "clean": "rimraf dist.zip",
  "zip": "node export-zip.cjs",
  "upload:stage": "node ftp-deploy.js stage",
  "upload:prod": "node ftp-deploy.js production",
  "deploy:stage": "pnpm run build:stage && pnpm run clean && pnpm run zip && pnpm run upload:stage",
  "deploy:prod": "pnpm run build:prod && pnpm run clean && pnpm run zip && pnpm run upload:prod"
}
```

---

## 压缩脚本 (export-zip.cjs)

```javascript
const fs = require('fs');
const archiver = require('archiver');

const homedir = __dirname;
const target = ['dist'];

const output = fs.createWriteStream(homedir + '/dist.zip');
const archive = archiver('zip', { zlib: { level: 9 } });

archive.on('error', function (err) { throw err; });

output.on('close', function () {
    console.log(`压缩完毕，大小: ${(archive.pointer() / 1024 / 1024).toFixed(1)} MB`);
});

archive.pipe(output);
for (let i of target) {
    archive.directory(i, i);
}
archive.finalize();
```

---

## FTP 部署脚本 (ftp-deploy.js)

```javascript
import FtpDeploy from "ftp-deploy";
import { fileURLToPath } from "node:url";
import path from "node:path";

const ftpDeploy = new FtpDeploy();
const env = process.argv.splice(2)[0];
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

const envConfig = {
    'stage': {
        user: 'your_test_user',
        password: 'your_test_password',
        host: 'your_ftp_host',
        remoteRoot: '/your_test_path/'
    },
    'production': {
        user: 'your_prod_user',
        password: 'your_prod_password',
        host: 'your_ftp_host',
        remoteRoot: '/your_prod_path/'
    }
};

if (!env || !envConfig[env]) {
    console.log('\x1b[31m%s\x1b[0m', 'error: 环境参数错误');
    process.exit(1);
}

const config = {
    ...envConfig[env],
    port: 21,
    localRoot: __dirname + "/",
    include: ["dist.zip"],
    deleteRemote: false,
    forcePasv: true,
    sftp: false,
};

ftpDeploy.deploy(config)
    .then(() => console.log('upload completed'))
    .catch((err) => console.log(err));
```

---

## 部署依赖

```bash
pnpm add -D archiver ftp-deploy rimraf
```
