1、虛擬DOM?
大家都知道,在網頁中瀏覽器資源開銷最大便是DOM節點了,DOM很慢並且非常龐大,網頁效能問題大多數都是有JavaScript修改DOM所引起的。我們使用Javascript來操縱DOM,操作效率往往很低,由於DOM被表示為樹結構,每次DOM中的某些內容都會發生變化,因此對DOM的更改非常快,但更改後的元素,並且它的子項必須經過Reflow / Layout階段,然後瀏覽器必須重新繪製更改,這很慢的。因此,迴流/重繪的次數越多,您的應用程式就越卡頓。但是,Javascript執行速度很快,虛擬DOM是放在JS 和 HTML中間的一個層。它可以通過新舊DOM的對比,來獲取對比之後的差異物件,然後有針對性的把差異部分真正地渲染到頁面上,從而減少實際DOM操作,最終達到效能優化的目的。
虛擬DOM原理流程:
用javascript模擬DOM樹,並渲染這個DOM樹比較新老DOM樹,得到比較的差異物件把差異物件應用到渲染的DOM樹2、webpack打包vue專案之後生成的dist檔案怎麼啟動執行?
webpack打包後的vue專案生成的dist可以部署到express伺服器上執行;
步驟:
進入該vue專案目錄,執行:npm run build(在package.json的scripts配置)檔案中就會多出來一個dist資料夾,如果我們直接開啟index.html是會報錯的;安裝express-gennerator生成器,執行:npm install express-generator -g 進行安裝建立一個express專案 express expressDemo (expressDemo是專案名)expressDemo專案目錄:expressDemo目錄,安裝依賴:npm install把dist目錄下的所有檔案複製到express專案的public檔案下,然後執行npm start 啟動ressDemo,開啟瀏覽器,輸入 http://localhost:3000 , 就可以看到效果了
33、如何做到在webpack打包vue專案後,在外部動態修改配置檔案?
在我們做完vue專案後,只需要執行 npm run dist 就可以輕鬆進行打包轉測試,可是如果我們臨時需要修改一些配置檔案比如域名,這時候我們就有點懵逼了,那就修改了再重新打一次包? NO NO NO,讓我們一起來探索如何解決這個問題吧。
步驟:
首先我們需要借用一個外掛 generate-asset-webpack-plugin在build資料夾下建立一個generate-asset.config.js資料夾;在config資料夾下建立一個app.config.js檔案匯出配置選項;在webpack.base.conf.js檔案中引入generateAssetAppConfig寫一個請求外部app-config.json檔案的方法在main.js中引入請求的方法最後執行 npm run dist後可以得到如下目錄最後可以修改config中json檔案裡的配置檔案。4、如何做到webpack打包vue專案後,可以修改配置檔案?
前端需要修改restful API的url,但是打包之後,配置檔案找不到了,如果在npm run build 生成dist後,這個配置也被寫死了,傳到執行的前端伺服器上後,假設某次,api伺服器的ip修改了,改動只是更新下這個url,但是卻需要會到前端原始碼,url後,在重新npm run build,然後再把整個dist再重新傳到前端伺服器,才可以。
解決方法:
用了generate-asset-webpack-plugin 這個外掛,在webpack.prod.conf.js中去生成configServer.json檔案,讓其在build的時候生成json檔案,然後再使用axios非同步獲取json,替換url即可;
5、Vue router 中params和query的區別?
1、params是路由的一部分,如果你的路由是動態路由就必須要有,query是拼接在url後面的引數,沒有也沒有關係。
2、params和name一起使用,而query和path一起使用;
6、Vue全域性混入和區域性混入?
區域性混入:
混入 (mixin) 提供了一種非常靈活的方式,來分發 Vue 元件中的可複用功能。一個混入物件可以包含任意元件選項。當元件使用混入物件時,所有混入物件的選項將被“混合”進入該元件本身的選項。
選項合併:當元件和混入物件含有同名選項時,這些選項將以恰當的方式進行“合併”。比如,資料物件在內部會進行遞迴合併,並在發生衝突時以元件資料優先;
同名的鉤子函式:同名鉤子函式將合併為一個數組,因此都將被呼叫。另外,混入物件的鉤子將在元件自身鉤子之前呼叫。
值為物件的選項:例如 methods、components 和 directives,將被合併為同一個物件。兩個物件鍵名衝突時,取元件物件的鍵值對。
全域性混入:
混入也可以進行全域性註冊。使用時格外小心!一旦使用全域性混入,它將影響每一個之後建立的 Vue 例項。使用恰當時,這可以用來為自定義選項注入處理邏輯。
請謹慎使用全域性混入,因為它會影響每個單獨建立的 Vue 例項 (包括第三方元件)。大多數情況下,只應當應用於自定義選項,就像上面示例一樣。推薦將其作為外掛釋出,以避免重複應用混入。
7、H5怎麼和客戶端進行資料互動的?
Hybrid-App,混合式開發,大白話就是:將網頁內嵌在原生app中,然後產生一系列的互動。
常用的互動方式:1、雙方約定協議(schema):這裡以android 為例,android 中可以通過WebViewClient 的回撥方法shouldOverrideUrlLoading ()攔截 url, 然後解析該 url 的協議, 如果檢測到是預先約定好的協議,就呼叫相應方法協議式的通訊適用於單向互動, 客戶端想要回傳給我們引數比較複雜;
2、雙方約定函式:簡單來說,就是客戶端為我們做了一層關係對映, 也可以理解原生app端會向webview暴露一個頂層物件,就像js中的window,這個物件包含web需要但不具備因此由原生實現的一些方法;
總結:
1、約定協議(native攔截http協議進行判讀是否是定義好的協議)
2、約定函式(native向webview注入頂級物件)
8、keep-alive怎麼理解的?他觸發的是哪個生命週期?
一個抽象元件,本身不會渲染一個DOM元素,也不會出現在父元件鏈中,使用keep-alive元件包裹動態元件時,會快取不活動的元件例項,而不是銷燬他們;不僅可以儲存元件的狀態,而且可以避免元件反覆建立和渲染,有效提升系統性能;屬性,propsinclude:定義快取白名單,會快取名單裡面的元件 exclude:定義快取黑名單,被命中的元件不會被快取 max:定義快取元件的上限生命週期鉤子函式:
created:初始化兩個物件分別快取VNode和VNode對應的鍵集合 destory:刪除之前快取的VNode例項,遍歷呼叫一個函式刪除,主要是為了觸發快取函式的destory鉤子函式;
mounted:對include和exclode引數進行監聽,然後實時更新快取資料物件,進行刪除和新增 render:渲染;9、node.js怎麼開啟服務?詳細程式碼?
var http = require('http');
http.createServe( function (req,res) { res.end('啟動伺服器')
}).listen(8000,function () {
console.log('server running at http://127.0.0.1:8000')
})
10、詳細解釋一下promise?例如他的返回值?唯一狀態?處理機制?
Promise 是非同步程式設計的一種解決方案,所謂Promise,簡單說就是一個容器,裡面儲存著某個未來才會結束的事件(通常是一個非同步操作)的結果。從語法上說,Promise 是一個物件,從它可以獲取非同步操作的訊息。
Promise物件有以下兩個特點:
(1)物件的狀態不受外界影響。Promise物件代表一個非同步操作,有三種狀態:pending(進行中)、fulfilled(已成功)和rejected(已失敗)。只有非同步操作的結果,可以決定當前是哪一種狀態,任何其他操作都無法改變這個狀態。這也是Promise這個名字的由來,它的英語意思就是“承諾”,表示其他手段無法改變。
(2)一旦狀態改變,就不會再變,任何時候都可以得到這個結果。Promise物件的狀態改變,只有兩種可能:從pending變為fulfilled和從pending變為rejected。只要這兩種情況發生,狀態就凝固了,不會再變了,會一直保持這個結果,這時就稱為 resolved(已定型)。如果改變已經發生了,你再對Promise物件添加回調函式,也會立即得到這個結果。這與事件(Event)完全不同,事件的特點是,如果你錯過了它,再去監聽,是得不到結果的。
Promise也有一些缺點:
首先,無法取消Promise,一旦新建它就會立即執行,無法中途取消。其次,如果不設定回撥函式,Promise內部丟擲的錯誤,不會反應到外部。第三,當處於pending狀態時,無法得知目前進展到哪一個階段(剛剛開始還是即將完成)。
(日更新...........兄弟們前途似錦)