詳解vue+vuex+koa2開發(fā)環(huán)境搭建及示例開發(fā)
寫在前面
這篇文章的主要目的是學(xué)會(huì)使用koa框架搭建web服務(wù),從而提供一些后端接口,供前端調(diào)用。
搭建這個(gè)環(huán)境的目的是: 前端工程師在跟后臺(tái)工程師商定了接口但還未聯(lián)調(diào)之前,涉及到向后端請(qǐng)求數(shù)據(jù)的功能能夠走前端工程師自己搭建的http路徑,而不是直接在前端寫幾個(gè)死數(shù)據(jù)。即,模擬后端接口。
當(dāng)然在這整個(gè)過(guò)程(搭建環(huán)境 + 開發(fā)示例demo)中,涉及到以下幾點(diǎn)知識(shí)點(diǎn)。
包括:
- koa2的知識(shí)點(diǎn)
- node的知識(shí)點(diǎn)
- 跨域問(wèn)題
- fetch的使用
- axios的使用
- promise的涉及
- vuex -> state、mutations、actions的使用
第一部分:環(huán)境搭建
vue + vuex環(huán)境
首先是vue + vue-router + vuex的環(huán)境。我們用vue-cli腳手架生成項(xiàng)目,會(huì)用vue的同學(xué)對(duì)這塊應(yīng)該很熟了。
// 全局安裝腳手架工具 npm i vue-vli -g // 驗(yàn)證腳手架工具安裝成功與否 vue --version // 構(gòu)建項(xiàng)目 vue init webpack 項(xiàng)目名 // 測(cè)試vue項(xiàng)目是否運(yùn)行成功 npm run dev
因?yàn)槟_手架生成的vue項(xiàng)目不包含vuex,所以再安裝vuex。
// 安裝vuex npm i vuex --save
koa2環(huán)境
前端項(xiàng)目構(gòu)建好了,就開始構(gòu)建我們的后端服務(wù)。
首先在你的開發(fā)工具(不管是webstorm還是sublime)里新建一個(gè)目錄,用來(lái)搭建基于koa的web服務(wù)。
在這里,我們不妨給這個(gè)目錄起名為koa-demo。
然后執(zhí)行:
// 進(jìn)入目錄 cd koa-demo // 生成package.json npm init -y // 安裝以下依賴項(xiàng) npm i koa npm i koa-router npm i koa-cors
安裝好koa和兩個(gè)中間件,環(huán)境就算搭建完成了。
第二部分:示例開發(fā)
搭建環(huán)境是為了使用,所以我們立馬來(lái)寫一個(gè)demo出來(lái)。
demo開發(fā)既是一個(gè)練習(xí)如何在開發(fā)環(huán)境中寫代碼的過(guò)程,反過(guò)來(lái),也是一個(gè)驗(yàn)證環(huán)境搭建的對(duì)不對(duì)、好不好用的過(guò)程。
后端接口開發(fā)
本例中,后端我們只提供一個(gè)服務(wù),就是給前端提供一個(gè)返回json數(shù)據(jù)的接口。代碼中包含注釋,所以直接上代碼。
server.js文件
// server.js文件
let Koa = require('koa');
let Router = require('koa-router');
let cors = require('koa-cors');
// 引入modejs的文件系統(tǒng)API
let fs = require('fs');
const app = new Koa();
const router = new Router();
// 提供一個(gè)/getJson接口
router
.get('/getJson', async ctx => {
// 后端允許cors跨域請(qǐng)求
await cors();
// 返回給前端的數(shù)據(jù)
ctx.body = JSON.parse(fs.readFileSync( './static/material.json'));
});
// 將koa和兩個(gè)中間件連起來(lái)
app.use(router.routes()).use(router.allowedMethods());
// 監(jiān)聽3000端口
app.listen(3000);
這里面用到了一個(gè)json文件,在'./static/material.json'路徑,該json文件的代碼是:
// material.json文件
[{
"id": 1,
"date": "2016-05-02",
"name": "張三",
"address": "北京 清華大學(xué)",
}, {
"id": 2,
"date": "2016-05-04",
"name": "李四",
"address": "上海 復(fù)旦大學(xué)",
}, {
"id": 3,
"date": "2016-05-01",
"name": "王五",
"address": "廣東 中山大學(xué)",
}, {
"id": 4,
"date": "2016-05-03",
"name": "趙六",
"address": "廣東 深圳大學(xué)",
}, {
"id": 5,
"date": "2016-05-05",
"name": "韓梅梅",
"address": "四川 四川大學(xué)",
}, {
"id": 6,
"date": "2016-05-11",
"name": "劉小律",
"address": "湖南 中南大學(xué)",
}, {
"id": 7,
"date": "2016-04-13",
"name": "曾坦",
"address": "江蘇 南京大學(xué)",
}]
然后我們是用以下命令將服務(wù)啟動(dòng)
node server.js
測(cè)試接口是否良好
打開瀏覽器,輸入http://127.0.0.1:3000/getJson??匆豢错?yè)面上是否將json文件中的json數(shù)據(jù)顯示出來(lái),如果能夠顯示出來(lái),則說(shuō)明這個(gè)提供json數(shù)據(jù)的服務(wù),我們已經(jīng)搭建好了。
前端調(diào)用后端接口示例
為突出重點(diǎn),排除干擾,方便理解。我們的前端就寫一個(gè)組件,組件有兩部分:首先是一個(gè)按鈕,用來(lái)調(diào)用web服務(wù)的getJson接口;然后是一個(gè)內(nèi)容展示區(qū)域,拿到后端返回的數(shù)據(jù)以后,將其在組件的這塊區(qū)域顯示出來(lái)。
首先我們看組件文件吧
<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{
width:500px;
margin:10px auto;
min-height:500px;
background-color: palegreen;
}
</style>
非常簡(jiǎn)單,就不多解釋了。
然后看我們的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){
// 調(diào)用我們的后端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, 代碼擼完了。
說(shuō)說(shuō)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、又會(huì)遇到跨域,在webpack中修改,路徑config/index.js文件中添加proxyTable項(xiàng)的配置:
proxyTable: {
'/json': {
target: 'http://127.0.0.1:3000',
changeOrigin: true,
pathRewrite: {
'^/json': '/json'
}
}
},
后記
基于vue腳手架搭建的項(xiàng)目,模擬異步取數(shù)據(jù),也可以直接在腳手架生成的static文件夾下放置數(shù)據(jù),假裝是后臺(tái)拿過(guò)來(lái)的數(shù)據(jù)。
不過(guò)搭建一個(gè)基于express或者koa的web服務(wù),確實(shí)也該是一個(gè)前端工程師應(yīng)該掌握的。
OK,以上就是全文了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vue3+elementplus前端生成圖片驗(yàn)證碼完整代碼舉例
在開發(fā)過(guò)程中有時(shí)候需要使用圖片驗(yàn)證碼進(jìn)行增加安全強(qiáng)度,在點(diǎn)擊圖片時(shí)更新新的圖片驗(yàn)證碼,記錄此功能,以便后期使用,這篇文章主要給大家介紹了關(guān)于vue3+elementplus前端生成圖片驗(yàn)證碼的相關(guān)資料,需要的朋友可以參考下2024-03-03
unplugin-auto-import與unplugin-vue-components安裝問(wèn)題解析
這篇文章主要為大家介紹了unplugin-auto-import與unplugin-vue-components問(wèn)題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
vue.js element-ui tree樹形控件改iview的方法
這篇文章主要介紹了vue.js element-ui tree樹形控件改iview的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
Vue實(shí)現(xiàn)點(diǎn)擊圖片放大顯示功能
這篇文章主要為大家詳細(xì)介紹了如何利用Vue實(shí)現(xiàn)點(diǎn)擊圖片放大顯示功能,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的可以了解一下2023-03-03
Vue項(xiàng)目中解決數(shù)字精度丟失問(wèn)題
我們知道,浮點(diǎn)類型的數(shù)據(jù),在計(jì)算機(jī)中是以二進(jìn)制的方式存儲(chǔ)的,但是表示的數(shù)據(jù)也有個(gè)上限和下限,當(dāng)超過(guò)限制?,在計(jì)算機(jī)上顯示只能取最接近的限值,?數(shù)字解析精度丟失說(shuō)的就是這個(gè)現(xiàn)象,所以本文給大家介紹了Vue項(xiàng)目中解決數(shù)字精度丟失問(wèn)題的解決,需要的朋友可以參考下2024-02-02
Windows系統(tǒng)下使用nginx部署vue2項(xiàng)目的全過(guò)程
nginx是一個(gè)高性能的HTTP和反向代理服務(wù)器,因此常用來(lái)做靜態(tài)資源服務(wù)器和后端的反向代理服務(wù)器,下面這篇文章主要給大家介紹了關(guān)于Windows系統(tǒng)下使用nginx部署vue2項(xiàng)目的相關(guān)資料,需要的朋友可以參考下2023-03-03

