只要使用Vue.js和Amplify,就可以在20分钟内发布一个现代化的Web应用程序

SPA -> GraphQL -> 无服务器后端

使用Vue.js和Amplify,从头开始进行现代化的前端开发和无服务器后端构建。本次将从Vue.js创建的单页面应用向AppSync发送基于GraphQL的请求,并确认通过后端的DynamoDB进行数据的写入和读取。

Untitled Diagram (1).png

通过使用Amplify Framework,您可以从命令行创建AWS后端资源。

Untitled Diagram-Page-2.png

在戏剧中亮相的角色

Vue.js 是一款流行的JavaScript 框架。

这个前端框架从小型应用到大规模应用都能很好地支持,我个人也经常使用它。本文章是作为Vue.js AdventCalendar的第十天发布的。

Buefy是一个选项。

Buefy是一个在Vue中使Bulma UI库更易用的工具。通常我会使用ElementUI,但这次我尝试使用Buefy。其特点是100%响应式。

增强框架

Amplify JavaScript为Vue提供了开发云原生Web应用程序的便利库。它支持Angular、React和Vue三个框架。你可以在官方网页上找到Vue.js的使用说明。

放大台

在AWS的活动re:Invent2018上,新增了一个功能,可以轻松地准备公开Web应用的环境。除了CI/CD功能外,还提供CDN功能。我们将在本文中详细介绍。

AppSync 同步应用

这是一个AWS的GraphQL托管服务。它可以接收Vue.js发来的GraphQL请求。介绍GraphQL (AWS AppSync)。

DynamoDB:亚马逊开发的一种可扩展的云数据库服务。

在AWS的NoSQL数据库服务中,我们将其放置在AppSync的背后,用作数据的存储位置。
[官方]DynamoDB是什么?

GitHub – GitHub仓库

本文中,将管理Vue.js的源代码。当源代码被推送到GitHub的主分支时,触发Web应用程序的发布。本文不涉及GitHub的处理。

准备

Apmlify CLI的安装(0.5分钟)

请执行以下命令来安装 Amplify CLI。

$ npm install -g @aws-amplify/cli

只要看到「AWS AMPLIFY」显示出来就可以了。

$ amplify

  █████╗  ██╗    ██╗ ███████╗      █████╗  ███╗   ███╗ ██████╗  ██╗      ██╗ ███████╗ ██╗   ██╗ 
 ██╔══██╗ ██║    ██║ ██╔════╝     ██╔══██╗ ████╗ ████║ ██╔══██╗ ██║      ██║ ██╔════╝ ╚██╗ ██╔╝ 
 ███████║ ██║ █╗ ██║ ███████╗     ███████║ ██╔████╔██║ ██████╔╝ ██║      ██║ █████╗    ╚████╔╝  
 ██╔══██║ ██║███╗██║ ╚════██║     ██╔══██║ ██║╚██╔╝██║ ██╔═══╝  ██║      ██║ ██╔══╝     ╚██╔╝   
 ██║  ██║ ╚███╔███╔╝ ███████║     ██║  ██║ ██║ ╚═╝ ██║ ██║      ███████╗ ██║ ██║         ██║    
 ╚═╝  ╚═╝  ╚══╝╚══╝  ╚══════╝     ╚═╝  ╚═╝ ╚═╝     ╚═╝ ╚═╝      ╚══════╝ ╚═╝ ╚═╝         ╚═╝    

amplify <command> <subcommand>

...

创建Vue项目(1分钟)

使用Vue CLI创建Vue项目。如果未安装Vue CLI,请执行以下命令。

$ npm install -g @vue/cli

※[参考] Vue.js项目创建指南
使用SpringBoot+Vue.js+ElementUI+Firebase创建主数据管理应用程序入门#创建Vue项目

让我们使用”vue create”来创建项目。这次我们将把项目命名为白羊座的”Aries”。

$ vue create aries

如果在 http://localhost:8080/ 上显示了示例画面,则表示成功。

安装图书馆 (0.5分钟)

请安装必要的模块。由于此应用程序只限定了功能,所以除了amplify系列和UI库buefy外,不需要其他特殊模块。

$ npm i --save aws-amplify
$ npm i --save aws-amplify-vue
$ npm i --save buefy

让我们将 vue-create 创建的文件推送到个人的 GitHub。

$ git add .
$ git commit -m "first commit"
$ git push origin master

如果没有特别的问题的话,到此为止准备工作已经完成了。总体而言,只需要大约2分钟就能结束。

构建后端

使用Amplify框架为AWS资源做准备(3分钟)。

从这里开始,我们将使用AWS来构建使用amplify的资源。首先,为了进行初始设置,执行以下命令。

$ amplify init

? Choose your default editor: Visual Studio Code
? Choose the type of app that you're building javascript
Please tell us about your project
? What javascript framework are you using vue
? Source Directory Path:  src
? Distribution Directory Path: dist
? Build Command:  npm run-script build
? Start Command: npm run-script serve

在选择时有几个是“是”或“否”的选项,但基本上默认设置是没有问题的。语言和框架一定选择JavaScript/Vue。

如果您还没有完成AWS-CLI的配置,您需要通过命令行进行区域和访问密钥的设置。以下也有步骤说明,请继续进行配置。

放大JavaScript # 放大配置

接下来,我们将创建API的终端点。请执行以下命令。

$ amplify add api

? Please select from one of the below mentioned services GraphQL
? Provide API name: aries
? Choose an authorization type for the API API key
? Do you have an annotated GraphQL schema? No
? Do you want a guided schema creation? Yes
? What best describes your project: Single object with fields (e.g., “Todo” with ID, name, description)
? Do you want to edit the schema now? No

这次我们将使用GraphQL作为基础进行创建。为了简化授权类型,我们选择API KEY。模式也不进行编辑,我们将直接使用默认的Todo。

最后,我们将使用以下命令创建AWS资源。

$ amplify push

| Category | Resource name | Operation | Provider plugin   |
| -------- | ------------- | --------- | ----------------- |
| Api      | aries         | Create    | awscloudformation |

? Do you want to generate code for your newly created GraphQL API Yes
? Choose the code generation language target javascript
? Enter the file name pattern of graphql queries, mutations and subscriptions src/graphql/**/*.js
? Do you want to generate/update all possible GraphQL operations - queries, mutations and subscriptions Yes

我认为您可以从终端中确认通过CloudFormation自动生成了AppSync和DynamoDB。基本上,所有选项都是默认的。

如果终端显示了GraphQL的端点和API密钥,那说明成功了。

在AWS控制台上确认创建的资源。(1分钟)

从AWS控制台中选择AppSync,然后确认所创建的项目。在API列表中,我们可以找到本次创建的”aries”。

FireShot Capture 98 - AWS AppSync Console_ - https___console.aws.amazon.com_appsync_home.png

点击右侧的“数据源”,您可以查看随之创建的DynamoDB。当然,目前数据库为空。

FireShot Capture 99 - AWS AppSync Console_ - https___console.aws.amazon.com_appsync_home.png

建立部署流程线

使用Amplify控制台创建应用环境(3分钟)

从AWS控制台中选择“Amplify Console”,然后通过“connect app”按钮来创建应用环境。在第一步中,选择管理源代码的代码库,本次选择已经提交了Vue.js源代码的GitHub。

FireShot Capture 100 - AWS Amplify Console_ - https___console.aws.amazon.com_amplify_home.png

在第二步中,需要指定存储库名称和分支名称。

FireShot Capture 101 - AWS Amplify Console_ - https___console.aws.amazon.com_amplify_home.png

由于第三步和第四步没有特殊的更改,所以按照屏幕上的指示继续进行。

请在完成创建后,通过左侧菜单查看构建配置的YAML文件。

FireShot Capture 102 - AWS Amplify Console_ - https___console.aws.amazon.com_amplify_home.png
version: 0.1
frontend:
  phases:
    preBuild:
      commands:
        - npm ci
    build:
      commands:
        - npm run build
  artifacts:
    baseDirectory: dist
    files:
      - '**/*'
  cache:
    paths:
      - node_modules/**/*

在上述设置中,完成了一个Github源代码在每次更改时进行部署的流水线。

FireShot Capture 103 - AWS Amplify Console_ - https___console.aws.amazon.com_amplify_home.png

让我们从屏幕显示的URL确认一下。如果能够确认它通过HTTPS在网络上公开,那就是成功的。

向Vue.js中添加Amplify的设置(1分钟)。

目前的阶段,由于使用vue create创建的默认页面会显示,所以我们需要准备一个用于进行新增、读取、更新和删除操作的页面。首先,我们需要按照以下方式对Amplify进行修改,以便在Vue中可以使用它。

import Vue from 'vue'
import App from './App.vue'
import router from './router'

import Amplify, * as AmplifyModules from 'aws-amplify' // 追記
import { AmplifyPlugin } from 'aws-amplify-vue' // 追記
import aws_exports from './aws-exports' // 追記
Amplify.configure(aws_exports) // 追記

Vue.use(AmplifyPlugin, AmplifyModules) // 追記

Vue.config.productionTip = false

new Vue({
  router,
  render: h => h(App)
}).$mount('#app')

增加新页面并更改路由(8分钟)

为了能够从屏幕上添加待办事项,我们将创建一个新页面。

首先,让我们更改路由。当通过“/”访问时,我们将对其进行修改,使其跳转到这次新增的TODO管理页面。

import Vue from 'vue'
import Router from 'vue-router'
import Home from './views/Home.vue'

Vue.use(Router)

export default new Router({
  mode: 'history',
  base: process.env.BASE_URL,
  routes: [
    // {
    //   path: '/',
    //   name: 'home',
    //   component: Home
    // },
    {
      path: '/',
      name: 'todo',
      component: () => import(/* webpackChunkName: "todo" */ './views/Todo.vue')
    },
    {
      path: '/about',
      name: 'about',
      // route level code-splitting
      // this generates a separate chunk (about.[hash].js) for this route
      // which is lazy-loaded when the route is visited.
      component: () => import(/* webpackChunkName: "about" */ './views/About.vue')
    }
  ]
})

我们将对已经记录的对Home的访问进行注释处理。

接下来,我们将创建Todo.vue文件。

使用GraphQL进行数据的注册和列表获取。通过使用Amplify,查询已经自动在src/graphql下生成,因此不需要编写新的GraphQL查询。可以使用graphqlOperation来轻松进行API调用。

<template>
  <div>
    <nav class="level">
      <div class="level-item has-text-centered">
        <div>
          <p class="heading">TODO</p>
          <b-field label="Name">
            <b-input v-model="input.name"></b-input>
          </b-field>
        </div>
      </div>
      <div class="level-item has-text-centered">
        <div>
          <b-field label="Description">
            <b-input v-model="input.description"></b-input>
          </b-field>
        </div>
      </div>
    </nav>
    <button class="button is-link" @click="createTodo">ADD</button>
    <ul id="todo">
      <li v-for="todo in todos">
        <span class="todo-wrapper">{{ todo.name }}</span>
      </li>
    </ul>
  </div>
</template>

<script>
import {API, graphqlOperation} from 'aws-amplify'
import * as mutations from '@/graphql/mutations'
import * as queries from '@/graphql/queries'

export default {
  name: 'todo',
    data: function () {
    return {
      input: {
        name: '',
        description: ''
      },
      todos: []
    }
  },
  created: async function () {
    await this.listTodos()

  },
  methods: {
    createTodo: async function () {
      if (this.input.name !== '' || this.input.description !== '') {
        await API.graphql(graphqlOperation(mutations.createTodo, {input: this.input}))
         .catch(err => console.error(err))
        await this.listTodos()
      } else {
        console.info('input empty')
      }
    },
    listTodos: async function () {
      const res = await API.graphql(graphqlOperation(queries.listTodos))
        .catch(err => console.error(err))
      this.todos = res.data.listTodos.items
    }
  }
}
</script>
<style scoped>
.todo-wrapper {
  /* 適宜記述 */
}
</style>

当在输入表单中输入TODO名称和描述,并点击“添加”按钮时,将会执行createTodo方法。当需要使用GraphQL进行更新时,mutations用于向AppSync发送请求,并直接将数据写入DynamoDB。另外,当需要使用GraphQL进行检索时,queries用于向AppSync发送请求,并从DynamoDB中获取数据,然后将其渲染在屏幕上。

由于与本次目的不相关,所以不会在此次实现聪明的功能或布局。如果能参考一下查询和变更的调用方式,我会很高兴。由于正在使用Buefy,因此对于手机的网页显示也很容易。

image.png

将更改应用于公开的网页(2分钟)。

最后,会更新网页。修改后的代码会提交到GitHub,并推送到主分支,此时Amplify Console的流水线将自动开始构建过程。等待大约1分钟,即可完成部署,可以确认修正内容已经实施。

最后

    • Amplify Frameworkを使用することで、バックエンドのロジックを一切記述することなくサーバレスで構築することができました。

 

    • Amplify Consoleを使用することで、Vue.jsのCI/CDパイプラインを簡単に構築することができました。

 

    GraphQLやサーバレスとったモダン要素を取り入れながら、20分でアプリを公開することができました。
广告
将在 10 秒后关闭
bannerAds