zoukankan      html  css  js  c++  java
  • vue + vuex + koa2开发环境搭建及示例开发

    写在前面

    这篇文章的主要目的是学会使用koa框架搭建web服务,从而提供一些后端接口,供前端调用。
    搭建这个环境的目的是: 前端工程师在跟后台工程师商定了接口但还未联调之前,涉及到向后端请求数据的功能能够走前端工程师自己搭建的http路径,而不是直接在前端写几个死数据。即,模拟后端接口。

    当然在这整个过程(搭建环境 + 开发示例demo)中,涉及到以下几点知识点。
    包括:

    • koa2的知识点
    • node的知识点
    • 跨域问题
    • fetch的使用
    • axios的使用
    • promise的涉及
    • vuex -> state、mutations、actions的使用

    第一部分:环境搭建

    vue + vuex环境

    首先是vue + vue-router + vuex的环境。我们用vue-cli脚手架生成项目,会用vue的同学对这块应该很熟了。

    // 全局安装脚手架工具
    npm i vue-cli -g
    // 验证脚手架工具安装成功与否
    vue --version
    // 构建项目
    vue init webpack 项目名
    // 测试vue项目是否运行成功
    npm run dev

    因为脚手架生成的vue项目不包含vuex,所以再安装vuex。

    // 安装vuex
    npm i vuex --save

    koa2环境

    前端项目构建好了,就开始构建我们的后端服务。

    首先在你的开发工具(不管是webstorm还是sublime)里新建一个目录,用来搭建基于koa的web服务。

    在这里,我们不妨给这个目录起名为koa-demo。

    然后执行:

    // 进入目录
    cd koa-demo
    // 生成package.json
    npm init -y
    // 安装以下依赖项
    npm i koa
    npm i koa-router
    npm i koa-cors

    安装好koa和两个中间件,环境就算搭建完成了。

    第二部分:示例开发

    搭建环境是为了使用,所以我们立马来写一个demo出来。
    demo开发既是一个练习如何在开发环境中写代码的过程,反过来,也是一个验证环境搭建的对不对、好不好用的过程。

    后端接口开发

    本例中,后端我们只提供一个服务,就是给前端提供一个返回json数据的接口。代码中包含注释,所以直接上代码。

    server.js文件

    // server.js文件
    
    let Koa = require('koa');
    let Router = require('koa-router');
    
    let cors = require('koa-cors');
    // 引入modejs的文件系统API
    let fs = require('fs');
    
    const app = new Koa();
    const router = new Router();
    
    // 提供一个/getJson接口
    router
        .get('/getJson', async ctx => {
            // 后端允许cors跨域请求
            await cors();
            // 返回给前端的数据
            ctx.body = JSON.parse(fs.readFileSync( './static/material.json'));
        
        });
    
    // 将koa和两个中间件连起来
    app.use(router.routes()).use(router.allowedMethods());
    
    // 监听3000端口
    app.listen(3000);
     

    这里面用到了一个json文件,在'./static/material.json'路径,该json文件的代码是:

    // material.json文件
    
    [{
        "id": 1,
        "date": "2016-05-02",
        "name": "张三",
        "address": "北京 清华大学",
    }, {
        "id": 2,
        "date": "2016-05-04",
        "name": "李四",
        "address": "上海 复旦大学",
    }, {
        "id": 3,
        "date": "2016-05-01",
        "name": "王五",
        "address": "广东 中山大学",
    }, {
        "id": 4,
        "date": "2016-05-03",
        "name": "赵六",
        "address": "广东 深圳大学",
    }, {
        "id": 5,
        "date": "2016-05-05",
        "name": "韩梅梅",
        "address": "四川 四川大学",
    }, {
        "id": 6,
        "date": "2016-05-11",
        "name": "刘小律",
        "address": "湖南 中南大学",
    }, {
        "id": 7,
        "date": "2016-04-13",
        "name": "曾坦",
        "address": "江苏 南京大学",
    }]

    然后我们是用以下命令将服务启动

    node server.js

    测试接口是否良好

    打开浏览器,输入http://127.0.0.1:3000/getJson。看一看页面上是否将json文件中的json数据显示出来,如果能够显示出来,则说明这个提供json数据的服务,我们已经搭建好了。

    前端调用后端接口示例

    为突出重点,排除干扰,方便理解。我们的前端就写一个组件,组件有两部分:首先是一个按钮,用来调用web服务的getJson接口;然后是一个内容展示区域,拿到后端返回的数据以后,将其在组件的这块区域显示出来。

    首先我们看组件文件吧

    <template>
        <div class="test">
            <button type="button" @click="getJson">从后端取json</button>
            <div class="showJson">{{json}}</div>
        </div>
    </template>
    
    <script>
        import {store} from '../vuex'
        export default {
            computed: {
              json(){
                  return store.state.json;
              }
            },
            methods: {
              getJson(){
                  store.dispatch("getJson");
              }
            }
        }
    </script>
    
    <style scoped>
      .showJson{
        500px;
        margin:10px auto;
        min-height:500px;
        background-color: palegreen;
      }
    </style>

    非常简单,就不多解释了。
    然后看我们的vuex文件。

    import Vue from 'vue'
    import Vuex from 'vuex';
    
    Vue.use(Vuex)
    const state = {
        json: [],
    };
    
    const mutations = {
      setJson(state, db){
        state.json = db;
      }
    }
    
    const actions = {
      getJson(context){
        // 调用我们的后端getJson接口
        fetch('http://127.0.0.1:3000/json', {
          method: 'GET',
          // mode:'cors',
          headers: {
            'Accept': 'application/json',
            'Content-Type': 'application/json',
          },
        }).then(function (res) {
          if(res.status === 200){
            return res.json()
          }
        }).then(function (json) {
    
          //console.log(typeof Array.from(json), Array.from(json));
          context.commit('setJson', Array.from(json));
        })
      }
    };
    
    export const store = new Vuex.Store({
      state: state,
      mutations: mutations,
      actions: actions,
    })

    ok, 代码撸完了,获取后端数据之前是这样的。

    获取后端数据之后是这样的。

    说说axios

    想要把本demo的fetch改为axios方式,要做的工作有以下几处:
    1、安装axios、在vuex文件引用axios

    npm i axios
    import axios from 'axios'

    2、将fetch部分代码替换为:

    const actions = {
      getJson(context){
        axios.get('/json', {
          method: 'GET',
          // mode:'cors',
          headers: {
            'Accept': 'application/json',
            'Content-Type': 'application/json',
          },
        }).then(function (res) {
          if(res.status === 200){
            return res.data
          }
        }).then(function (json) {
    
          //console.log(typeof Array.from(json), Array.from(json));
          context.commit('setJson', Array.from(json));
        })
      }
    };

    3、又会遇到跨域,在webpack中修改,路径config/index.js文件中添加proxyTable项的配置:

    proxyTable: {
          '/json': {
            target: 'http://127.0.0.1:3000',
            changeOrigin: true,
            pathRewrite: {
              '^/json': '/json'
            }
          }
        },

    后记

    基于vue脚手架搭建的项目,模拟异步取数据,也可以直接在脚手架生成的static文件夹下放置数据,假装是后台拿过来的数据。

    不过搭建一个基于express或者koa的web服务,确实也该是一个前端工程师应该掌握的。

    OK,以上就是全文了。
    如果这篇文章使你有所收获,不胜荣幸。
    欢迎点赞,以期能帮助更多同学!

    关于作者

    技术博客 || GitHub || 掘金主页

    作者:林飞叶,原链接https://segmentfault.com/a/1190000012918518

  • 相关阅读:
    HomeWork2
    An error I have completed recently
    C#之规格说明书
    App上架审核指南翻译
    使用CollectionView做横向滑动分页效果:
    推荐一些CSS命名规范
    关于让左右2个DIV高度相等
    带有缩略图和文字提示的轮播图
    动画的定义:
    .Net基础篇_学习笔记_第五天_流程控制while循环002
  • 原文地址:https://www.cnblogs.com/GeniusZ/p/12366990.html
Copyright © 2011-2022 走看看