编写webpack插件,实现自动将前端dist文件夹部署至服务器的功能

前言

需求背景是(相信无论是做vuereact项目的童鞋都不会陌生):需要将前端build之后的dist文件夹,部署至指定的服务器上,如何编写自动工具,实现自动化一键部署呢?

正文

编写插件

在项目内的src目录下新增plugins目录,在该目录内新增deploymentProject.js文件,内容如下所示:

const fs = require('fs')
const path = require('path')
const axios = require('axios')
const AdmZip = require('adm-zip')
const moment = require('moment')
const FormData = require('form-data')
const zip = new AdmZip()

function delDir(path) {
  let files = []
  if (fs.existsSync(path)) {
    files = fs.readdirSync(path)
    files.forEach((file, index) => {
      let curPath = path + '/' + file
      if (fs.statSync(curPath).isDirectory()) {
        delDir(curPath) //递归删除文件夹
      } else {
        fs.unlinkSync(curPath) //删除文件
      }
    })
    fs.rmdirSync(path)
  }
}

module.exports = class DeploymentProjectWebpackPlugin {
  constructor(ip) {
    this.ip = ip
  }
  apply(compiler) {
    compiler.hooks.afterEmit.tapAsync(
      'DeploymentProjectWebpackPlugin',
      (compilation, cb) => {
        try {
          const dist = path.join(__dirname, '../../dist/')
          if (fs.existsSync(dist)) {
            zip.addLocalFolder(dist)
            // const willSendthis = zip.toBuffer()
            const zipName = path.join(
              __dirname,
              '../../dist/' + moment().format('YYYYMMDDHHmm') + '.zip'
            )
            // or write everything to disk
            zip.writeZip(/*target file name*/ zipName, () => {
              const formData = new FormData()
              formData.append('file', fs.createReadStream(zipName))
              formData.append('company', '2dmap')
              axios({
                url: `http://${this.ip}:3000/system/deployment`,
                method: 'post',
                data: formData,
                headers: formData.getHeaders(),
                maxContentLength: Infinity,
                maxBodyLength: Infinity,
              })
                .then((v) => {
                  console.log('上传完成')
                  setTimeout(() => {
                    console.log('开始删除dist目录')
                    delDir(path.join(__dirname, '../../dist'))
                    console.log('删除完成dist目录')
                  }, 2000)
                  console.log(v)
                })
                .catch((err) => {
                  console.log('error:' + err)
                })
            })
          }
        } catch (e) {
          console.error(e)
        } finally {
          cb()
        }
      }
    )
  }
}

上面代码用到的知识点如下所示:

  1. 使用adm-zip,创建zip对象,调用addLocalFolder添加需要被压缩的dist文件夹,zipName为压缩后的.zip文件名称
  2. zip对象调用writeZip方法,在回调函数内,调用接口system/deployment接口,将已被压缩的zipName内容(回调函数内,dist文件内容已被压缩,此时可获取到压缩后的内容)以formData形式,传至服务端,上传完成后,删除之前自动生成的dist文件夹即可

如何使用插件

vue.config.js内增添如下代码:

const DeploymentProjectPlugin = require('./src/plugins/deploymentProject')

module.exports = {
	configureWebpack: {
		plugins: [
			new DeploymentProjectPlugin('10.x.x.x')
		]
	}
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以的,Github Actions可以用来自动前端项目的部署到云服务器。以下是一个简单的例子: 1. 首先,在你的Github仓库中创建一个`.github/workflows`文件夹,并在该文件夹下创建一个`deploy.yml`文件。 2. 在`deploy.yml`文件中设置触发部署的事件,例如push到master分支。然后设置一个`job`,该`job`会在触发事件后运行。 3. 在该`job`中,使用`actions/checkout` action拉取代码,并使用`actions/setup-node` action安装依赖。 4. 接下来,使用你喜欢的打包工具打包你的前端代码,例如webpack或者parcel。打包后的文件会被存储在一个`dist`文件夹中。 5. 然后,使用`appleboy/ssh-action` action将打包后的文件上传到云服务器。该action会使用SSH登录到你的服务器,并将文件复制到服务器上的指定目录。 下面是一个示例的`deploy.yml`文件: ```yml name: Deploy to Cloud Server on: push: branches: - master jobs: deploy: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v2 - name: Setup Node uses: actions/setup-node@v1 with: node-version: '12.x' - name: Install dependencies run: npm install - name: Build run: npm run build - name: Deploy to Cloud Server uses: appleboy/ssh-action@master with: host: ${{ secrets.HOST }} username: ${{ secrets.USERNAME }} password: ${{ secrets.PASSWORD }} port: ${{ secrets.PORT }} script: | cd /path/to/your/project rm -rf * scp -r /path/to/your/project/dist/* ./ ``` 这个例子是使用密码登录到云服务器的。如果你使用的是SSH Key,你需要相应地修改`deploy.yml`文件。此外,你需要在Github仓库的`Settings`中添加`secrets`,以保存你的服务器信息和登录凭证。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值