vue項(xiàng)目搭建并設(shè)計(jì)簡(jiǎn)單的架構(gòu)(2019-07-13---15)


準(zhǔn)備階段
  1. 安裝nodejs棠耕、npm
  2. 全局安裝vue、vue-cli
  3. 全局安裝webpack
  4. 在合適的位置建一個(gè)項(xiàng)目文件夾
開(kāi)始

打開(kāi)你的Terminal(MAC)或者cmd(windows)
一路cd到你的項(xiàng)目文件夾
通過(guò)vue-cli腳手架搭建項(xiàng)目:vue init webpack xxx xxx為你的項(xiàng)目名
設(shè)置項(xiàng)目名柠新、描述窍荧、作者、是否使用vue-router(使用)恨憎、是否使用ESLint(雖然很有用但是我不喜歡用哈哈)蕊退、單元測(cè)試(不需要)、e2e (NO)、使用npm...反正就是一路回車咕痛,看自己需求搭建痢甘。

項(xiàng)目初始化

用vscode打開(kāi)項(xiàng)目,在終端處cd到初始化的項(xiàng)目目錄運(yùn)行npm start

npm start

好了 項(xiàng)目初始化搞定??
打開(kāi)你的瀏覽器輸入http://localhost:8080就可以看到Vue的界面了


簡(jiǎn)單設(shè)計(jì)項(xiàng)目架構(gòu)

項(xiàng)目有一個(gè)設(shè)計(jì)合理的架構(gòu)是非常重要的茉贡,不同的文件不同的代碼做著不同的工作塞栅,我們現(xiàn)在要給他們劃分開(kāi),一人一個(gè)坑??
新建幾個(gè)文件夾讓你的自動(dòng)生成的項(xiàng)目目錄長(zhǎng)成這樣 /* ?? */

項(xiàng)目目錄結(jié)構(gòu)


utils工具類

在這里我們定義一些開(kāi)發(fā)時(shí)會(huì)用到的工具類腔丧,例如封裝axios放椰、時(shí)間格式化工具、封裝本地存儲(chǔ)等


屏幕快照 2019-07-13 下午3.13.28.png

例子:http.js 簡(jiǎn)單封裝axios
baseURL就是你要訪問(wèn)的地址的ip和端口號(hào)

import axios from 'axios'

let httpInstance = axios.create()

// httpInstance.defaults.baseURL = 'http://172.20.10.2:3001'//iphone熱點(diǎn)
// httpInstance.defaults.baseURL = 'http://172.30.10.127:3001' //公司ip
//httpInstance.defaults.baseURL = 'http://39.97.114.146:3001' //服務(wù)器地址
// httpInstance.defaults.baseURL = 'http://192.168.1.109:3001' //軟件園5號(hào)樓宿舍
httpInstance.defaults.baseURL = 'https://api.apiopen.top/' //發(fā)放接口


httpInstance.defaults.timeout = 5000

//POST 請(qǐng)求
httpInstance.formurl = (url, data, config) => {
  return httpInstance.post(url, data, {
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded'
    },
    ...config
  })
};

//  request攔截器
httpInstance.interceptors.request.use(
  config => {
    //這里寫攔截后你需要的操作
    //例如:
    // if (store.getters.token) {
    //   config.headers['Authoriztion'] = store.getters.token; //讓每個(gè)請(qǐng)求都攜帶token
    // }
    // config.headers['Content-Type'] = 'application/x-www-form-urlencoded'
    return config
  },
  error => {
    console.log('err' + error) //only for debug ~~~
    return Promise.reject(error)
  }
)
//  reponse攔截器
httpInstance.interceptors.response.use(
  response => {
    if (response.status === 200) {
      return Promise.resolve(response)
    }
  },
  error => {
    return Promise.reject(error)
  }
)
export default httpInstance



api.js 接入后端服務(wù)的api管理

對(duì)所有訪問(wèn)后端的接口進(jìn)行統(tǒng)一管理可以使復(fù)雜的系統(tǒng)變得有條理愉粤,可以使開(kāi)發(fā)時(shí)候思路更清晰砾医,也方便管理維護(hù),我們建一個(gè)api文件夾衣厘,不同類別的接口各自定義在自己的模塊中如蚜,那里出錯(cuò)就去哪里找問(wèn)題。


api管理
例子:userApi.js
import HttpUtils from '../utils/http'

const UserApi = {
  userLogin: (params) => {
    let url = '/login';
    return HttpUtils.post(url, params)
  },
  userRegist: (params) => {
    let url = '/regist';
    return HttpUtils.post(url, params)
  }
}

export default UserApi;

在業(yè)務(wù)界面調(diào)用接口時(shí)直接使用定義好的接口就ok啦?? /* ?? */

import UserApi from "../api/userApi";

UserApi.userLogin({ account: 666 , password: 'wozhende666' })
  .then(res => {
     console.log(res);
   })
  .catch(err => {
     console.log(err);
   });

這樣最終訪問(wèn)的地址就是http.js中的baseURL+userApi.js中定義的接口:
https://api.apiopen.top/login 也就是后端接口放的地方影暴,把公共部分提取出來(lái)為baseURL错邦,不同的接口在api管理中來(lái)區(qū)分??


項(xiàng)目路由router

由 前端 來(lái)控制頁(yè)面的跳轉(zhuǎn)(但其實(shí)是個(gè)單頁(yè)面),根據(jù)不同的 url 地址展示不同的內(nèi)容和頁(yè)面型宙。
優(yōu)點(diǎn):體驗(yàn)好撬呢,不需要每次從服務(wù)器獲取全部,快速展現(xiàn)給用戶妆兑;
缺點(diǎn):不利于SEO魂拦;使用瀏覽器的前進(jìn),后退鍵的時(shí)候會(huì)重新發(fā)送請(qǐng)求搁嗓,沒(méi)有合理的利用緩存芯勘;單頁(yè)面無(wú)法記住之前滾動(dòng)的位置,無(wú)法在前進(jìn)和后退的時(shí)候記住滾動(dòng)的位置腺逛。

路由的結(jié)構(gòu)設(shè)計(jì)可以按自己的項(xiàng)目頁(yè)面結(jié)構(gòu)情況來(lái)設(shè)計(jì)
我一般的習(xí)慣是將頭部借尿,底部等公共的部分抽離出來(lái)放到外層,各個(gè)業(yè)務(wù)界面定義為子路由
舉個(gè)?? /* ?? */

import Vue from 'vue'
import Router from 'vue-router'
import Home from "../views/home";
import Index from '../views/index'
import FirstPage from '../views/firstpage/firstpage.vue'
Vue.use(Router)

export default new Router({
  routes: [{
    path: '/',
    name: 'home',
    component: Home,
    redirect: '/index', //配置默認(rèn)子路由為index
    children: [{
      path: '/index',
      name: 'index',
      component: Index,
    }, {
      path: '/firstpage',
      name: 'firstpage',
      component: FirstPage,
    }]
  }]
})
頁(yè)面結(jié)構(gòu)

view下有個(gè) home.vue是入口頁(yè)面屉来,頁(yè)面的頭部和底部抽離出來(lái)在這里使用路翻,在頭部和底部之間又定義了一層二級(jí)路由(在router.js中配置了children)index.vue是首頁(yè),其他頁(yè)面文件按功能不同進(jìn)行分類茄靠,在定義路由的時(shí)候要弄清楚層級(jí)關(guān)系
home.vue代碼如下:

<template>
  <div>
    <top-header></top-header>
    <router-view></router-view>
    <top-footer></top-footer>
  </div>
</template>

<script>
import TopHeader from "../components/layout/top_header";
import TopFooter from "../components/layout/top_footer";
export default {
  name: "",
  components: { TopHeader, TopFooter },
  data() {
    return {};
  }
};
</script>

<style scoped>
</style>

效果如下



如圖地址改變只是改變了中間需要改變的部分茂契,頭部和底部不用重新渲染,同時(shí)在寫代碼的時(shí)候也不需要每次都寫那些代碼慨绳,方便多了不是嗎掉冶?


狀態(tài)管理

由于前端技術(shù)爆發(fā)式發(fā)展真竖,SPA、組件化厌小、模塊化等概念被炒的飛起恢共,項(xiàng)目中各個(gè)模塊如果需要共同狀態(tài)或者說(shuō)數(shù)據(jù)的話,就需要組件間通訊璧亚,但是如果業(yè)務(wù)結(jié)構(gòu)一層套一層讨韭,數(shù)據(jù)狀態(tài)在父、子癣蟋、孫透硝、曾孫... 之間傳遞的時(shí)候很容易就亂了,于是在項(xiàng)目比較大的時(shí)候疯搅,出于對(duì)項(xiàng)目架構(gòu)的靈活性考慮就要使用狀態(tài)管理濒生。
常見(jiàn)的狀態(tài)管理技術(shù):mobx Vuex Reduex

簡(jiǎn)單來(lái)說(shuō)說(shuō)vuex

在store文件夾下新建store.js
store.js

import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);

export default new Vuex.Store({
  name: 'store',
  state: {
    //定義要進(jìn)行狀態(tài)管理的數(shù)據(jù)
    count: 0
  },
  //改變state的屬性的值的方法放在mutations里
  mutations: {
    increment(state) {
      state.count += 1
    },
    decrement(state) {
      state.count -= 1
    }
  }
})

在main.js中將store掛載到全局下每一個(gè)組件上

import store from './store/store'
new Vue({
  el: '#app',
  router,
  store,
  components: { App },
  template: '<App/>'
})

當(dāng)你需要使用store中的某一數(shù)據(jù)時(shí),你可以這樣:
{{$store.state.count}}對(duì)沒(méi)錯(cuò)幔欧,就是直接用哈哈
這里要記住一定不要忘了$罪治,我就老忘???♂?
當(dāng)要改變數(shù)據(jù)的狀態(tài)時(shí),要把改變數(shù)據(jù)的邏輯寫在store.js的 mutaiins 中?? 請(qǐng)看上上個(gè)圖
使用時(shí)是這樣??
index.vue

<template>
  <div>
    <button @click="$store.commit('increment')">+</button>    
    <button @click="$store.commit('decrement')">-</button>
    <button @click="change">change</button>
  </div>
</template>

<script>
export default {
  name: "",
  components: {},
  data() {
    return {};
  },
  created() {},
  methods: {
    change() {
      this.$store.commit({
        type: "decrement",
        amount: 10
      });
    }
  }
};
</script>

<style scoped>
</style>

直接在行內(nèi)調(diào)用礁蔗【跻澹或者像第三個(gè)按鈕一樣綁定事件都可以。


??因?yàn)槲姨珣辛耸蒴铮瑺顟B(tài)管理還有許多更方便有趣的內(nèi)容谁撼,這里只是提了冰山一角歧胁,最最最基礎(chǔ)的使用
??這篇文章最初開(kāi)始寫的目的只是因?yàn)槊看谓?xiàng)目總是覺(jué)得不完美滋饲,這里那里差點(diǎn)東西的樣子,擼個(gè)文鞏固一下喊巍,并且也規(guī)范一下自己建一個(gè)合理屠缭、邏輯清晰的目錄結(jié)構(gòu)
??關(guān)于架構(gòu)部分,本人還是個(gè)前端小學(xué)生崭参,在這里根據(jù)自己對(duì)項(xiàng)目結(jié)構(gòu)的理解呵曹,覺(jué)得哪些技術(shù)在工程中需要就設(shè)計(jì)了哪些,如果又不合理或者有錯(cuò)誤的地方還請(qǐng)指正何暮!
??如果覺(jué)得哪里還需要完善歡迎留言奄喂!
??本篇還會(huì)繼續(xù)修正、更新海洼。
??求點(diǎn)贊跨新、分享。轉(zhuǎn)發(fā)請(qǐng)備注作者出處
志同道合的小伙伴可以加微信:tong961790??

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末坏逢,一起剝皮案震驚了整個(gè)濱河市域帐,隨后出現(xiàn)的幾起案子赘被,更是在濱河造成了極大的恐慌,老刑警劉巖肖揣,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件民假,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡龙优,警方通過(guò)查閱死者的電腦和手機(jī)羊异,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)陋率,“玉大人球化,你說(shuō)我怎么就攤上這事⊥咴悖” “怎么了筒愚?”我有些...
    開(kāi)封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)菩浙。 經(jīng)常有香客問(wèn)我巢掺,道長(zhǎng),這世上最難降的妖魔是什么劲蜻? 我笑而不...
    開(kāi)封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任陆淀,我火速辦了婚禮,結(jié)果婚禮上先嬉,老公的妹妹穿的比我還像新娘轧苫。我一直安慰自己,他們只是感情好疫蔓,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布含懊。 她就那樣靜靜地躺著,像睡著了一般衅胀。 火紅的嫁衣襯著肌膚如雪岔乔。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天滚躯,我揣著相機(jī)與錄音雏门,去河邊找鬼。 笑死掸掏,一個(gè)胖子當(dāng)著我的面吹牛茁影,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播丧凤,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼募闲,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了息裸?” 一聲冷哼從身側(cè)響起蝇更,我...
    開(kāi)封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤沪编,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后年扩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蚁廓,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年厨幻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了相嵌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡况脆,死狀恐怖饭宾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情格了,我是刑警寧澤看铆,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站盛末,受9級(jí)特大地震影響弹惦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜悄但,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一棠隐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧檐嚣,春花似錦助泽、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至挖藏,卻和暖如春暑刃,著一層夾襖步出監(jiān)牢的瞬間厢漩,已是汗流浹背膜眠。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留溜嗜,地道東北人宵膨。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像炸宵,于是被迫代替她去往敵國(guó)和親辟躏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容