目標(biāo):了解Vue, 了解常用的Vue的一些工具,用vue cli搭建一個(gè)測試用例洛波,在瀏覽器上面運(yùn)行起來全肮。
了解Vue
百科定義
Vue (讀音 /vju?/塞蹭,類似于 view) 是一套用于構(gòu)建用戶界面的漸進(jìn)式JavaScript框架。與其它大型框架不同的是门坷,Vue 被設(shè)計(jì)為可以自底向上逐層應(yīng)用宣鄙。Vue 的核心庫只關(guān)注視圖層,方便與第三方庫或既有項(xiàng)目整合默蚌。
同類的技術(shù)
AngularJS: 誕生于2009年冻晤,由Misko Hevery 等人創(chuàng)建,后為Google所收購绸吸。是一款優(yōu)秀的前端JS框架鼻弧,已經(jīng)被用于Google的多款產(chǎn)品當(dāng)中设江。AngularJS有著諸多特性,最為核心的是:MVC(Model–view–controller)攘轩、模塊化叉存、自動(dòng)化雙向數(shù)據(jù)綁定、語義化標(biāo)簽度帮、依賴注入等等歼捏。
React: 起源于 Facebook 的內(nèi)部項(xiàng)目,因?yàn)樵摴緦?duì)市場上所有 JavaScript MVC 框架够傍,都不滿意甫菠,就決定自己寫一套,用來架設(shè) Instagram 的網(wǎng)站冕屯。做出來以后寂诱,發(fā)現(xiàn)這套東西很好用,就在2013年5月開源了安聘。主要用于構(gòu)建UI痰洒,很多人認(rèn)為 React 是 MVC 中的 V(視圖)。
AngularJS浴韭、React丘喻、Vue.js并稱前端3大框架。
同類技術(shù)優(yōu)缺點(diǎn)
[站外圖片上傳中...(image-455a7b-1591406644886)]
優(yōu)點(diǎn) | 缺點(diǎn) | |
---|---|---|
Vue.js | 輕量級(jí),學(xué)習(xí)成本低 | 生態(tài)不太成熟 |
angularJS | 有優(yōu)秀的組件系統(tǒng) | 學(xué)習(xí)曲線是非常陡峭 |
React | 豐富的生態(tài)系統(tǒng) | 學(xué)習(xí)曲線陡峭 |
vue對(duì)比鏈接:https://cn.vuejs.org/v2/guide/comparison.html#AngularJS-Angular-1
vue vs React :合嚴(yán)格的 Flux 架構(gòu)念颈,適合超大規(guī)模多人協(xié)作的復(fù)雜項(xiàng)目泉粉。理論上 Vue 配合類似架構(gòu)也可以勝任這樣的用例,但缺少類似 Flux 這樣的官方架構(gòu)榴芳。小快靈的項(xiàng)目上嗡靡,Vue 和 React 的選擇更多是開發(fā)風(fēng)格的偏好。對(duì)于需要對(duì) DOM 進(jìn)行很多自定義操作的項(xiàng)目窟感,Vue 的靈活性優(yōu)于 React讨彼。
vue vs Angular:Angular的學(xué)習(xí)曲線是非常陡峭的——作為一個(gè)框架,它的 API 面積比起 Vue 要大得多柿祈,你也因此需要理解更多的概念才能開始有效率地工作哈误。當(dāng)然,Angular 本身的復(fù)雜度是因?yàn)樗脑O(shè)計(jì)目標(biāo)就是只針對(duì)大型的復(fù)雜應(yīng)用躏嚎;但不可否認(rèn)的是蜜自,這也使得它對(duì)于經(jīng)驗(yàn)不甚豐富的開發(fā)者相當(dāng)?shù)牟挥押谩?/p>
漸進(jìn)式JavaScript框架
vue官網(wǎng)的第一句話就是漸進(jìn)式JavaScript框架,我的理解就是循序漸進(jìn)可以自底向上逐層應(yīng)用開發(fā)的框架紧索,可以單獨(dú)一個(gè)頁面用來做表單袁辈,也可以整個(gè)項(xiàng)目用來做框架,可以一步一步引入vue珠漂,模塊化需要那個(gè)就引入那個(gè)晚缩。
Vue時(shí)間軸
[站外圖片上傳中...(image-4996c9-1591406644886)]
2013: 在Google工作的尤雨溪尾膊,受到Angular的啟發(fā),從中提取自己所喜歡的部分荞彼,開發(fā)出了一款輕量框架冈敛,最初命名為Seed。
2013.12:這粒種子發(fā)芽了鸣皂,更名為Vue抓谴,版本號(hào)是0.6.0。
2014.01.24:Vue正式對(duì)外發(fā)布寞缝,版本號(hào)是0.8.0癌压。
2014.02.25:vue版本0.9.0發(fā)布(代號(hào)Animatrix動(dòng)畫版的駭客帝國),此后重要的版本都會(huì)有自己的代號(hào)荆陆。
2015.06.13:vue版本0.12.0發(fā)布(代號(hào)Dragon Ball龍珠)滩届,這一年Vue大爆發(fā),Laravel 社區(qū)(一款流行的 PHP 框架的社區(qū))首次使用 Vue被啼,Vue在JS社區(qū)也打響了知名度帜消。
2015.08.18:vue里程碑-新世紀(jì)福音戰(zhàn)士發(fā)布。vue-router(2015-08-18)浓体、vuex(2015-11-28)泡挺、vue-cli(2015-12-27)相繼發(fā)布,標(biāo)志著 Vue從一個(gè)視圖層庫發(fā)展為一個(gè)漸進(jìn)式框架命浴。
2016.9.3:尤雨溪正式宣布加盟阿里巴巴Weex團(tuán)隊(duì)娄猫,尤雨溪稱他將以技術(shù)顧問的身份加入 Weex 團(tuán)隊(duì)來做 Vue 和 Weex 的 JavaScript runtime 整合,目標(biāo)是讓大家能用 Vue 的語法跨三端
2016.9.30: vue版本2.0.0 (Ghost in the Shell 攻殼機(jī)動(dòng)隊(duì))發(fā)布生闲,這是第二個(gè)重要的里程碑稚新,它吸收了React的Virtual Dom方案,還支持服務(wù)端渲染跪腹。
2018.9.30: 發(fā)布了 Vue 3.0 的開發(fā)路線,會(huì)保持與 2.x 的兼容并表示將從頭開始重寫 3.0
2019.2.4:vue版本2.6.0 (Macross超時(shí)空要塞)發(fā)布了飞醉。新增了Scoped slots(作用域插槽)的新語法冲茸、 動(dòng)態(tài)參數(shù)指令、響應(yīng)對(duì)象等新特性缅帘。
一點(diǎn)小知識(shí)
Vue學(xué)習(xí)之前需要了解:
Node.js:運(yùn)行在服務(wù)端的 JavaScript轴术,是一個(gè)事件驅(qū)動(dòng)I/O服務(wù)端JavaScript環(huán)境,基于Google的V8引擎钦无,V8引擎執(zhí)行Javascript的速度非扯涸裕快,性能非常好失暂。
webpack: 基于node的一個(gè)現(xiàn)代 JavaScript 應(yīng)用程序的靜態(tài)模塊打包器
ECMAScript 6: ECMAScript 6.0(以下簡稱ES6)是JavaScript語言的下一代標(biāo)準(zhǔn)拙已,已經(jīng)在2015年6月正式發(fā)布了。它的目標(biāo)摧冀,是使得JavaScript語言可以用來編寫復(fù)雜的大型應(yīng)用程序倍踪,成為企業(yè)級(jí)開發(fā)語言。
html索昂、css建车、JavaScript的基礎(chǔ)
vue官網(wǎng): 官方文檔
看云Vue文檔: 二手文檔
VSCode:速度較快,對(duì)超大文件讀寫速度飛快(打開10M代碼不到1s)椒惨,插件數(shù)量相對(duì)少缤至,有一些增強(qiáng)功能比如調(diào)試器, 終端框产,原生支持語言語法高亮較少(C# JS TypeScript是第一位)凄杯,內(nèi)置JS/TS調(diào)試器…可以基于不同項(xiàng)目(文件夾)設(shè)置偏好,寫C#和JS/TS專用
-
Element-UI: 餓了么提供的UI框架秉宿。iView:一個(gè)團(tuán)隊(duì)
// 在main.js中全局引入element import ElementUI from 'element-ui' import 'element-ui/lib/theme-chalk/index.css' Vue.use(ElementUI)
維護(hù)靠個(gè)人的vux: 基于webpack+vue-loader+vux可以快速開發(fā)移動(dòng)端頁面戒突,配合vux-loader方便你在WeUI的基礎(chǔ)上定制需要的樣式。滴滴的cube-ui
vuepress: Vue 開發(fā)主題的極簡靜態(tài)網(wǎng)站生成器描睦,另一個(gè)部分是為書寫技術(shù)文檔而優(yōu)化的默認(rèn)主題膊存。它的誕生初衷是為了支持 Vue 及其子項(xiàng)目的文檔需求。
Vue組成方式(MVVM模式以及兩個(gè)核心點(diǎn))
-
MVVM模式
[站外圖片上傳中...(image-757b40-1591406644886)]
https://gaoqisen.github.io/GraphBed/201908/20190811121954.png
Model(數(shù)據(jù)層)-View(視圖層)-ViewModel(視圖和數(shù)據(jù)的鏈接層)忱叭,ViewModel層連接Model和View隔崎。View層和Model層并沒有直接聯(lián)系,而是通過ViewModel層進(jìn)行交互韵丑。ViewModel層通過雙向數(shù)據(jù)綁定將View層和Model層連接了起來爵卒,使得View層和Model層的同步工作完全是自動(dòng)的。因此開發(fā)者只需關(guān)注業(yè)務(wù)邏輯撵彻,無需手動(dòng)操作DOM钓株,復(fù)雜的數(shù)據(jù)狀態(tài)維護(hù)交給MVVM統(tǒng)一來管理
[站外圖片上傳中...(image-d34171-1591406644886)] -
數(shù)據(jù)驅(qū)動(dòng)
所謂數(shù)據(jù)驅(qū)動(dòng),是指視圖是由數(shù)據(jù)驅(qū)動(dòng)生成的陌僵,我們對(duì)視圖的修改轴合,不會(huì)直接操作 DOM,而是通過修改數(shù)據(jù)碗短。它相比我們傳統(tǒng)的前端開發(fā)受葛,如使用 jQuery 等前端庫直接修改 DOM,大大簡化了代碼量。特別是當(dāng)交互復(fù)雜的時(shí)候总滩,只關(guān)心數(shù)據(jù)的修改會(huì)讓代碼的邏輯變的非常清晰纲堵,因?yàn)?DOM 變成了數(shù)據(jù)的映射,我們所有的邏輯都是對(duì)數(shù)據(jù)的修改咳秉,而不用碰觸 DOM婉支,這樣的代碼非常利于維護(hù)。
組件化
所謂組件化澜建,就是把頁面拆分成多個(gè)組件 (component)向挖,每個(gè)組件依賴的 CSS、JavaScript炕舵、模板何之、圖片等資源放在一起開發(fā)和維護(hù)。組件是資源獨(dú)立的咽筋,組件在系統(tǒng)內(nèi)部可復(fù)用溶推,組件和組件之間可以嵌套。
- 代碼結(jié)構(gòu)
[站外圖片上傳中...(image-b893fc-1591406644886)]
- Vue的生命周期圖(當(dāng)遇到頁面初始化的時(shí)候需要處理一下邏輯的時(shí)候奸攻,在什么時(shí)候觸發(fā)函數(shù)) 蒜危。詳細(xì)的生命周期解釋:https://segmentfault.com/a/1190000011381906
[站外圖片上傳中...(image-e9bfff-1591406644886)]
實(shí)戰(zhàn)
安裝方式
- 在官網(wǎng)下載Node.js
node -v // 查看node版本
npm -v // 查看npm版本
npm install cnpm -g // 全局安裝cnpm
npm install -g cnpm --registry=https://registry.npm.taobao.org // 指定地址安裝cnpm
cnpm install vue // 安裝最新穩(wěn)定版本的vue
vue --version // 查看vue版本
cnpm install --global vue-cli // cnpm 全局安裝vue腳手架,
npm install -g @vue/cli // npm 全局安裝vue腳手架
vue init webpack my-project // 創(chuàng)建一個(gè)基于 webpack 模板的新項(xiàng)目
cd my-project // 到達(dá)項(xiàng)目根目錄
cnpm install // 安裝依賴
cnpm run dev // 啟動(dòng)項(xiàng)目睹耐,或者npm run dev
-
vue腳手架安裝時(shí)的選項(xiàng)
? vue build 構(gòu)建方式,兩個(gè)選擇(上下箭頭選擇辐赞,回車即為選定) Runtime + Compiler:recommended for most users (譯:運(yùn)行+編譯:被推薦給大多數(shù)用戶) Runtime-only:about 6KB lighter min+gzip,but templates (or any Vue-specific HTML) are ONLY allowed in .vue files-render functions are required elsewhere(譯:只運(yùn)行大約6KB比較輕量的壓縮文件,但只允許模板(或任何VUE特定HTML)硝训。VUE文件需要在其他地方呈現(xiàn)函數(shù)响委。(意思大概是選擇該構(gòu)建方式對(duì)文件大小有要求, 這里推薦使用1選項(xiàng),適合大多數(shù)用戶的) Standard (https://github.com/standard/standard) js的標(biāo)準(zhǔn)風(fēng)格 Airbnb (https://github.com/airbnb/javascript) JavaScript最合理的方法窖梁,這個(gè)github地址說是JavaScript最合理的方法 none (configure it yourself) 自己配置 Setup unit tests? 是否安裝單元測試 Setup e2e tests with Nightwatch(Y/n)?是否安裝E2E測試框架NightWatch(E2E赘风,也就是End To End,就是所謂的“用戶真實(shí)場景”纵刘。) yes,use npm(使用npm) yes,use yarn(使用yarn) no,I will handle that myself(自己操作)
如果報(bào)以下的錯(cuò)誤邀窃,就安裝缺少依賴(cnpm install),全部安裝完成之后就可以通過鏈接訪問了假哎。
[站外圖片上傳中...(image-695f08-1591406644886)]訪問http://localhost:8080出現(xiàn)vue標(biāo)識(shí)表示安裝成功
[站外圖片上傳中...(image-17d9b5-1591406644886)]
-
vue路由
routes: [ { // 路由路徑蛔翅,瀏覽器網(wǎng)址輸入欄的路徑 path: '/', // 通過name屬性,為一個(gè)頁面中不同的router-view渲染不同的組件,如:將上面代碼的Hello渲染在 name為Hello的router-view中位谋,將text渲染在name為text的router-view中。不設(shè)置name的將為默認(rèn)的渲染組件堰燎。<router-view name="test">12345645645</router-view> name: 'HelloWorld', // 導(dǎo)入的組件import HelloWorld from '@/components/HelloWorld' component: HelloWorld }, ] // 頁面跳轉(zhuǎn)方式 <router-link to="/test">測試1</router-link>
配置文件
- package.json
{
"name": "ffdd-fast-vue", // 項(xiàng)目名稱
"version": "1.2.2", // 版本
"description": "...", // 描述
"author": "", // 作者
"private": true, // 是否私有
"scripts": {
"dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js", // npm run dev 執(zhí)行的語句
"start": "npm run dev", // 項(xiàng)目啟動(dòng)
"unit": "jest --config test/unit/jest.conf.js --coverage", // 單元測試
"e2e": "node test/e2e/runner.js", // 前端到后端整個(gè)過程的測試
"test": "npm run unit && npm run e2e", // 測試
"lint": "eslint --ext .js,.vue src test/unit/specs test/e2e/specs", // 修改代碼樣式, 運(yùn)行之后就不報(bào)ESLint的錯(cuò)誤
"build": "gulp" // 構(gòu)建
},
"dependencies": { // 生產(chǎn)環(huán)境所有的第三方依賴
"axios": "0.17.1", // 代替ajax
"babel-plugin-component": "0.10.1", // 按需加載插件
"babel-polyfill": "6.26.0", // 按需加載進(jìn)行性能優(yōu)化插件
"element-ui": "2.8.2", // 餓了么提供UI框架
"gulp": "3.9.1", // 自動(dòng)化構(gòu)建工具
"gulp-concat": "2.6.1", // 文件合并插件
"gulp-load-plugins": "1.5.0", // 自動(dòng)加載插件
"gulp-replace": "0.6.1", // 文件替換插件
"gulp-shell": "0.6.5", // 命令行插件
"lodash": "4.17.5", // JavaScript 實(shí)用工具庫掏父。
"node-sass": "4.9.0", // sass編譯成css
"npm": "^6.9.0",
"sass-loader": "6.0.6", // 是webpack的一個(gè)loader,
"svg-sprite-loader": "3.7.3", // 實(shí)現(xiàn)自己的Icon組件
"vue": "2.5.2",
"vue-cookie": "1.1.4", // cookie插件
"vue-router": "3.0.1", // vue 路由
"vuex": "3.0.1" // vue狀態(tài)管理
},
"devDependencies": { // 開發(fā)環(huán)境所有的第三方依賴
"autoprefixer": "7.1.2", // 自動(dòng)補(bǔ)全css前綴
"babel-core": "6.22.1", // 把 js 代碼分析成 ast ,方便各個(gè)插件分析語法進(jìn)行相應(yīng)的處理
"babel-eslint": "7.1.1", // 語法檢查
"babel-jest": "21.0.2", // 單元測試
...
},
"engines": { // 引擎
"node": ">= 8.11.1",
"npm": ">= 5.6.0"
},
"browserslist": [ // 瀏覽器列表
"> 1%", // 全球超過1%人使用的瀏覽器
"last 2 versions", // 所有瀏覽器兼容到最后兩個(gè)版本根據(jù)CanIUse.com追蹤的版本
"not ie <= 8" // 方向排除部分版本
]
}
-
config/index.js
'use strict' // 模版版本號(hào): 1.3.1 // see http://vuejs-templates.github.io/webpack for documentation. const path = require('path') module.exports = { dev: { // npm run dev 執(zhí)行參數(shù) // 路徑 assetsSubDirectory: 'static', // 靜態(tài)文件路徑 assetsPublicPath: '/', // 代理列表 proxyTable : { '/proxyApi': { target: 'http://localhost:8887/', // 代理地址 changeOrigin: true, // 變化源 pathRewrite: { // 路徑重寫 '^/proxyApi': '/' } } }, // 各種開發(fā)服務(wù)器設(shè)置 host: 'localhost', // 可以被process.env.HOST覆蓋 port: 8080, // 可以被process.env.PORT覆蓋,如果端口正在使用秆剪,將換一個(gè)端口 autoOpenBrowser: false, // 自動(dòng)打開瀏覽器 errorOverlay: true, // 異常覆蓋 notifyOnErrors: true, // 異常通知 poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions- // 如果為true赊淑,則在捆綁期間將對(duì)您的代碼進(jìn)行處理爵政,linting錯(cuò)誤和警告將顯示在控制臺(tái)中 useEslint: true, // 如果為true, 錯(cuò)誤和警告也將顯示在錯(cuò)誤覆蓋中 showEslintErrorsInOverlay: false, /** * Source Maps */ // 開發(fā)環(huán)境工具 devtool: 'cheap-module-eval-source-map', // 緩存破壞 // https://vue-loader.vuejs.org/en/options.html#cachebusting cacheBusting: true, cssSourceMap: true }, build: { // npm run build 執(zhí)行參數(shù) // index.html文件路徑指定 index: path.resolve(__dirname, '../dist/index.html'), // 構(gòu)建后路徑指定、資源文件夾名陶缺、公開路徑 assetsRoot: path.resolve(__dirname, '../dist'), assetsSubDirectory: 'static', assetsPublicPath: '/', /** * 生產(chǎn)環(huán)境的Source Maps */ productionSourceMap: true, // https://webpack.js.org/configuration/devtool/#production devtool: '#source-map', //默認(rèn)情況下Gzip關(guān)閉許多流行的靜態(tài)主機(jī)钾挟,例如Surge或Netlify已經(jīng)為您準(zhǔn)備了所有靜態(tài)資源。 //在設(shè)置為“true”之前饱岸,請(qǐng)確保:npm install --save-dev compression-webpack-plugin productionGzip: false, productionGzipExtensions: ['js', 'css'], //運(yùn)行帶有額外參數(shù)的build命令 //在構(gòu)建完成后查看捆綁分析器報(bào)告:`npm run build --report` bundleAnalyzerReport: process.env.npm_config_report } }