主頁 > 軟體設計 > 20面試官21-04-17

20面試官21-04-17

2021-04-19 13:01:32 軟體設計

面試官:說說你對vue的理解?
Vue.js(/vju?/,或簡稱為Vue)是一個用于創建用戶界面的開源JavaScript框架,也是一個創建單頁應用的Web應用框架,2016年一項針對JavaScript的調查表明,Vue有著89%的開發者滿意度,在GitHub上,該專案平均每天能識訓95顆星,為Github有史以來星標數第3多的專案同時也是一款流行的JavaScript前端框架,旨在更好地組織與簡化Web開發,Vue所關注的核心是MVC模式中的視圖層,同時,它也能方便地獲取資料更新,并通過組件內部特定的方法實作視圖與模型的互動PS: Vue作者尤雨溪是在為AngularJS作業之后開發出了這一框架,他聲稱自己的思路是提取Angular中為自己所喜歡的部分,構建出一款相當輕量的框架最早發布于20142月
ue核心特性
資料驅動(MVVM)
MVVM表示的是 Model-View-ViewModel

Model:模型層,負責處理業務邏輯以及和服務器端進行互動
View:視圖層:負責將資料模型轉化為UI展示出來,可以簡單的理解為HTML頁面
ViewModel:視圖模型層,用來連接Model和View,是Model和View之間的通信橋梁

在這里插入圖片描述
在這里插入圖片描述
組件化
1.什么是組件化一句話來說就是把圖形、非圖形的各種邏輯均抽象為一個統一的概念(組件)來實作開發的模式,在Vue中每一個.vue檔案都可以視為一個組件2.組件化的優勢

降低整個系統的耦合度,在保持介面不變的情況下,我們可以替換不同的組件快速完成需求,例如輸入框,可以替換為日歷、時間、范圍等組件作具體的實作
除錯方便,由于整個系統是通過組件組合起來的,在出現問題的時候,可以用排除法直接移除組件,或者根據報錯的組件快速定位問題,之所以能夠快速定位,是因為每個組件之間低耦合,職責單一,所以邏輯會比分析整個系統要簡單
提高可維護性,由于每個組件的職責單一,并且組件在系統中是被復用的,所以對代碼進行優化可獲得系統的整體升級
面試官:說說你對雙向系結的理解?
在這里插入圖片描述
什么是雙向系結
我們先從單向系結切入單向系結非常簡單,就是把Model系結到View,當我們用JavaScript代碼更新Model時,View就會自動更新雙向系結就很容易聯想到了,在單向系結的基礎上,用戶更新了View,Model的資料也自動被更新了,這種情況就是雙向系結舉個栗子
在這里插入圖片描述
雙向系結的原理是什么
我們都知道 Vue 是資料雙向系結的框架,雙向系結由三個重要部分構成

資料層(Model):應用的資料及業務邏輯
視圖層(View):應用的展示效果,各類UI組件
業務邏輯層(ViewModel):框架封裝的核心,它負責將資料與視圖關聯起來
而上面的這個分層的架構方案,可以用一個專業術語進行稱呼:MVVM這里的控制層的核心功能便是 “資料雙向系結” ,自然,我們只需弄懂它是什么,便可以進一步了解資料系結的原理
理解ViewModel
它的主要職責就是:

資料變化后更新視圖
視圖變化后更新資料
當然,它還有兩個主要部分組成

監聽器(Observer):對所有資料的屬性進行監聽
決議器(Compiler):對每個元素節點的指令進行掃描跟決議,根據指令模板替換資料,以及系結相應的更新函式
實作雙向系結
我們還是以Vue為例,先來看看Vue中的雙向系結流程是什么的

new Vue()首先執行初始化,對data執行回應化處理,這個程序發生Observe中
同時對模板執行編譯,找到其中動態系結的資料,從data中獲取并初始化視圖,這個程序發生在Compile中
同時定義?個更新函式和Watcher,將來對應資料變化時Watcher會呼叫更新函式
由于data的某個key在?個視圖中可能出現多次,所以每個key都需要?個管家Dep來管理多個Watcher
將來data中資料?旦發生變化,會首先找到對應的Dep,通知所有Watcher執行更新函式
說說你對SPA(單頁應用)的理解?
在這里插入圖片描述
什么是SPA
SPA(single-page application),翻譯過來就是單頁應用SPA是一種網路應用程式或網站的模型,它通過動態重寫當前頁面來與用戶互動,這種方法避免了頁面之間切換打斷用戶體驗在單頁應用中,所有必要的代碼(HTML、JavaScript和CSS)都通過單個頁面的加載而檢索,或者根據需要(通常是為回應用戶操作)動態裝載適當的資源并添加到頁面頁面在任何時間點都不會重新加載,也不會將控制轉移到其他頁面舉個例子來講就是一個杯子,早上裝的牛奶,中午裝的是開水,晚上裝的是茶,我們發現,變的始終是杯子里的內容,而杯子始終是那個杯子結構如下圖
在這里插入圖片描述
SPA和MPA的區別
單頁應用與多頁應用的區別
|

單頁面應用(SPA)多頁面應用(MPA)
組成一個主頁面和多個頁面片段
重繪方式區域重繪
url模式哈希模式
SEO搜索引擎優化難實作,可使用SSR方式改善
資料傳遞容易
頁面切換速度快,用戶體驗良好
維護成本相對容易

單頁應用優缺點
優點:

具有桌面應用的即時性、網站的可移植性和可訪問性
用戶體驗好、快,內容的改變不需要重新加載整個頁面
良好的前后端分離,分工更明確
缺點:

不利于搜索引擎的抓取
首次渲染速度相對較慢
實作一個SPA
原理
監聽地址欄中hash變化驅動界面變化
用pushsate記錄瀏覽器的歷史,驅動界面發送變化

在這里插入圖片描述
實作
hash 模式
核心通過監聽url中的hash來進行路由跳轉
// 定義 Router
class Router {
constructor () {
this.routes = {}; // 存放路由path及callback
this.currentUrl = ‘’;

    // 監聽路由change呼叫相對應的路由回呼  
    window.addEventListener('load', this.refresh, false);  
    window.addEventListener('hashchange', this.refresh, false);  
}  
  
route(path, callback){  
    this.routes[path] = callback;  
}  
  
push(path) {  
    this.routes[path] && this.routes[path]()  
}  

}

// 使用 router
window.miniRouter = new Router();
miniRouter.route(’/’, () => console.log(‘page1’))
miniRouter.route(’/page2’, () => console.log(‘page2’))

miniRouter.push(’/’) // page1
miniRouter.push(’/page2’) // page2
history模式
history 模式核心借用 HTML5 history api,api 提供了豐富的 router 相關屬性先了解一個幾個相關的api

history.pushState 瀏覽器歷史紀錄添加記錄
history.replaceState修改瀏覽器歷史紀錄中當前紀錄
history.popState 當 history 發生變化時觸發
// 定義 Router
class Router {
constructor () {
this.routes = {};
this.listerPopState()
}

init(path) {  
    history.replaceState({path: path}, null, path);  
    this.routes[path] && this.routes[path]();  
}  
  
route(path, callback){  
    this.routes[path] = callback;  
}  
  
push(path) {  
    history.pushState({path: path}, null, path);  
    this.routes[path] && this.routes[path]();  
}  
  
listerPopState () {  
    window.addEventListener('popstate' , e => {  
        const path = e.state && e.state.path;  
        this.routers[path] && this.routers[path]()  
    })  
}  

}

// 使用 Router

window.miniRouter = new Router();
miniRouter.route(’/’, ()=> console.log(‘page1’))
miniRouter.route(’/page2’, ()=> console.log(‘page2’))

// 跳轉
miniRouter.push(’/page2’) // page2
題外話:如何給SPA做SEO
下面給出基于Vue的SPA如何實作SEO的三種方式

SSR服務端渲染
將組件或頁面通過服務器生成html,再回傳給瀏覽器,如nuxt.js

靜態化
目前主流的靜態化主要有兩種:(1)一種是通程序式將動態頁面抓取并保存為靜態頁面,這樣的頁面的實際存在于服務器的硬碟中(2)另外一種是通過WEB服務器的 URL Rewrite的方式,它的原理是通過web服務器內部模塊按一定規則將外部的URL請求轉化為內部的檔案地址,一句話來說就是把外部請求的靜態地址轉化為實際的動態頁面地址,而靜態頁面實際是不存在的,這兩種方法都達到了實作URL靜態化的效果

使用Phantomjs針對爬蟲處理
原理是通過Nginx配置,判斷訪問來源是否為爬蟲,如果是則搜索引擎的爬蟲請求會轉發到一個node server,再通過PhantomJS來決議完整的HTML,回傳給爬蟲,下面是大致流程圖
在這里插入圖片描述
Vue實體掛載的程序中發生了什么?
在呼叫beforeCreate之前,資料初始化并未完成,像data、props這些屬性無法訪問到

到了created的時候,資料已經初始化完成,能夠訪問data、props這些屬性,但這時候并未完成dom的掛載,因此無法訪問到dom元素
掛載方法是呼叫vm.$mount方法
說說你對Vue生命周期的理解
生命周期 描述
beforeCreate 組件實體被創建之初
created 組件實體已經完全創建
beforeMount 組件掛載之前
mounted 組件掛載到實體上去之后
beforeUpdate 組件資料發生變化,更新之前
updated 資料資料更新之后
beforeDestroy 組件實體銷毀之前
destroyed 組件實體銷毀之后
activated keep-alive 快取的組件激活時
deactivated keep-alive 快取的組件停用時呼叫
errorCaptured 捕獲一個來自子孫組件的錯誤時被呼叫
具體分析
beforeCreate -> created

初始化vue實體,進行資料觀測
created

完成資料觀測,屬性與方法的運算,watch、event事件回呼的配置
可呼叫methods中的方法,訪問和修改data資料觸發回應式渲染dom,可通過computed和watch完成資料計算
此時vm.$el 并沒有被創建
created -> beforeMount

判斷是否存在el選項,若不存在則停止編譯,直到呼叫vm.$mount(el)才會繼續編譯
優先級:render > template > outerHTML
vm.el獲取到的是掛載DOM的
beforeMount

在此階段可獲取到vm.el
此階段vm.el雖已完成DOM初始化,但并未掛載在el選項上
beforeMount -> mounted

此階段vm.el完成掛載,vm.$el生成的DOM替換了el選項所對應的DOM
mounted

vm.el已完成DOM的掛載與渲染,此刻列印vm.$el,發現之前的掛載點及內容已被替換成新的DOM
beforeUpdate

更新的資料必須是被渲染在模板上的(el、template、render之一)
此時view層還未更新
若在beforeUpdate中再次修改資料,不會再次觸發更新方法
updated

完成view層的更新
若在updated中再次修改資料,會再次觸發更新方法(beforeUpdate、updated)
beforeDestroy

實體被銷毀前呼叫,此時實體屬性與方法仍可訪問
destroyed

完全銷毀一個實體,可清理它與其它實體的連接,解綁它的全部指令及事件監聽器
并不能清除DOM,僅僅銷毀實體
題外話:資料請求在created和mouted的區別
created是在組件實體一旦創建完成的時候立刻呼叫,這時候頁面dom節點并未生成mounted是在頁面dom節點渲染完畢之后就立刻執行的觸發時機上created是比mounted要更早的兩者相同點:都能拿到實體物件的屬性和方法討論這個問題本質就是觸發的時機,放在mounted請求有可能導致頁面閃動(頁面dom結構已經生成),但如果在頁面加載前完成則不會出現此情況建議:放在create生命周期當中

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/277830.html

標籤:其他

上一篇:精通Mybatis之快取體系

下一篇:flume事務和進階

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more