前端筆記之Vue(一)初識SPA和Vue&webpack配置和vue安裝&指令

来源:https://www.cnblogs.com/rope/archive/2019/04/27/10731900.html
-Advertisement-
Play Games

一、單頁面應用(SPA) 1.1 C/S到B/S頁面架構的轉變 C/S:客戶端/伺服器(Client/Server)架構的軟體。 C/S 軟體的特點: ① 從window桌面雙擊打開 ② 更新的時候會替換原有的,原有的必須刪除,不能刷新。 ③ 在其他的設備上使用的時候,也要安裝軟體。 B/S :瀏覽 ...


一、單頁面應用(SPA

1.1 C/SB/S頁面架構的轉變

C/S:客戶端/伺服器(Client/Server)架構的軟體。

C/S 軟體的特點:

① 從window桌面雙擊打開

② 更新的時候會替換原有的,原有的必須刪除,不能刷新。

③ 在其他的設備上使用的時候,也要安裝軟體。

B/S :瀏覽器和伺服器(Browser/Server)架構

 

B/S 軟體的特點:

不需要安裝任何的客戶端,是通過瀏覽器輸入網址打開的。

更新的時候不需要重新安裝軟體,你只需要刷新頁面,程式就能更新。

在其他設備端,不需要安裝任何其他的軟體,瀏覽器足可以解決所有的問題。

 

Dashboard叫做儀錶盤項目,通俗的講就是***管理平臺。比如進銷存管理平臺、汽車銷售管理平臺、寵物店管理平臺。

 

特點1:這種項目幾乎都是單頁面應用(Single Page Application)簡稱SPA

將原來PC桌面的應用程式,放到瀏覽器中實現。現在的用人需求很大,不管是政府機構、教育機構、外包機構、銷售機構都在開發自己的新項目,或者把老項目搬到網頁上。比如阿裡雲的管理平臺,特別像桌面的app,現在是在瀏覽器中實現的。

 

所有頁面的URL網址,只有#後面的內容在變化,而#之前的內容沒有變化,整個項目就是一個html頁面。

 

 

 

 

 網頁沒有發生跳轉,而是DOM的整體上樹、下樹。這樣的好處是,讓本地變數可以在本地持久的時間變長。使用頁面內的錨點hash符號來標記的路由,也就是說點擊任何鏈接,頁面實際上沒有任何跳轉,所有頁面的改變都是JS完成的,JS命令一些組件消失,命令新的一些組件上樹。所以稱為“單頁面應用”

 

頁面的URL沒有變化,變化的只是hash符號後面的部分:

 

 

特點2:都是組件化的

兩個不同的頁面中(實際上是一個頁面),都有日期選擇框,發現日期選擇框都是相同的,我們叫做“組件(components)”。

 

 

 

 

 也就是說,這些日曆組件,不管是HTMLCSSJavaScript都能復用。

 

下圖中的每一個紅框都可以認為是組件:

 

 

特點3:所有的DOM元素都是動態上下樹的

查看頁面源代碼,發現頁面上的所有DOM結構都不在源代碼中,也就是說DOM結構是JavaScript程式控制上樹的,所有的部件,都是組件、組件嵌套組件、集體被JavaScript上樹。

 

 

總結,一個好的單頁面應用的框架,必須要能提供:

優秀的路由機制,能捕獲用戶URLhash部分,決定什麼組件顯示和隱藏;

JavaScript控制組件動態上樹、下樹的能力;

l 組件的創建、復用、嵌套能力;

l 組件的數據傳遞的能力。


1.2三大框架的出現

AngularReactVue都是做什麼的?

它們都是JS架構,都是用來做單頁面應用設計的。

 

Angular

AngularJS 誕生於2009年,由Misko Hevery 等人創建,後為Google所收購。是一款優秀的前端JS框架,已經被用於Google的多款產品當中。Angular是第一個實現“數據變化,視圖自動變化”的框架,並且首創了組件化開發模式。Angular有著諸多特性,最為核心的是:MVC、模塊化、自動化雙向數據綁定、語義化標簽、依賴註入、服務、控制器等等。

Angular的出現,有了前端的組件化。

前端的組件化開發:它是一種易於插拔,模塊化的開發形式。HTMLCSSJS邏輯都封裝到一個組件中,在其他的頁面可以輕鬆地顯示。

 AngularAMD模式,項目需要使用require.js配合,和時代的CMD主流背道而馳,2015年開始落寞了。Angular2016年出了22017年出了45,都是CMD模式的,但是用戶已經不買賬了。

 

 

React

React 起源於 Facebook 的內部項目,因為該公司對市場上所有 JavaScript MVC 框架,都不滿意。就決定自己寫一套,用來架設Instagram 的網站。做出來以後,發現這套東西很好用,就在20135月開源了。

React主要用於構建UI。你可以在React里傳遞多種類型的參數,如聲明代碼,幫助你渲染出UI、也可以是靜態的HTML DOM元素、也可以傳遞動態變數、甚至是可交互的應用組件。

React非常輕,只提供了少量了API,和相關的組件。

React可以ReduxFlux等框架配合使用。

React 使用 Virtual DOM技術,使他渲染更快速,記憶體開銷小。

ReactCMD模式的,並且創造性的和webpack進行合作,將所有的js代碼實時構建為一個js文件,編程的時候非常的清爽,非常利於團隊合作,所以大量的用戶就開始使用React開發自己的項目。

 

 

Vue

Vue是中國人尤雨溪發明的,它的數據驅動視圖的實現是最優雅的。它是一個集大成者,集成了AngularReact的優點,摒棄了它們的缺點。是一個構建數據驅動的 web 界面的漸進式框架。Vue.js 的目標是通過儘可能簡單的 API 實現響應的數據綁定和組合的視圖組件。它不僅易於上手,還便於與第三方庫或既有項目整合。

Vue的作者,發現了JS的一個神奇之處,Object.defineProperty的作用,可以用於視圖的更新。

 

 

AngularJS實現的機理是臟檢查。

React 是setState()。


二、Vue介紹

2.1官網和作者

官網:https://cn.vuejs.org/

Vue是一門mvvm的框架,繼承了Angular的雙向數據綁定和指令的優點,繼承了React的快速製作組件的能力,同時也擁有非常類似與Redux的單向數據流動的思想,最主要Vueapi都是中文的,非常好學。

 

2.2 Vue是一門mvvm框架

MVVM框架:一切的視圖都是和數據相關聯的。數據變化了,視圖就自動變化。而不需要控制器去命令模塊做什麼然後渲染什麼視圖

 

ReactVueAngular都是簡化了模塊化開發,這些MVVM框架到底簡化了什麼

1)組件方便創建了(創建一個組件只需要寫一個類或者一個函數)

2)組件的可插拔性高

3)組件的數據傳輸簡單了

4)路由,單頁面應用的hash路由

5)只關心數據,不關心DOM

數據叫做model(模型),因為對數據的所有操作都是模型的任務;視圖叫做view。在MVVM中出現了view-model這個層,它可以“監聽”model 的任何改變,讓視圖自動變化。從而我們不需要關心DOM操作,只需要關心數據的變化即可。

ReactVueAngular中都提供了view-model層。

 

比如,數據:

[
    {"id":1,"name":"小明","age":12},
    {"id":2,"name":"小紅","age":12},
    {"id":3,"name":"小強","age":12},
]

它有對應的DOM結構:

<table>
    <tr>
        <td>1</td>
        <td>小明</td>
        <td>12</td>
    </tr>
    <tr>
        <td>2</td>
        <td>小紅</td>
        <td>12</td>
    </tr>
    <tr>
        <td>3</td>
        <td>小強</td>
        <td>12</td>
    </tr>
</table>
結構

第一次根據數據創建DOM是非常簡單的,但是如果數據發生變化,我們必須要手動調整DOM的變化。

非常的不方便,尤其是系統很大的時候,不方便。

此時MVVM模式,就能簡化這些操作:數據一變化,DOM自動變化。

 

除了MVCMVVM模式,還有MVP。統稱MV*模式。

ReactVueAngular中都提供:

1)路由能力、組件的管理能力、組件的嵌套能力、組件的數據傳遞能力;

2)數據變化視圖自動變化。


2.3 Vue的虛擬DOM

Virtual DOM是什麼呢?

Vue.js(2.0版本)React的其中最大一個相似之處,就是他們都使用了一種叫’Virtual DOM’的東西。所謂的Virtual DOM基本上說就是它名字的意思:虛擬DOMDOM樹的虛擬表現。它的誕生是基於這麼一個概念:改變真實的DOM狀態遠比改變一個JavaScript對象的花銷要大得多。

Virtual DOM是一個映射真實DOMJavaScript對象,如果需要改變任何元素的狀態,那麼是先在Virtual DOM上進行改變,而不是直接改變真實的DOM。當有變化產生時,一個新的Virtual DOM對象會被創建並計算新舊Virtual DOM之間的差別。之後這些差別會應用在真實的DOM上。


2.4src引包體驗Vue魅力

src引入vue.js(現在不是webpack進行CMD規範的構建)來快速認知。

https://vuejs.org/js/vue.js

 

通過vuejs的包學習基礎語法,然後再用webpack

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <title>Document</title>
</head>
<body>
    <div id="app">
        <h1>{{a}}</h1>
    </div>
</body>
<script type="text/javascript" src="js/vue.js"></script>
<script type="text/javascript">
     //Vue所有的組件都是內部創建的,這裡是唯一一次new Vue()
     //不管項目有多大,組件有多少個,一定只有一個new Vue()。
     //這是一個實例
     new Vue({
        el:"#app", //掛載點
        data:{
            a : 100
        }
     })
</script>
</html>

首先認知一個事情:VueReact的區別,Vue在寫實例,React在寫類。

MVVM框架:一切的視圖都是和數據相關聯,數據變化,視圖就自動變化。


2.5 Vue視圖更新原理

<body>
    <div id="app">
        <h1>{{a}}</h1>
        <button v-on:click="add"></button>
        <button v-on:click="minus"></button>
    </div>
</body>
<script type="text/javascript" src="js/vue.js"></script>
<script type="text/javascript">
     //Vue所有的組件都是內部創建的,這裡是唯一一次new Vue()
     //不管項目有多大,組件有多少個,一定只有一個new Vue()。
     //這是一個實例
     new Vue({
        el:"#app", //掛載點
        data:{
            a : 100
        },
        methods:{
            add(){
                this.a++
            },
            minus(){
                this.a--
            }
        }
     })
</script>

現在數據變化了,視圖就自動變化,這是MVVM框架的最大特點。

因為Vue做數據和視圖相關變化,原理是“數據劫持”。Object.defineProperties()。定義Vue中組件對象data中的所有變數的setter,讓他們在被設置的時候,刷新相關視圖。

<body>
    <button>按我</button>
</body>
<script type="text/javascript">
     var obj = { //只要這個對象被賦值,立馬觸發set函數
        a : 100
     }

     Object.defineProperties(obj, {
        a : {
            set:function(){
                alert("你在修改a"); //監聽這個屬性被重新賦值
            },
            get:function(){
                alert("你在讀取a");
            }
        }
     })

     document.getElementsByTagName("button")[0].onclick = function(){
        obj.a++; //obj.a的值變化Object.defineProperties()函數的set和get就能攔截到
     }
</script>
示例代碼

三、配置webpack和安裝vue

3.1配置webpack

Vue 提供了一個官方的 CLI,可以瞬間創建一個項目,但是初學者別用cli起步,先自己手動配置。

webpack中文網:https://doc.webpack-china.org/configuration/

VueReact都是CMD架構(importexport),但目前所有瀏覽器都不支持CMD規範

所以現在VueReact的項目都用webpack打包。用webpack打包只是暫時的,也許在幾年內前端就不用webpack了。

 

第一步:先創建項目文件夾,配置webpackCMD規範,創建package.json文件

安裝webpack
npm install -g [email protected]

webpack4.0以上版本都要安裝webpack-cli依賴
npm install -g webpack-cli

安裝 webpack-dev-server,這是一個前端的模擬小伺服器,寫不了介面,但是能靜態化文件夾。
npm install -g webpack-dev-server

配置webpack.config.js文件(複製官網的配置)

 

webpack 4.0以上版本必須增加mode屬性,它有兩個值:

production (上線版)

development (開發版)

 

開發時,設置mode屬性為development,要不然就混淆加密打包很慢。

const path = require('path');

module.exports = {
     //程式的入口文件
     entry: "./www/app/app.js",

     //程式的出口(打包的文件)
     output : {
        //打包文件輸出的路徑
        path : path.resolve(__dirname, "www/dist"),
        //打包文件的名稱
        filename : "all.js",
        publicPath:"/public/" //這是對webpack-dev-server的配置,配置虛擬路徑
     },
     //讓webpack監聽變化,自動打包
     watch : true,
     mode : "development",
     //配置webpack的模塊插件
     module:{
        //關於模塊的配置規則
        rules : [{
            //模塊規則(配置 loader、解析器等選項)
            test : /\.js$/,  //解析的時候匹配到的都是js文件
            include: [
              path.resolve(__dirname, "www/app")    //翻譯什麼文件夾
            ],
            exclude: [
              path.resolve(__dirname, "node_modules") //不翻譯什麼文件夾
            ],
            // loader : "babel-loader",
            // options : {
            //     presets : ["es2015","es2016"]
            // }
        }]
     }
}

publicPathwebpack-dev-server在記憶體中生成的臨時文件夾(項目中物理磁碟上沒有這個文件夾),並且把/public/all.js文件路由到了打包的文件,是為了編譯速度更快,還能保護硬碟,同時webpack-dev-server提供了前端伺服器,埠自定義。

 

然後啟動項目:

webpack-dev-server --content-base ./www --port 8080

--content-base表示以www文件夾作為一個靜態化根目錄

--port 表示埠號

 

以上啟動命令很繁瑣,我們可以在package.json中,配置一個快速啟動命令:

{
  "name": "vue_study",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "dev" : "webpack-dev-server --content-base ./www --port 8080"
  },
  "author": "",
  "license": "ISC"
}

 

以後項目直接可以用以下命令啟動:

npm run dev

 

以後項目打開http://127.0.0.1:8080,不要直接雙擊index.html頁面了。

webpack-dev-server在做了兩件事:

1) 在打包js文件

2) 靜態化www文件夾,說白了就是幫我寫了一個app.use(express.static('www'))

 

index.html文件,要改變scriptsrc引用:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <title>Document</title>
</head>
<body>

</body>
<script type="text/javascript" src="public/all.js"></script>
</html>


3.2安裝配置Vue

接下來,配置Vue,只需要5個依賴就能起步:

vuevue-loader(安裝Vue時會提醒你安裝css-loadervue-template-compiler

npm install --save vue

 

安裝其它4個開發依賴:

npm install --save-dev vue-loader
npm install --save-dev css-loader
npm install --save-dev vue-style-loader
npm install --save-dev vue-template-compiler

註意:什麼是loader

webpack在打包的時候,順便做的事情,就是loader

 

5個依賴的作用:

 vue 核心(語法)

 css-loader webpack能識別樣式表,打包樣式表到index頁面中

 vue-style-loader 識別內嵌樣式表

 vue-loader 識別.vue組件文件的

 vue-template-compiler 識別<template></template>

 

babel-loader是翻譯ES6語法的,無需安裝,因為vue-loader中含有babel-loader

補充webpackvue配置:

配置webpack.config.js,這裡手冊很坑,是兩個地方告訴你怎麼配置resolvemodule兩個屬性。

resolve屬性:https://cn.vuejs.org/v2/guide/installation.html

module屬性:https://vue-loader-v14.vuejs.org/zh-cn/options.html#loaders

 

var path = require('path');
const {VueLoaderPlugin} =  require("vue-loader"); //最新版webpack需要引入此插件

module.exports = {
    //程式的入口文件
    entry: './www/app/main.js',
    //程式的出口文件(被打包的文件)
    output: {
        //打包文件輸出的路徑
        path: path.resolve(__dirname, './www/dist'),
        //打包文件的名稱
        filename: 'all.js',
        //這是對webpack-dev-server的配置,是一個虛擬路徑
        // publicPath:"public" //這是對webpack-dev-server的配置,配置虛擬路徑
    },
    //自動監聽
    watch:true,
    mode : "development",
    //配置webpack的模塊插件
    module:{
        // 關於模塊配置
        rules: [
            // 模塊規則(配置 loader、解析器等選項)
            {
                test: /\.js?$/,  //解析的時候匹配到的都是js文件
                include: [path.resolve(__dirname, "www/app")], //翻譯什麼文件夾中的文件
                exclude: [path.resolve(__dirname, "node_modules")], //不翻譯什麼文件夾
                // loader: "babel-loader",
                // //翻譯字典
                // options: {
                //   presets: ["es2015","es2016"]
                // }
            },
            {
                test: /\.vue?$/,  //解析的時候匹配到的都是js文件
                include: [path.resolve(__dirname, "www/app")], //翻譯什麼文件夾中的文件
                exclude: [path.resolve(__dirname, "node_modules")], //不翻譯什麼文件夾
                loader: "vue-loader"
            },
            {
                test: /\.css?$/,  //解析的時候匹配到的都是js文件
                include: [path.resolve(__dirname, "www/app")], //翻譯什麼文件夾中的文件
                exclude: [path.resolve(__dirname, "node_modules")], //不翻譯什麼文件夾
                use: ["vue-style-loader","css-loader"]
            }
        ]
    },
    resolve: {
        alias: { //配置別名
          'vue$': 'vue/dist/vue.esm.js' // 用 webpack 1 時需用 'vue/dist/vue.common.js'
        }
    },
    //最新版webpack需要引入此插件
    plugins:[
        new VueLoaderPlugin()
    ]
};

 藍色部分是配置loader必須的語法,所有以.vue結尾的文件都是vue-loader處理

 紅色是vue必須的配置

 

main.js文件寫vuehello world

import Vue from "vue";

new Vue({
    el:"#app",
    data:{
        a:100
    }
});
示例代碼

 

index.html

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • quillJS 富文本編輯器目前是一款很火富文本編輯器,使用廣泛,github 上面的 star 有 22,492,雖然說不以 star 論英雄,不過這可以說明它還是比較受歡迎的; 它的特點是:輕量,易上手,易擴展,開源,所見即所得的一款現代編輯器,還有一點是它的實現思路和其他的編輯器有點不一樣(會 ...
  • 作為一個前端新人,學習了設計模式以後,希望能從源頭上,用淺顯易懂的語言來解釋它。當然不一定是正確的,只是我個人對設計模式的一點淺顯理解。 創建型設計模式 創建型設計模式:故名思意,這些模式都是用來創建實例對象的。 單例模式:首先我們需要理解什麼是單例。單:指的是一個。例:指的是創建的實例。單例:指的 ...
  • js 函數式編程 定義把函數作為第一類對象是函數式編程的第一步,函數式編程是一種編碼風格,他通過書寫函數式代碼來解決問題(而不是一系列執行步驟,就像 就像那種更主流的命令式編程),函數式編程可以讓代碼更容易測試、擴展、及模塊化 1.函數是javascript中的一等公民,(主要是的某個變數可以等於一 ...
  • 觀察者模式 定義 觀察者模式(又被稱為發佈 訂閱(Publish/Subscribe)模式,屬於行為型模式的一種,它定義了一種一對多的依賴關係,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態變化時,會通知所有的觀察者對象,使他們能夠自動更新自己 註意(觀察者模式和發佈訂閱是有不同的) 區 ...
  • 關於自學WEB前端能不能通過社招找到一份互聯網公司WEB前端開發的工作,有無數的人問出這樣的問題,答案沒有標準的,只能從概率去考慮。有的人可以,有的人不可以,有的人自學就業的概率就是高,有的概率就是低。 比如一本院校學習通信的學生,他肯定是學過編程的,學習能力也不錯。他學成的概率就很高。 比如一個初 ...
  • 首先,我們要知道如何得到屏幕的相關數據。 <html><head><title>獲取當前對象大小以及屏幕解析度等</title><body><div style=" width:88%;margin:30px auto; color:blue;" id="div_html"></div><scrip ...
  • 思路=》 用div來展示刮獎結果,用canvas繪製刮獎前展示的圖片或者文字;將canvas疊在div上方,刮獎是只需要操作canvas配合touch事件即可簡單完成。 canvas刮獎可以用globalCompositeOperation屬性製作。 globalCompositeOperation ...
  • 解釋幾個概念: 替換元素:官方解釋是,一個內容不受css視覺格式化模型控制,css渲染模型並不考慮對此內容的渲染,且元素一般擁有固定的尺寸,(高度,寬度)的元素,被稱為置換元素。通俗來說就是瀏覽器根據元素的標簽和屬性,來決定元素的具體顯示內容。 舉例來說:瀏覽器會根據img標簽的src屬性的值來讀取 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...