史上最全前端面試題及解答(一)

阿里巴巴
1、請簡要介紹一下Koa2中間件原理。

Koa2中間件,主要由四大部分構成,application、context、request、response構成,在application中通過use來註冊我們所要使用的中間件,在createServer的時候傳入一個回調函數,在這個回調函數裏面,依次來執行我們的中間件。那麼就是說,當我們的server監聽到相應的請求之後,就會去執行這些註冊的中間件。那麼難點就來了,如何遞歸執行我們的中間件呢, koa2提供了一個compose函數,這也是koa2的核心中的核心,它通過遍歷中間件,返回一個dispatch函數,這個dispatch函數是個遞歸調用函數,也就是在dispatch裏面執行我們的響應的中間件。

2、請問你使用過哪些Koa2中間件?你寫過哪些koa2中間件?

koa2中間件在項目中的使用還是比較頻繁的,我主要使用到了koa-router、koa-session、koa-bodyparser和koa-static等中間件。當然我也自己寫過一些中間件,例如在項目中,我曾經寫過接口請求及返回內容、耗時情況的日誌記錄中間件;風控攔截中間件;前端跨域代理等中間件。

3、在你的項目中有沒有涉及到Cluster?

當然,是涉及到的(即使沒用到,至少也說一點,裝一下,讓面試官覺得你涉獵很廣)。我記得我之前做過這樣一個項目,一個後臺服務系統,支持同時上傳大量資源文件。當時我們針對這個服務,做了一個簡單的單機集羣。其實也就是藉助了pm2,做了一些併發。將我們的上傳服務速度比較之前提升了3倍。如果您有興趣的話,我倒是可以介紹一下cluster的原理。
接下來開始bana bana.

4、介紹PM2

pm2,作爲node應用的進程管理器。可以實現node對應用的啓動、監控、日誌。其內建了負載均衡,可以讓我們的node應用充分利用我們的cpu。其不光能夠實現node應用進程的管理,也能管理一般的腳本程序。它甚至還有deploy功能,能夠直接從本地部署我們的線上應用。非常強大的一款工具,我上家公司的上線打包工具就是基於pm2實現的, 通過一個命令即可完成項目的打包發佈。

5、Master掛了pm2如何處理?

pm2可以通過fork產生多個獨立進程實例。 這些實例能夠在master掛掉後,隨時替代master。

6、如何與MySql通信?

npm提供了mysql的node應用。在項目中,項目中引入mysql,通過調用connect方法,連接到遠程數據庫,拿到connection連接對象。 connect連接對象,提供了增刪改查api,通過輸入數據庫腳本,完成與數據庫的通信。 mysql還提供了連接池對象,通過它可以直接完成curd操作,當然也可以複用已有的連接池,減少連接開銷。

7、React生命週期以及自己的理解

Reac1.5以前的生命週期這裏就不多說了, React1.6以後生命週期總體概括分爲三個部分。組件創建、更新、卸載三個階段。創建時,依次順序調用constructor、getDerivedStateFromProps、render、componentDidMount這四個生命週期函數,其中getDerivedStateFromProps主要用來將外部屬性轉換爲自身狀態,比較適用於組件既能被外部控制又能內部更新的場景。更新階段,依次通過getDerivedStateFromProps、shouldComponentUpdate、render、getSnapshotBeforeUpdate、componentDidUpdate這個四個方法。 最後卸載時調用componentWillUnMount方法。

8、如何配置React-Router

配置React-Router,概括起來就是有大概三種方式:
第一種,通過標籤形式,例如 <Router/> 這樣的標籤,通過這樣的標籤來引入我們的組件,最後render的時候返回這樣的Router就好了,這種方式比較簡單,但是不能做一些比較個性化的事情。
第二種,通過聲明式配置的方式,聲明一個對象,該對象是一個數組,可以更加靈活的配置我們的路由,可以配置我們跳轉路由之前的操作,例如離開頁面、進入頁面,都能配置響應的回調事件。然後通過<Router routes={routerConfig} />這種方式來應用我們的配置。
第三種,按需加載的方式,在大型應用中,性能是一個很重要的問題,按需要加載JS是一種優化性能的方式。在React router中不僅組件是可以異步加載的,路由也是允許異步加載的。Route 可以定義getChildRoutesgetIndexRoutegetComponents這幾個函數,他們都是異步執行的,並且只有在需要的時候纔會調用。這種方式需要配合webpack中有實現代碼拆分功能的工具來用。

9、路由的動態加載

在React V4以後, React由靜態路由變成動態路由了,根據官方code splitting的要求, 實現動態加載需要
webpack,babel-plugin-systax-dynamic-import和react-loadable, 具體配置如下。這樣組件動態加載和HMR就都實現了。

<Route exact path="/settings"
  component={Loadable({
    loader: () => import(/* webpackChunkName: "Settings" */ './Settings.js'),
    loading:Loading                            
  })}
/>
10、服務端渲染 SSR

傳統的服務端渲染SSR,主要是通過在服務端組裝html,組裝的html已經是結合了css,並執行了js,返回給客戶端,直接就可以展示,客戶端省去了解析html和渲染css的工作。在這種開發模式下,服務端與前端的分工變得模糊,前後端分離的目標並沒有達到。雖然利於SEO,但是服務端的壓力比較大。
Node.js技術浪潮襲來之後,服務端渲染主要有node中間件來完成了,這樣保證了,前後端分工仍然明確。並且node技術框架下,有大量優秀的服務端渲染工具可以選擇,例如中間件架構,我們可以選擇的express、koa、egg等, 視圖模版,我們有pug(jade)、handlebars、art-template、ejs 等等工具, React體系下有next.js,Vue體系下有Nuxt.js。

未完,待續。。。 請關注我哦。。連載中。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章