Vue-CLI 3.X 部署项目至生产服务器的方法


Posted in Javascript onMarch 22, 2019

本教程主要讲解的是 Vue-CLI 3.x 脚手架搭建的vue项目, 先构建生成dist文件(纯静态应用), 然后自动化部署到静态文件服务器 Nginx。

一、Nginx服务器文件的配置

server {
    listen 80;
    server_name www.xxxxxx.com;#生产环境
    location / {
      root /usr/local/www/xxx_program/;
      index index.html;
      try_files $uri $uri/ /index.html;
    }
  }
  server {
    listen 80;
    server_name test.xxxxxx.com; #测试环境
    location / {
      root /usr/local/www/xxx_program_test/;
      index index.html;
      try_files $uri $uri/ /index.html;
    }
  }

二、配置生产/测试环境 服务器SSH远程登陆账号

在项目根目录下, 创建 .env 文件 (当前环境变量)

VUE_APP_SERVER_ID变量指代 当前需部署的服务器ID为0

VUE_APP_SERVER_ID=0

在项目根目录下, 创建 deploy/products.js 文件

该文件功能如下:

(1) 读取env环境变量

const fs = require('fs')
const path = require('path')
// env环境变量的路径
const envPath = path.resolve(__dirname, '../.env')
// env对象
const envObj = parse(fs.readFileSync(envPath, 'utf8'))
const SERVER_ID = parseInt(envObj['VUE_APP_SERVER_ID'])

function parse (src) {
 // 解析KEY=VAL的文件
 const res = {}
 src.split('\n').forEach(line => {
  // matching "KEY' and 'VAL' in 'KEY=VAL'
  const keyValueArr = line.match(/^\s*([\w\.\-]+)\s*=\s*(.*)?\s*$/)
  // matched?
  if (keyValueArr != null) {
   const key = keyValueArr[1]
   let value = keyValueArr[2] || ''

   // expand newlines in quoted values
   const len = value ? value.length : 0
   if (len > 0 && value.charAt(0) === '"' && value.charAt(len - 1) === '"') {
    value = value.replace(/\\n/gm, '\n')
   }

   // remove any surrounding quotes and extra spaces
   value = value.replace(/(^['"]|['"]$)/g, '').trim()

   res[key] = value
  }
 })
 return res
}

(2) 定义多个服务器账号 及 根据 SERVER_ID 导出当前环境服务器账号

const SERVER_LIST = [
 {
  id: 0,
  name: 'A-生产环境',
  domain: 'www.xxx.com',
  host: 'XX.XX.XX.XX',
  port: 22,
  username: 'root',
  password: 'xxxxxxx',
  path: '/usr/local/www/xxx_program/'
 },
 {
  id: 1,
  name: 'B-测试环境',
  domain: 'test.xxx.com',
  host: 'XX.XX.XX.XX',
  port: 22,
  username: 'root',
  password: 'xxxxxxx',
  path: '/usr/local/www/xxx_program_test/'
 }, 
]

module.exports = SERVER_LIST[SERVER_ID]

三、创建自动化部署脚本 (使用scp2库)

在项目根目录下, 创建 deploy/index.js 文件

const scpClient = require('scp2')
const ora = require('ora')
const chalk = require('chalk')
const server = require('./products')
const spinner = ora('正在发布到生产服务器...')
spinner.start()
scpClient.scp('dist/', {
 host: server.host,
 port: server.port,
 username: server.username,
 password: server.password,
 path: server.path
}, function(err) {
 spinner.stop()
 if (err) {
  console.log(chalk.red(' 发布失败.\n'))
  throw err
 } else {
  console.log(chalk.green(' Success! 成功发布到生产服务器! \n'))
 }
})

四、添加 package.json 中的 scripts 命令, 自定义名称为 “deploy”

"scripts": {
  "serve": "vue-cli-service serve",
  "build": "vue-cli-service build",
  "lint": "vue-cli-service lint",
  "deploy": "npm run build && node ./deploy"
 }

五、执行部署任务

在项目根目录下 执行 npm run deploy 命令, 或 使用 vue ui控制面板执行deploy任务, 即可自动打包并部署至线上服务器

备注: 要切换部署的服务器, 只需修改 .env文件中的服务器ID, 然后再执行deploy任务即可.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery 全选效果实现代码
Mar 23 Javascript
Jquery绑定事件(bind和live的区别介绍)
Aug 23 Javascript
用js的for循环获取radio选中的值
Oct 21 Javascript
php的文件上传入门教程(实例讲解)
Apr 10 Javascript
Bootstrap DateTime Picker日历控件简单应用
Mar 25 Javascript
JS实现json的序列化和反序列化功能示例
Jun 13 Javascript
js es6系列教程 - 基于new.target属性与es5改造es6的类语法
Sep 02 Javascript
用jquery获取select标签中选中的option值及文本的示例
Jan 25 jQuery
vue移动端监听滚动条高度的实现方法
Sep 03 Javascript
vue组件之间通信实例总结(点赞功能)
Dec 05 Javascript
微信小程序实现的五星评价功能示例
Apr 25 Javascript
JQuery插件tablesorter表格排序实现过程解析
May 28 jQuery
微信小程序城市选择及搜索功能的方法
Mar 22 #Javascript
使用node搭建自动发图文微博机器人的方法
Mar 22 #Javascript
如何从零开始手写Koa2框架
Mar 22 #Javascript
Vue服务端渲染实践之Web应用首屏耗时最优化方案
Mar 22 #Javascript
详解ES6中的Map与Set集合
Mar 22 #Javascript
js控制随机数生成概率代码实例
Mar 21 #Javascript
详解bootstrap-fileinput文件上传控件的亲身实践
Mar 21 #Javascript
You might like
Windows下PHP5和Apache的安装与配置
2006/09/05 PHP
PHP生成UTF8文件的方法
2010/05/15 PHP
php使用多个进程同时控制文件读写示例
2014/02/28 PHP
PHP SPL标准库之SplFixedArray使用实例
2015/05/12 PHP
JavaScript Title、alt提示(Tips)实现源码解读
2010/12/12 Javascript
用JS实现3D球状标签云示例代码
2013/12/01 Javascript
分享33个jQuery与CSS3实现的绚丽鼠标悬停效果
2014/12/15 Javascript
jQuery中offsetParent()方法用法实例
2015/01/19 Javascript
原生js实现数字字母混合验证码的简单实例
2015/12/10 Javascript
jQuery中常用动画效果函数(日常整理)
2016/09/17 Javascript
nodejs基础应用
2017/02/03 NodeJs
vue.js的安装方法
2017/05/12 Javascript
React根据宽度自适应高度的示例代码
2017/10/11 Javascript
解决vue页面DOM操作不生效的问题
2018/03/17 Javascript
一文看懂如何简单实现节流函数和防抖函数
2019/09/05 Javascript
vue样式穿透 ::v-deep的具体使用
2020/06/04 Javascript
Python中的super用法详解
2015/05/28 Python
用不到50行的Python代码构建最小的区块链
2017/11/16 Python
python使用os.listdir和os.walk获得文件的路径的方法
2017/12/16 Python
Python自动发送邮件的方法实例总结
2018/12/08 Python
Falsk 与 Django 过滤器的使用与区别详解
2019/06/04 Python
详解python中的time和datetime的常用方法
2019/07/08 Python
Python + OpenCV 实现LBP特征提取的示例代码
2019/07/11 Python
在Tensorflow中实现梯度下降法更新参数值
2020/01/23 Python
关于win10在tensorflow的安装及在pycharm中运行步骤详解
2020/03/16 Python
Tensorflow中的图(tf.Graph)和会话(tf.Session)的实现
2020/04/22 Python
python进行二次方程式计算的实例讲解
2020/12/06 Python
EMPHASIS艾斐诗官网:周生生旗下原创精品珠宝品牌
2020/12/17 全球购物
为数据库创建索引都需要注意些什么
2012/07/17 面试题
生产车间班组长岗位职责
2014/01/06 职场文书
教师党员承诺书
2014/03/25 职场文书
小学校本培训方案
2014/06/06 职场文书
学校做一个有道德的人活动方案
2014/08/23 职场文书
Python带你从浅入深探究Tuple(基础篇)
2021/05/15 Python
Python 数据科学 Matplotlib图库详解
2021/07/07 Python
Mysql排查分析慢sql之explain实战案例
2022/04/19 MySQL