如何更有效率和質(zhì)量地開發(fā)Vue項目

前言

自總結(jié)完了上篇前端工程化的思想冲粤,并在vue全家桶的項目加以實踐忿族,趁熱給大家總結(jié)一篇如何更有效率與質(zhì)量地開發(fā)vue項目,以及其中踩過的一個個坑塌计。伊脓。祷蝌。

基于vue-cli的自定義模板(Custom Templates)

小伙伴們的vue項目應(yīng)該都是用vue-cli初始化出來的棚蓄,但是vue-cli只是滿足了基礎(chǔ)配置和功能科平,如果你有額外的配置需求或者要迎合團(tuán)隊的業(yè)務(wù)配置,每新建個項目都得重新安裝額外配置奶是,比如說vuex坷随,sass温眉,封裝axios露懒,以及相關(guān)的文件夾。為了解決上述問題钦睡,vue-cli出了一個自定義模板功能象迎,你fork官方的模板下來然后進(jìn)行修改,然后用 vue-cli 來調(diào)用层坠。具體調(diào)用的場景有以下兩種

  • 直接拉取git源:
    當(dāng)你修改了模板并上傳了repo上,可執(zhí)行以下命令行來初始化
vue init username/repo my-project
  • 拉取本地的模板:
    當(dāng)你clone了官方模板在本地修改烦租,可執(zhí)行以下命令行來初始化
vue init ~/fs/path/to-custom-template my-project

還可以編寫meta.*(js,json)來選擇安裝哪些配置~
如果大家懶得去編寫vuex延赌,sass的配置,封裝axios的話叉橱,可以來通過我配置完的腳手架來初始化完項目~
vue init duosanglee/vuejs-custom-template

這個模板在repo里ps:我的這個模板的代碼風(fēng)格是基于standard的

引入sass全局變量挫以,mixin,function等

首先我們考慮下以下場景:當(dāng)使用rem開發(fā)移動端的時候窃祝,你定義了一個方法pxToRem的方法來實現(xiàn)px對rem的轉(zhuǎn)換掐松,然后在工程里為每個.vue文件@import 'public.scss',得import很多很多很多次,萬一public.scss路徑變了的話大磺。抡句。「芾ⅲ哭都來不及待榔。
這時候sass-resources-loader就來拯救我們了,他可以省去重復(fù)性的引入流济,還支持LESS锐锣,POSTCSS
具體用法如下:

  • npm install -D sass-resources-loader
  • 首先得找到項目里的build文件夾,找到util.js
    添加一下代碼
function resolveResouce(name) {
return path.resolve(__dirname, '../src/style/' + name);
}
function generateSassResourceLoader() {
var loaders = [
 cssLoader, 
 // 'postcss-loader', 'sass-loader',
 {
     loader: 'sass-resources-loader',
     options: {
       // it need a absolute path
       resources: [resolveResouce('common.scss')]
     }
 }
    ];
if (options.extract) {
return ExtractTextPlugin.extract({
use: loaders,
   fallback: 'vue-style-loader'
 })
    } else {
return ['vue-style-loader'].concat(loaders)
    }
}

然后還是在當(dāng)前文件里找到

return {
  css: generateLoaders(),
  postcss: generateLoaders(),
  less: generateLoaders('less'),
  sass: generateLoaders('sass', { indentedSyntax: true }),
  scss: generateLoaders('sass'),
  stylus: generateLoaders('stylus'),
  styl: generateLoaders('stylus')
}

替換成

return {
  css: generateLoaders(),
  postcss: generateLoaders(),
  less: generateLoaders('less'),
  sass: generateSassResourceLoader(),
  scss: generateSassResourceLoader(),
  stylus: generateLoaders('stylus'),
  styl: generateLoaders('stylus')
}

這樣就可以在項目里使用sass全局變量绳瘟,mixin雕憔,function了~~

在線 Mock 平臺 easy-mock

現(xiàn)在講都是前后端分離,前后端并行開發(fā)來提高開發(fā)效率稽荧,通過一個api文檔來協(xié)作橘茉,所以一個好的mock工具對于提高效率也至關(guān)重要~
這里極力推薦easy-mock工具,支持團(tuán)隊協(xié)作編輯姨丈,生成模擬數(shù)據(jù)的在線 mock 服務(wù)畅卓,還支持導(dǎo)入swagger文檔等功能,界面如下

定義全局變量

在項目會有需要使用全局變量的需求,來處理一些頻繁的操作蟋恬,大家都應(yīng)該會綁定到window對象上翁潘,但是這種方式不適合服務(wù)端渲染,因為服務(wù)端沒有 window 對象, 是 undefined, 當(dāng)試圖去訪問屬性時會報錯.我總結(jié)了兩個靠譜的方法

  • 代理到Vue的原型對象
    由于所有的組件都會從 Vue 的原型對象上繼承它們的方法, 因此我們只要
Object.defineProperty(Vue.prototype, '$xxx', { value: xxx });

就可以在所有組件/實例中通過 this.$xxx: 的方式訪問插件了而不需要定義全局變量或者手動的引入了

至于為什么要用Object.defineProperty這個方法歼争,是因為通過Object.defineProperty綁定的屬性是只讀的拜马,以防一起開發(fā)項目的協(xié)(zhu)作(dui)者(you)去重寫或者覆蓋該方法的值。

  • vuex大法
    vuex的出現(xiàn)就是vue為了集中式存儲管理應(yīng)用的所有組件的狀態(tài)沐绒,所以說全局變量和方法都可以放到vuex當(dāng)中~具體用法就不加闡述了俩莽,大家可仔細(xì)閱讀vuex文檔

組件設(shè)計

大家都知道組件化的思想就是分治,幾乎任意類型的應(yīng)用程序界面乔遮,都可以抽象為一個組件樹扮超,那我們該按照什么規(guī)則把應(yīng)用抽象成組件,來應(yīng)對復(fù)雜多變的業(yè)務(wù)需求呢蹋肮。
我們從通信出刷、黑箱,繼承這幾個角度來看看

  • 通信: vue的父子組件通信機制是props down坯辩,events up馁龟,盡量保持松耦合,一直保持單向數(shù)據(jù)流的特點漆魔,并加以強約束坷檩。需要注意的時候却音,盡可能減少跨組件通信,例如使用$parent淌喻,$root僧家。
  • 繼承: 當(dāng)兩個組件存在些許的共性,又存在足夠的差異性的時候裸删,就可以用到vue的繼承---mixin八拱,他允許你封裝一塊在應(yīng)用的其他組件中都可以使用的函數(shù)。如果使用姿勢正確涯塔,他們不會改變函數(shù)作用域外部的任何東西肌稻。而且mixin還有各種高階用法拱烁,大家可自行查詢(我也不會)夕玩。
  • 黑箱: 組件的黑箱狀態(tài)既只暴露易變的接口和方法禽篱,渲染給入的數(shù)據(jù)昂芜,組件內(nèi)部封裝不變的邏輯。
  • 設(shè)計模式原則: 運用設(shè)計模式原則凌彬,比如單一職責(zé)原則变屁,將組件拆分抽離成更細(xì)粒度议惰,保證高內(nèi)聚性践惑;再如接口隔離原則腹泌,采用穩(wěn)定的服務(wù)端接口,將變化模塊分離尔觉,使得組件得以解耦凉袱;里氏替換原則、依賴倒置原則等等侦铜。

目錄結(jié)構(gòu)

-- src
    -- assets                      # 私有資源
    -- common                      # 通用組件
    -- components                  # 業(yè)務(wù)組件
    -- api.js                      # 請求文件      
    -- config                      # 環(huán)境變量配置
        -- env.js                  # 環(huán)境變量文件
        -- http.js                 # 封裝axios文件
    -- pages                       # 頁面維度
        -- pageA                   # 頁面A
            -- pageA.vue           # 頁面A單文件
            -- pageA-components    # 頁面A下的一個組件
            -- children            # 子頁面
    -- router                      # 路由
        -- index.js                # 路由入口
        -- routes.js               # 路由配置信息
    -- store                       # vuex
        -- modules                 # vuex模塊
        -- index.js                # vuex入口
    -- utils                       # js通用方法
    -- app.vue                     # 頂層單文件
    -- main.js                     # 入口

大家可以從目錄結(jié)構(gòu)中看出我整個項目分割的思維
首先我把組件分為通用組件和業(yè)務(wù)組件兩大類专甩。

  1. 通用組件是與業(yè)務(wù)耦合低,是有簡單狀態(tài)或者無狀態(tài)的钉稍,數(shù)據(jù)幾乎全部依賴于輸入涤躲,它只負(fù)責(zé)渲染給入的數(shù)據(jù)。比如按鈕是一個組件贡未,可能有一個參數(shù)決定了它的尺寸种樱,一個參數(shù)決定了它是否可以點擊,但是點擊這個按鈕之后會發(fā)生什么羞秤,就不是按鈕這個組件需要知道的事情了。

  2. 業(yè)務(wù)組件是與業(yè)務(wù)耦合高左敌,可以由多個通用組件和其他的業(yè)務(wù)組件組成瘾蛋,會擁有一些方法,用來修改持有的數(shù)據(jù)矫限,對內(nèi)來看哺哼,它自己持有一些數(shù)據(jù)和方法佩抹,用來決定內(nèi)容的渲染,對外又是一個簡單的props接受數(shù)據(jù)取董」髌唬可以理解為組件樹的非葉子節(jié)點,通過自身數(shù)據(jù)變化茵汰,進(jìn)而操縱子組件的內(nèi)容枢里。

然后config文件夾放置了環(huán)境變量文件env.js和封裝http庫文件http.js

env.js

http.js

然后我把路由里的routes.js和api.js請求文件都單獨抽離了出來。

自動生成雪碧圖

前端項目中自動生成雪碧圖節(jié)省了我們很多的時間蹂午,我們只要把圖片扔到文件夾里栏豺,webpack-spritesmith就能按照我們設(shè)定的規(guī)則自動合成css-sprite,安裝配置如下:

var SpritesmithPlugin = require('webpack-spritesmith');
...
module.exports = {
  ...
  plugins: [
    new SpritesmithPlugin({
      src: {
        cwd: './src/assets/sp/',
        glob: '*.png'
      },
      target: {
        image: './src/assets/sprite/sprite.png',
        css: './src/assets/sprite/sprite.css'
      },
      apiOptions: {
        cssImageRef: './sprite.png'
      },
      spritesmithOptions: {
        algorithm: 'top-down',
        padding: 100
      }
    })
  ]
}

自動修復(fù)eslint格式錯誤

這個功能的建立在小伙伴的開發(fā)工具是vscode情況下~
首先在vscode擴展里面安裝vscode的eslint插件豆胸,然后settings.json里添加如下配置

"eslint.validate": [
    "javascript",
    "javascriptreact",
    {
        "language": "html",
        "autoFix": true
    },
    {
        "language": "vue",
        "autoFix": true
    }
],
"eslint.autoFixOnSave": true,

然后會在save文件的時候eslint插件自動根據(jù)項目下的.eslintrc來設(shè)置代碼格式~
sf不支持播放gif..具體效果大家只能自行查看

跨域

在瀏覽vue-cli的官方文檔時候發(fā)現(xiàn)了vue-cli自帶了API proxy奥洼,解決了在項目中后端聯(lián)調(diào)的時候的跨域問題。具體安裝配置如下:
首先我們找到config文件下的index.js,再找到dev對象下的proxyTable屬性晚胡,然后把以下代碼添加進(jìn)去

proxyTable: {
  '/api': {
    target: '網(wǎng)站名',
    pathRewrite: {
      '^/api': ''
    }
  }
}

然后重啟本地服務(wù)器灵奖,這樣你發(fā)送的/api/a就會代理發(fā)送到"網(wǎng)站名/a"了~

開發(fā)利器emmet

之所以稱emmet為前端開發(fā)利器是因為他可以根據(jù)我們所輸入的縮寫來得到相應(yīng)的內(nèi)容,大大節(jié)省我們的開發(fā)html和css的時間估盘,例:

  • 輸入ul>li*2>span 按下擴展鍵
<ul>
<li><span></span></li>
<li><span></span></li>
</ul>
  • 輸入m0-a-0-0+posa+bgc 按下擴展鍵
margin: 0 auto 0 0;
position: absolute;
background-color: #fff;

更多方法請看官方文檔emmet
這篇文章到此就已經(jīng)結(jié)束了感謝大家能夠關(guān)注此文章如果這篇文章能幫助到大家的話瓷患,麻煩請幫我點個贊~~~
大家有啥想法可在下面評論,也可以加我QQ:757592499來討論~

原文:如何更有效率和質(zhì)量地開發(fā)Vue項目

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末忿檩,一起剝皮案震驚了整個濱河市尉尾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌燥透,老刑警劉巖沙咏,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異班套,居然都是意外死亡肢藐,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門吱韭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吆豹,“玉大人,你說我怎么就攤上這事理盆《幻海” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵猿规,是天一觀的道長衷快。 經(jīng)常有香客問我,道長姨俩,這世上最難降的妖魔是什么蘸拔? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任师郑,我火速辦了婚禮调窍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘邓萨。我一直安慰自己,他們只是感情好先誉,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著褐耳,像睡著了一般诈闺。 火紅的嫁衣襯著肌膚如雪铃芦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天刃滓,我揣著相機與錄音,去河邊找鬼咧虎。 笑死卓缰,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的砰诵。 我是一名探鬼主播征唬,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼茁彭!你這毒婦竟也來了总寒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤理肺,失蹤者是張志新(化名)和其女友劉穎摄闸,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體妹萨,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡年枕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了乎完。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片熏兄。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出霍弹,到底是詐尸還是另有隱情,我是刑警寧澤娃弓,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布典格,位于F島的核電站,受9級特大地震影響台丛,放射性物質(zhì)發(fā)生泄漏耍缴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一挽霉、第九天 我趴在偏房一處隱蔽的房頂上張望防嗡。 院中可真熱鬧,春花似錦侠坎、人聲如沸蚁趁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽他嫡。三九已至,卻和暖如春庐完,著一層夾襖步出監(jiān)牢的瞬間钢属,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工门躯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留淆党,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓讶凉,卻偏偏與公主長得像染乌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子缀遍,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

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

  • 項目地址:TwinklingRefreshLayout 本文分析版本:0a9b613 1.簡介 以下是 Twin...
    Tyler閱讀 1,346評論 0 6
  • 文/藝莫拍攝/藝莫 下班正往大門方向 剛到轉(zhuǎn)角旁 遇見快要西墜的夕陽 美的讓人癡狂 你看它灼熱的臉龐 猶如天邊點起...
    藝莫閱讀 412評論 0 13