這個問題比較簡單,用 flex 與 grid 實現以下便可:前端
實現方式以下:vue
<html>
<head>
<style>
/* flex */
.box {
display: flex;
flex-wrap: wrap;
width: 100%;
}
.box div {
width: calc(100% / 3 - 2px);
height: 100px;
border: 1px solid black;
}
/* grid */
.box {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
width: 100%;
}
.box div {
height: 100px;
border: 1px solid black;
}
</style>
<head>
<body>
<div class=
"box"
>
<div></div>
<div></div>
<div></div>
<div></div>
</div>
<body>
</html>
|
grid 學習:https://www.jianshu.com/p/d183265a8dadjava
一些想法寫在下題。node
Vue SSR 的好處就很少說了,這有一篇相關文章 服務端渲染與客戶端渲染 。
簡單的總結下 Vue SSR 的實現。
有一張實現圖:jquery
其基本實現原理:webpack
window.__INITIAL_STATE__
發送到客戶端。Vue SSR 的實現,主要就是把 Vue 的組件輸出成一個完整 HTML, vue-server-renderer 就是幹這事的。nginx
純客戶端輸出過程有一個 complier 過程(「下題」中有一個簡單描述),主要做用是將 template 轉化成 render 字符串 。git
Vue SSR 須要作的事多點(輸出完整 HTML),除了 complier -> vnode,還需如數據獲取填充至 HTML、客戶端混合(hydration)、緩存等等。
相比於其餘模板引擎(ejs, jade 等),最終要實現的目的是同樣的,性能上可能要差點。
參考:
finally 方法用於指定無論 Promise 對象最後狀態如何,都會執行的操做,使用方法以下:
Promise
.then(result => { ··· })
.
catch
(error => { ··· })
.finally(() => { ··· })
|
finally 特色:
Promise.prototype.finally =
function
(callback) {
let P =
this
.constructor
return
this
.then(
value => P.resolve(callback()).then(() => value),
reason => P.resolve(callback()).then(() => {
throw
reason })
)
}
|
Vue 的響應式原理是使用 Object.defineProperty 追蹤依賴,當屬性被訪問或改變時通知變化。
有兩個不足之處:
緣由差很少,無非就是沒有被 getter/setter 。
第一個比較容易理解,爲何數組長度不能被 getter/setter ?
在知乎上找了一個答案:若是你知道數組的長度,理論上是能夠預先給全部的索引設置 getter/setter 的。可是一來不少場景下你不知道數組的長度,二來,若是是很大的數組,預先加 getter/setter 性能負擔較大。
如今有一個替代的方案 Proxy,但這東西兼容性很差,早晚要上的。
Proxy,在目標對象以前架設一層攔截。具體,能夠參考 http://es6.ruanyifeng.com/#docs/reference
理解兩點:
這個題目有兩家問了,感受都不是答得很好。
從兩個問題出發:
實現時,主要以下
參考:https://segmentfault.com/a/1190000010408657
之前寫過兩篇文章討論這個算法的實現,沒想到過的過久,忘記了。(文章地址:https://github.com/jkchao/blog/issues/3 ,https://github.com/jkchao/blog/issues/4) 。
也好,稱此機會總結下
diff 的實現主要經過兩個方法,patchVnode 與 updateChildren 。
patchVnode 有兩個參數,分別是老節點 oldVnode, 新節點 vnode 。主要分五種狀況:
updateChildren 是關鍵,這個過程能夠歸納以下:
oldCh 和 newCh 各有兩個頭尾的變量 StartIdx 和 EndIdx ,它們的2個變量相互比較,一共有4種比較方式。若是 4 種比較都沒匹配,若是設置了key,就會用key進行比較,在比較的過程當中,變量會往中間靠,一旦 StartIdx > EndIdx 代表 oldCh 和 newCh 至少有一個已經遍歷完了,就會結束比較。
之前寫過一篇 「Vue 生面週期總結的文章 」的文章,裏面提到了 complier 的做用,沒有作深刻了解。。。
模板解析這種事,本質是將數據轉化爲一段 html ,最開始出如今後端,通過各類處理吐給前端。隨着各類 mv* 的興起,模板解析交由前端處理。
總的來講,Vue complier 是將 template 轉化成一個 render 字符串。
能夠簡單理解成如下步驟:
參考:
前端對算法的要求仍是比較低的,但也是必不可少的一部分。
找到一篇比較不錯的文章:https://www.cnblogs.com/zichi/p/4788953.html
最簡單的一種思路就是使用數組存儲,而後讓我優化。
我。。。一臉懵逼。
有興趣的同窗能夠參考這個: http://www.cnblogs.com/dolphin0520/p/3749259.html 。
ps: 看來我得補補數據結構和算法相關的知識了。
當面試官問這個問題,沒有 get 到面試官的點,扯了一堆亂七八糟沒用的 – -。
後來面試官說主要是用 timeline 工具。
大意是經過 timeline 來查看每一個函數的調用時常,定位出哪一個函數的問題,從而能判斷哪一個組件出了問題。
附上兩個使用 timeline 的文章:
面試官不知道爲什麼扯到了 202, 204。。。好像是由本身帶進坑的。- –
202: 服務器已接受請求,但還沒有處理。
204: 服務器成功處理了請求,沒有返回任何內容。
這些狀態碼感受只要能記住經常使用的就 ok 了,固然還得了解 200 +, 300+, 400+, 500+ 表明什麼意思。
WebSocket 應該算是一個比較常問的面試點,若是問的不深的話,應該比較好回答。
因爲 http 存在一個明顯的弊端(消息只能有客戶端推送到服務器端,而服務器端不能主動推送到客戶端),致使若是服務器若是有連續的變化,這時只能使用輪詢,而輪詢效率太低,並不適合。因而 WebSocket 被髮明出來。
相比與 http 具備如下有點:
實現比較簡單,服務端庫如 socket.io
、ws
,能夠很好的幫助咱們入門。而客戶端也只須要參照 api 實現便可。
參考:
之前寫過一篇簡單的關於 electron-vue 的文章,沒想到真有面試官問,並且問的挺深的。
最最重要的一點,electron 其實是一個套了 Chrome 的 node 程序。
因此應該是從兩個方面說開來:
Chrome 沒什麼好說的,是個前端都懂。
Node 方面可說的就多了。
有個面試官問我,在 electron 怎麼解決跨域問題?
在我本身的項目裏,確實遇到了這個問題,惋惜選擇了一個不怎麼好的方法的方法,設置 nginx 。
爲何很差,若是項目是公司的,還須要運維同窗幫忙。- –
也聊到了使用 CORS 容許跨域,也以爲很差,由於須要後端接口處理。
一臉懵逼的我,直到面試官提醒使用 node 來代理如下,才恍然大悟。(原來還能夠這種操做。。。。)
固然也能夠鏈接數據庫,上家公司原本打算要作一個 electron 配合鏈接數據庫的桌面應用。(還沒開始作就離職了- -)
挺惋惜的,當時數據庫都已經選擇好了,leveldb 或者 lowdb ,以爲應該不難。
附上兩個 electron 配合數據庫使用的連接:
功力不足,不免有錯誤之處,還望多多指出。