1. 程式人生 > >vue 快速入門與最佳實踐(vue-cli, webpack, vue 最佳實踐)

vue 快速入門與最佳實踐(vue-cli, webpack, vue 最佳實踐)

技術與依賴環境分層結構

ES6 語言
nodejs 底層環境

npm 高階庫

vue-cli 腳手架
webpack 打包編譯工具

vue 前端框架
vue-router
vuex
Less
ES6
ElementUI 元件庫
……

使用vue-cli 部署環境

環境依賴(nodejs”>= 4.0.0”, npm”>= 3.0.0”)

腳手架(vue-cli “2.5.1”):簡化手動配置安裝過程
打包工具(webpack “1.13.2”):打包、編譯工具
前端框架(Vue “2.1.0”):詳解見下節
高階語言(Less、 ES6):程式碼抽象程度高,更優美易讀,更易於維護
安裝

安裝 nodejs & npm

  npm --registry https://registry.npm.taobao.org info underscore  #配置國內代理
  npm install -g vue-cli  
  vue init webpack <my-project-name>  
  npm install  
  npm run dev 

Vue

元件化框架的作用

前端的元件化框架,本質上就是藉助virtual Dom幫助開發者管理混亂的Dom,並提供給開發者像操作狀態機一樣操作頁面的能力。

好處:程式碼和檔案結構更清晰易於維護

Vue 是什麼?能做什麼?

Vue 是典型MVVM框架,擁有雙向繫結的能力與完整的元件化方案,利用 virtual Dom 提供了函式式的 UI 程式設計方式

可以後端渲染

你不必做任何事就獲得完全優化的重渲染。

原理

  • 訂閱釋出模式,響應式資料流
  • 生命週期

訂閱釋出模式,響應式資料流

  • 訂閱釋出模式:訂閱者訂閱資訊,然後釋出者釋出資訊,訂閱者更新。
  • 在物件定義的過程中,通過get 得到訂閱者的依賴列表,通過set 釋出訊息從而訂閱者獲得更新通知
  • 從而實現資料流 v m 的同時更新
  var data = {}       //可理解為元件中的data  
  var name = "Peiduo" //元件中的一個屬性  
  var key = "name"  

  Object.defineProperty(data, key, {  
      get:function (){  
          setDepsList(key, name)    
          //訂閱者訂閱(設定 V 和 M 中使用該屬性的地方)  
          return name  
      },  
      set:function (value){  
          tellDepsListToUpdate(key, value)    
          //釋出者釋出(告知要更新的V 和M )  
          name = value  
      }  
  });  

  data.name += " Du"; //更新該屬性 

  function setDepsList(key, value) { 
    console.log("接收到屬性 " + key + ":" + value)
  }
  function tellDepsListToUpdate(key, value) {
    console.log("請更新"); 
    setDepsList(key, value)
  }

生命週期

生命週期圖示

常用API解讀與一些最佳實踐(不只是vue)

Vue 生命週期(keep-alive 保留元件狀態或避免重新渲染,將頁面快取到記憶體中)

每次初始化頁面會依次執行以下鉤子函式

beforeCreate
created
beforeMount
mounted
activated
beforeUpdate
updated

如果使用keep-alive標籤,在離開頁面時不銷燬頁面,會執行

deactivated

再次回到該頁面會執行

activated
beforeUpdate
updated

不使用keep-alive,離開時執行

beforeDestroy
destroyed

當再次回到該頁面將會再次全部執行一遍鉤子函式

變數繫結(容易產生的誤區)

在標籤中繫結變數時,如果傳輸字串(比如屬性名為 dataName)

dataName="dpd"  // dpd 就是一個字串,不是變數  

區別於字串的其它型別

:dataBool="true"  // 帶冒號則雙引號內表示為表示式  
:dataNumber="10"  
:dataArray="arrList" // arrList=[1,2,3]; 為陣列型別(來自data 或者 props 中)  

元件定義的方式

  1. 構成元件,專案中應用最多的 (props down, events up)
  2. 全域性元件,應用:通用元件
  3. 在特定結構標籤內使用元件
    <table>  
      <tr is="my-row"></tr>  
    </table>  

父子元件通訊機制

  • 父元件通知子元件: props引數傳遞的方式
  • 子元件通知父元件:事件繫結的方式

非父子元件通訊

  1. 有共同父元件的,通過共同的父元件控制
  2. vuex
  3. 全域性事件機制
  window.vueBus = new Vue()  

  // 觸發元件 A 中的事件  
  vueBus.$emit('id-selected', 1)  

  // 在元件 B 建立的鉤子中監聽事件  
  vueBus.$on('id-selected', function (id) {  
    // ...  
  })

過濾函式

  <input type="text" :value="dataValue | filterFun"></p>
  <p>{{dataValue | filterFun}}</p>
  filters: {
    filterFun(value) {
      if(value.indexOf("SB") >= 0) {
        value = value.replace(/SB/g, '**')
      }
      return value
    }
  }

slot 分發內容

如何使用子元件內的方法

當我們想要在父元件使用子元件內的方法時可以通過 子元件索引ref 實現

通常情況不需要使用子元件內的方法,通過改變其屬性即可,避免在模版或計算屬性中使用。
因為ref本身是作為渲染結果被建立的,在初始渲染的時候不能訪問它們 - 它們還不存在!$refs 也不是響應式的

v-else 內部使用迴圈的時候,v-else 有邏輯上的問題,for 優先順序比較高

for (item in list) {  
  else {  
    // create <tr> element.  
  }  
}  
  1. 可以使用如下方式替換

    v-if=”useA”
    v-if=”!useA”

  2. 外部用 template 包裹

Promise 是非同步程式設計的一種解決方案,比傳統的解決方案——回撥函式和事件——更合理和更強大。

將非同步操作以同步操作的流程表達出來,避免了層層巢狀的回撥函式。

Promise 的三種狀態

Pending(進行中)
Resolved(已完成,又稱 Fulfilled)
Rejected(已失敗)

  // 能被 2 整除就返回成功, 否則返回失敗
  var promise = new Promise(function(resolve, reject) {

    var number, value, error = "Not even";

    setTimeout(() => {

      number = Math.round(Math.random() * 1000)
      if(number%2 === 0) {
        resolve(value);

      } else {
        reject(error);
      }

    }, 1000)
  });

  promise.then( (value) => {
    console.log("success", value)

  }, (error) => {
    console.log("failure", error)
  })

鉤子是非同步解析執行,此時導航在所有鉤子 resolve 完之前一直處於 等待中。

beforeEach
beforeEnter // 某個路由獨享
……

vuex

提供了全域性狀態管理機制

webpack2.0 概念
中文
webpack is a module bundler.–模組打包機*

webpack 能做

  • Split the dependency tree into chunks loaded on demand(把依賴樹分割成塊按需載入)
  • Keep initial loading time low
  • Every static asset should be able to be a module
  • Ability to integrate 3rd-party libraries as modules (整合)
  • Ability to customize nearly every part of the module bundler (定製)
  • Suited for big projects

基本組成

  module.exports = {  
    entry: './src/app.js',
    output: {  
        path: './bin',  
        filename: 'app.bundle.js'  
    }  
  }  

resolve

路徑、檔案相關配置

Loaders(轉換器)

Loaders are special modules webpack uses to ‘load’ other modules (written in another language) into JavaScript (that webpack understands).

Loaders in webpack transform these files into modules as they are added to your dependency graph.

webpack 只認識javascript ,它把其他檔案看作是模組,加到依賴樹中

Plugins(外掛)

To do some additional processing of the bundle in your workflow.

額外的包整合、熱載入、語言轉換、壓縮、混淆等…

package

package 中版本前的符號~和^

    # [email protected] or later  
    npm update <package name>  
    npm update   
    # 更新所有package 到tags 中最新版本,包括全域性包、本地包、依賴        
    "dependencies": {  
      "dep1": "^1.1.1"  #可更新小於最大版本號的版本  
    }        
    "dependencies": {  
      "dep1": "~1.1.1"  #可更新最小版本號  
    }  
    npm update --save  
    # 更新 dependencies中包,package.json 會被修改(只寫了這裡)  
    npm update -g  
    # 更新全域性包  

專案架構

  • 入口(main.js -> index.html -> router -> app.vue -> router-> pages)
  • 配置(2處,工程級、專案級)
  • vuex(主要用於登入)
  • 路由(定義、引數的使用、生命週期鉤子的使用)
  • 請求層(基礎請求、快取層詳見下文)
  • 模型層(不改變介面資料,反回符合業務需求的資料模型)
  • 專案間通用元件(詳見下文)
  • 專案內通用元件(專案內部個性化的可重用元件)
  • 頁面(組織結構,頁面內元件組織結構)
  • 公共方法、工具類的提取(無依賴,可複用)
  • 靜態資源
  • 原理,檔案的軟連線
  • 管理方式 svn + gulp (ES6 -> ES5)
  • 使用:更新svn 進入專案目錄執行如下命令即可(nodejs 指令碼)
node initlink.js <componentPath> <programPath> <component^version> <component1^version>  
 node initlink.js /Users/dupeiduo/Desktop/Program/VueComponents/tags  /Users/dupeiduo/Desktop/Program/OSS/truck/vue-webpack  agrisz-map^1.0.0 agrisz-echart^1.0.0 agrisz-dialog^1.0.0 agrisz-button^1.0.0 agrisz-searchpoi^1.0.0  

設計與思考

記憶體快取機制(專案例項)

我們可以也有必要在任何統一入口處做一些事情

以資料為導向

  1. 做一個頁面先想清楚它所需要的資料 (立馬開始動手是大忌
  2. 理清巨集觀的整體頁面結構

頁面就像個機器,它的“變數”就是控制機器執行的操縱器,先清楚要有哪些操縱器

程式碼要有順序,有邏輯關係(努力方向)

按照載入的順序、操作的順序(人們容易理解的順序)
變數名方法名自上而下有邏輯關係

自頂向下 (分析問題的一種思維方式)

思想就是分解問題,問題分解後,單看每個小問題,就非常簡單了(不夠簡單那是分的不夠細)。

反映到程式碼中每個小問題就是一個方法,每個方法只做一件事。當分的足夠細的時候,程式碼抽象也就做好了

應用
  1. 工作流

    • 整理頁面所需資料
    • 搭建整體頁面結構(父元件結構,由多個子元件組成)
    • 設計子元件內部資料屬性,回撥事件
    • 模擬頁面操作邏輯,mock資料
    • 完善方法和樣式,除錯介面

    把有困難的或者可以分工的部分分配出去,從而達到最大限度分工協作

  2. 搭建專案結構可以用相同的思想

開發除錯方法、工具

debugger // 在js 程式碼中新增斷點
console.log(a,b,c) // 在js 程式碼中新增控制檯輸出
vuedevtool // vue 瀏覽器外掛(Chrome)

建議

對自己的程式碼有強烈的控制慾
對自己寫的程式碼有信心
對效能有極致需求的特殊情況,其實應該犧牲一些可維護性採取手動優化

瞭解

函數語言程式設計

到這裡能否掌握如下幾條

  1. 知道搭建一個全新的工程要做的事情有哪些,並能夠開始搭建
  2. 瞭解webpack 基礎配置
  3. 掌握工程的檔案結構
  4. 瞭解工程的啟動機制
  5. 掌握路由與其常用鉤子函式
  6. 瞭解 vuex 與使用場景
  7. 瞭解 vue 生命週期
  8. 掌握元件間的通訊機制
  9. 能夠獨立搭建一個專案並開始開發功能

討論與補充

相關推薦

vue 快速入門最佳實踐vue-cli, webpack, vue 最佳實踐

技術與依賴環境分層結構 ES6 語言 nodejs 底層環境 npm 高階庫 vue-cli 腳手架 webpack 打包編譯工具

VUE快速入門實踐

簡介 vue官網 vue.js是一套構建使用者介面的漸進式框架。 vue全家桶:vue.js+vue-router+vuex+axios 特點 核心只關注檢視層(view) 易學,輕量,靈活的特點 適用於移動端專案 漸進式框架 漸進式的理解 宣告式渲染(無

Vue.js前端開發快速入門專業應用

blank 角度 前端 介紹 實際應用 運用 get 指令 http 本書主要介紹 Vue.js 的使用方法和在實際項目中的運用,它既可以在一個頁面中單獨使用,也可以將整站都構建成單頁面應用。為了便於理解,本書會從傳統的開發角度切入,先從數據渲染、事件綁定等方面介紹在 Vu

vue快速入門

vue是什麼? 是一個漸進式框架,什麼是漸進式?漸進式框架,入手簡單,引入js,很快上手達到效果,使用元件,甚至整個框架都可以慢慢用元件來搭建。由小到大,專注於每個小元件,拼拼和和成一個大的模組。 MVVM: M: V VM

VueVue快速入門

class style 變化 方法名 ack count 回調 element 參數 Vue.js介紹 Vue.js的作者為Evan You(尤雨溪),曾任職於Google Creative Lab。 Vue文檔:https://cn.vuejs.org  

Vue快速入門

插入 同時 api 實例 HA 自定義指令 雙向數據綁定 amp 元素 Vue.js是當下很火的一個JavaScript MVVM庫,它是以數據驅動和組件化的思想構建的。相比於Angular.js,Vue.js提供了更加簡潔、更易於理解的API,使得我們能夠快速地上手並使用

【必看】認識VueVue快速入門Vue如何建立一個例項?Vue的生命週期,什麼是鉤子函式?

認識Vue Vue (讀音 /vjuː/,類似於 view) 是一套用於構建使用者介面的漸進式框架。與其它大型框架不同的是,Vue 被設計為可以自底向上逐層應用。Vue 的核心庫只關注檢視層,不僅易於上手,還便於與第三方庫或既有專案整合。另一方面,當與現代化的工具鏈以及各種支援類庫結合使

Vue快速入門-1-Vue的簡單使用

小生部落格:http://xsboke.blog.51cto.com如果有疑問,請點選此處,然後發表評論交流,作者會及時回覆。 -------謝謝您的參考,如有疑問,歡迎交流 目錄: 1. 簡單的將資料渲染到DOM 2. Vue的"v-"指令 3. "v-if"指令的

Vue快速入門-2-Vue框架高階操作

小生部落格:http://xsboke.blog.51cto.com如果有疑問,請點選此處,然後發表評論交流,作者會及時回覆。 -------謝謝您的參考,如有疑問,歡迎交流 目錄: 1. 自定義元件 2. 全域性註冊的自定義元件 3. 區域性註冊自定義元件 4. 元件的巢狀

Vue快速入門-2-Vue框架高級操作

定義變量 交流 全局變量 ava width 所有應用 ssa 發表 change 小生博客:http://xsboke.blog.51cto.com如果有疑問,請點擊此處,然後發表評論交流,作者會及時回復。 -------謝謝您的參考,如有疑問,歡迎交流

VUE快速入門新的——元件之間傳遞資料(1. Prop)

晚上好大家,元件我們在上邊文章中已經說過了,對大家還是有點幫助的應該。哈哈~~ 今天我們說一下關於元件之間資料是怎樣傳遞的?不難看出,其實元件之間的資料通訊,簡單的可以分為三類。 父元件向子元件傳遞 子元件向父元件傳遞 平級之間的元件資料傳遞 之前也有說

zookeeper學習筆記--快速入門叢集部署

一、分散式系統面臨的挑戰 什麼是分散式 分散式的特點 分散式技術 分散式面臨的問題   程序與程序之間 一、單體架構 Jvm內部呼叫 單點故障 二、叢集架構 分散式session問題》session c

vue-x儲存本地儲存localstorage、sessionstorage

sessionstorage 也稱會話快取,當用戶關閉瀏覽器視窗後,資料就會被刪除; localstorage 儲存的資料沒有時間限制,只要不刪除,都會存在 vue-x 一個專為 Vue.js 應用程式開發的狀態管理模式。它採用集中式儲存管理應用的所有元件的狀態,並以

vue.js入門提高實戰教程

Vue.js作為一個後起的前端框架,借鑑了Angular 、React等現代前端框架/庫的諸多特點,並且取得了相當不錯的成績。 vue.js的定位是一個漸進式框架,作者的說法是: 與其他框架的區別就是漸進式的想法,也就是Progressive——這

VUE快速入門,實用部分

     首先了解JQuery和Vue.js都是前端js庫。但是側重點不一樣,Jquery重點在於很靈活地操作DOM元素以及Ajax請求。然而,Vue.js的重點在於資料和DOM元素的繫結關係,最方便的地方是大量運用到ajax做頁面渲染的時候,非常快捷和方便。所以JQuer

深入淺出Istio:Service mesh快速入門實踐-讀書筆記(By GisonWin)

什麽 分配 mem ces 轉換成 初始化 virt 會有 ilo 01 服務網格歷史 (以後補充) 02 服務網格的基本特性 連接 微服務錯綜復雜,要完成其業務目標,連接問題是首要問題.連接存在於所有服務的整個lifcecycle中,用於維持服務的運行. 安全

【第三篇】ASP.NET MVC快速入門之安全策略MVC5+EF6

對象 code word 單身 script ticket bsp 金額 class 【第一篇】ASP.NET MVC快速入門之數據庫操作(MVC5+EF6) 【第二篇】ASP.NET MVC快速入門之數據註解(MVC5+EF6) 【第三篇】ASP.NET MVC快速入門之

css3彈性盒模型flex快速入門上手1

nes -1 相互 title 布局 viewport alt 默認值 lin 一、什麽是flex? flex是css3中引入的一種布局方式,可以非常靈活高效控制元素的排列與對齊方式,大多數人稱之為彈性布局. 二、怎麽使用flex? 任何一個容器都可以指定為flex布

Docker入門應用系列Docker私有公共鏡像倉庫

nbsp one 默認 span epo refers 1.8 png list 1.搭建私有鏡像倉庫Docker Hub作為Docker默認官方公共鏡像;如果想搭建自己的私有鏡像倉庫,官方提供registry鏡像,使搭建私有倉庫非常簡單1.1.1下載registry鏡像並

Docker入門應用系列Docker圖形界面管理之Shipyard

tps 數據庫 sock blog ocs body mage 代理 cell Shipyard基於Docker API實現的容器圖形管理系統,支持container、images、engine、cluster等功能,可滿足我們基本的容器部署需求可堆棧的Docker管理基於