基于 Typescript 的全栈工程模版 - 前端 Vue3

基于 Typescript 的全栈工程模版 - 前端 Vue3

Weex Clone是基于Tyepscript开发的一套简单的点餐应用。作为一个全栈开发的完整实例,这个应用包括了基于Node.js和Koa框架的后端实现,也包含了基于Vue3开发的前端工程。这个仓库是一个完整前端的实现,采用了AWS的Cognito作为用户的鉴权(Authentication)。除了代码的实现,也包括了完整的CI/CD的发布流程。前端系统默认部署在Heroku,但是也可以通过Amplify部署在AWS上,或自己搭建的VPS Nginx上。

参考基于 Typescript 的全栈工程模版 - 后端 Node.js + Koa2

用命令行 vue-cli 创建 vue3 的应用框架

  1. 安装或更新 vue-cli
npm install -g @vue/cli

npm update -g @vue/cli
  1. 创建应用
  • vue-create-app
  • vue-select-options

Lint

  1. 添加 .prettierrc.js 文件
module.exports = {
  tabWidth: 2,
  semi: false,
  singleQuote: true,
  trailingComma: 'all',
}
  1. 修改 workspace 的配置, ** 一定要重新打开 vscode **
{
  "editor.formatOnSave": false,
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": true
  }
}
  1. 运行 npm run lint

编译打包确认环境变量

  1. Mode 的概念
    Mode is an important concept in Vue CLI projects. By default, there are three modes:
  • development is used by vue-cli-service serve
  • test is used by vue-cli-service test:unit
  • production is used by vue-cli-service build and vue-cli-service test:e2e

You can overwrite the default mode used for a command by passing the --mode option flag. For example, if you want to use development variables in the build command:

  "scripts": {
    "dev": "vue-cli-service serve",
    "test": "vue-cli-service serve --https --mode mytest",
    "staging": "vue-cli-service build --mode staging",
  1. mode 决定了打包用哪个环境变量文件
.env                # loaded in all cases
.env.local          # loaded in all cases, ignored by git
.env.[mode]         # only loaded in specified mode
.env.[mode].local   # only loaded in specified mode, ignored by git

In addition to VUEAPP* variables, there are also two special variables that will always be available in your app code:

  • NODE_ENV - this will be one of "development", "production" or "test" depending on the mode the app is running in.
  • BASE_URL - this corresponds to the publicPath option in vue.config.js and is the base path your app is deployed at.
  • 环境变量文件中可以再申明 NODE_ENV, 例如在 .env.staging 中设置 ** NODE_ENV=production **, 确认打包时可以优化 staging 下的代码

搭建持续集成和持续部署环境

部署到 Oracle CentOS 8 服务器中的 Nginx 下

  1. 配置 Nginx 支持单个端口对应多个二级域名的静态服务
  • 编辑 /etc/nginx/nginx.conf 支持同一个端口,不同的静态服务器
server {
    listen  80;
    server_name     test.magicefire.com;
    root            /usr/share/nginx/html/test;
    location / {}
}

server {
    listen  80;
    server_name     staging.magicefire.com;
    root            /usr/share/nginx/html/staging;
    location / {}
}

server {
    listen  80;
    server_name     production.magicefire.com;
    root            /usr/share/nginx/html/production;
    location / {}
}

建立对应的目录,在目录下放测试 html

  • 修改 Cloudflare,添加三条 A 记录,支持 VPS 的 IP


    cloudflare-static
  • 通过 Let's Encrypt 修改 nginx 的 https 支持
    安装 certbot 见 Node Server 的部署

certbot -nginx
certbot-static

2. 编写 Github Actions 部署脚本

  1. 在 .github/workflows 下添加 Github Actions
    注意不要添加 NODE_ENV=production,设置了这个后 npm ci 不会 install devDependencies 下的模块,会导致 npm run build 报错无法找到 vue-cli-service
    Vue 的 Webpack 会根据 --mode [staging | production ] 找到对应的 .env.* 文件, 在这些中再声明 NODE_ENV=production

  2. 在 Github 的仓库设置中,给 Actions 用到的添加加密的 Secrets

    github-secrets

    DEPLOY_ORACLE=/usr/share/nginx/html

部署到 Heroku

  1. 创建 staging 和 production 两个独立的 APP
    与服务端部署不一样,两个环境都是在 Webpack 打包时注入了环境变量,两个环境都需要走 CI 的编译打包流程,所以通过 Pipeline 的 Promote 是没有意义的。我们这里创建两个独立的 APP:[staging-vue3, production-vue3]
  2. 为每个 APP 添加编辑插件, 因为是静态部署,比 Node
    Server 多了一个插件
heroku buildpacks:add heroku/nodejs
heroku buildpacks:add https://github.com/heroku/heroku-buildpack-static

并且要添加 static.json 文件在项目的根目录下

{
  "root": "dist",
  "clean_urls": true,
  "routes": {
    "/**": "index.html"
  }
}
  1. 在两个 APP 的设置中绑定关联的 Github 仓库和分支
    这里的 VUE_APP_URL 是在 编译 时候,覆盖 axios 默认的 BASE_URL,指向对应的 Node Server,不同的分支也可以有不同的 Value
    与 Amplify 不同这里要设置 NODE_ENV=production,设置了这个后 npm ci 不会影响 install devDependencies 下的模块

通过 Amplify 部署到 Amazon EC2

通过 amplify init 创建 Amplify 应用,并初始化对应的 Backend

  1. 通过命令行在项目的根目录下创建 Amplify 的应用, 命名 vue3typescript
amplify init
amplify-init
  1. 同时创建了一个后端环境,先命名为 dev
  2. 进入 AWS Console, 到 Amplify 下,进入刚才创建的 vue3typescript APP。连接 Github 仓库和对应的 aws-staging 分支。并在关联的后端服务上选择 staging
  3. 连接 Github 仓库和对应的 aws-production 分支。通过 Amplify 命令行创建一个新的后端环境 online
amplify env add

然后在 Amplify 后台的 aws-production 前端环境绑定 online

amplify-env-backend

创建 amplify.yaml 文件,修改 build 的脚本

version: 0.2
backend:
  phases:
    build:
      commands:
        - '# Execute Amplify CLI with the helper script'
        - amplifyPush --simple
frontend:
  phases:
    preBuild:
      commands:
        - npm ci
    build:
      commands:
        - nvm use $VERSION_NODE_10
        - node -v
        - if [ "${AWS_BRANCH}" = "aws-staging" ]; then echo "staging branch" && npm run build:staging; elif [ "${AWS_BRANCH}" = "aws-production" ]; then echo "production branch" && npm run build:production; else echo "test branch" && npm run build:mytest; fi
  artifacts:
    baseDirectory: dist
    files:
      - '**/*'
  cache:
    paths:
      - node_modules/**/*

当推送到对应的分支后,Amplify 会调用这个脚本执行编译,打包和部署

设置环境相关的变量

amplify-env

这里的 VUE_APP_URL 是在 编译 时候,覆盖 axios 默认的 BASE_URL,指向对应的 Node Server,不同的分支也可以有不同的 Value
注意不要添加 NODE_ENV=production,设置了这个后 npm ci 不会 install devDependencies 下的模块,会导致 npm run build 报错无法找到 vue-cli-service
Vue 的 Webpack 会根据 --mode [staging | production ] 找到对应的 .env.* 文件, 在这些中再声明 NODE_ENV=production

安装 aws-amplify 和 aws-amplify-vue 库

npm i aws-amplify aws-amplify-vue

创建 Amplify 角色

创建 Amplify APP 时,好像没有自动创建关联的 Role, 我手动创建了一个

aws-role-amplify

Cognito 和 JWT 的支持

手机短信登入

配置 Amplify 环境,添加 Auth 和 Functions

前期准备
  1. 未添加 Amplify 服务的项目,或者 clone 的项目,一般首先要运行
amplify init

如果没有设置过 AWS ,之前还要添加 AWS 命令行配置

aws configure
  1. 查看 Amplify 状态
amplify status

Amplify 的 env 对应

  • 后端服务资源的配置
  • Lambda 函数
  • 添加环境后,相当于在项目中创建了一个 git 的子模块
  • 可以创建多个环境,不同的环境相当于不同的 git 分支,可以通过
amplify env checkout <env-name>

在不同的环境下切换

  • 配置可以对应不同的后端资源,例如 Cognito 不同的 User Pool,和与之对应的其他权限资源
  • Lambda 函数可以在不同环境(分支)间共享
  • 如果两个环境完全独立,在两个完全独立的环境之间切换可以使用
amplify env checkout <env-name> [--restore]
  • amplify 的前端环境可以选择不同的后端环境绑定
    • 在 Amplify 后台, staging 和 production 的前端环境,绑定了 online 后端环境


      aws-amplify-online
    • 在本地的开发环境下,可以通过命令行灵活的切换环境
amplify-backend-env
添加 Auth 和 Lambda
  1. 添加 Auth 和 默认的 Lambda functions
amplify add auth
aws-amplify-custom-auth-1

aws-amplify-custom-auth-2

aws-amplify-custom-auth-3

aws-amplify-custom-auth-4
  1. 手动添加一个 PreSignup Lambda Function
amplify add fucntion
aws-auth-function-presignup-1

去 Cognito 的 User Pool 后台,手动绑定 Trigger


aws-auth-function-presignup-2
  1. 让 vue3typescript360b0231CreateAuthChallenge
    有发送 SNS 的权限
    进入 Lambda 的 后台页面,找到不同环境下的 vue3typescript360b0231CreateAuthChallenge 函数
    找到对应的 Role,在Role的后台添加 SNS 权限


    aws-cognito-sns-permision
  2. 配置 SNS


    aws-sns-profile

前端改造

©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,084评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,623评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,450评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,322评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,370评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,274评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,126评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,980评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,414评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,599评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,773评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,470评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,080评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,713评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,852评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,865评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,689评论 2 354

推荐阅读更多精彩内容