九、Node模塊
基礎(chǔ)部分
1. 對Node的優(yōu)點和缺點提出了自己的看法
? - [ ] (優(yōu)點)因為Node是基于事件驅(qū)動和無阻塞的,所以非常適合處理并發(fā)請求,因此構(gòu)建在Node上的代理服務(wù)器相比其他技術(shù)實現(xiàn)(如Ruby)的服務(wù)器表現(xiàn)要好得多。此外,與Node代理服務(wù)器交互的客戶端代碼是由javascript語言編寫的,因此客戶端和服務(wù)器端都用同一種語言編寫,這是非常美妙的事情。
? ? ? ? (缺點)Node是一個相對新的開源項目,所以不太穩(wěn)定,它總是一直在變,而且缺少足夠多的第三方庫支持。看起來,就像是Ruby/Rails當(dāng)年的樣子
2. node.js 的應(yīng)用場景
? - [ ] 1. 實時應(yīng)用:如在線聊天,實時通知推送等等(如socket.io)
? ? ? ? 2. 分布式應(yīng)用:通過高效的并行I/O使用已有的數(shù)據(jù)
? ? ? ? 3. 工具類應(yīng)用:海量的工具,小到前端壓縮部署(如grunt),大到桌面圖形界面應(yīng)用程序
? ? ? ? 4. 游戲類應(yīng)用:游戲領(lǐng)域?qū)崟r和并發(fā)有很高的要求(如網(wǎng)易的pomelo框架)
? ? ? ? 5. 利用穩(wěn)定接口提升Web渲染能力
? ? ? ? 6. 前后端編程語言環(huán)境統(tǒng)一:前端開發(fā)人員可以非常快速地切入到服務(wù)器端的開發(fā)(如著名的純Javascript全棧式MEAN架構(gòu))
3. NodeJS非阻塞I/O模型執(zhí)行流程
? - [ ] 主線程:
? ? ? ? 1. 執(zhí)行 node 的代碼,把代碼放入隊列
? ? ? ? 2. 事件循環(huán)程序(主線程)把隊列里面的同步代碼都先執(zhí)行了,
? ? ? ? 3. 同步代碼執(zhí)行完成,執(zhí)行異步代碼
? ? ? ? 4. 異步代碼分 2種狀況,
? ? ? ? ? ? (1)、異步非 io setTimeout() setInterval()
? ? ? ? ? ? 判斷是否可執(zhí)行,如果可以執(zhí)行就執(zhí)行,不可以跳過。
? ? ? ? ? ? (2)、異步io 文件操作
? ? ? ? ? ? 會從線程池當(dāng)中去取一條線程,幫助主線程去執(zhí)行。
? ? ? ? 5. 主線程會一直輪訓(xùn),隊列中沒有代碼了,主線程就會退出。
? ? ? ? 子線程:被放在線程池里面的線程,用來執(zhí)行異步 io操作
? ? ? ? 1. 在線程池里休息
? ? ? ? 2. 異步 io 的操作來了,執(zhí)行異步 io操作。
? ? ? ? 3. 子線程會把異步 io操作的 callback 函數(shù),扔回給隊列
? ? ? ? 4. 子線程會回到線程池了去休息。
? ? ? ? ? ? callback,在異步 io 代碼執(zhí)行完成的時候被扔回主線程。
4. nodejs中流(stream)的理解
? - [ ] 1. 什么是Stream?
? ? ? ? ? ? 答案:stream是基于事件EventEmitter的數(shù)據(jù)管理模式.由各種不同的抽象接口組成,主要包括可寫,可讀,可讀寫,可轉(zhuǎn)換等幾種類型.
? ? ? ? 2. Stream有什么好處?
? ? ? ? ? ? 答案: 非阻塞式數(shù)據(jù)處理提升效率,片斷處理節(jié)省內(nèi)存,管道處理方便可擴(kuò)展等.
? ? ? ? 3. Stream有哪些典型應(yīng)用?
? ? ? ? ? ? 答案: 文件,網(wǎng)絡(luò),數(shù)據(jù)轉(zhuǎn)換,音頻視頻等.
? ? ? ? ? ? 1. 怎么捕獲 Stream的錯誤事件?
? ? ? ? ? ? ? 答案: 監(jiān)聽 error 事件,方法同 EventEmitter.
? ? ? ? ? ? 2. 有哪些常用Stream,分別什么時候使用?
? ? ? ? ? ? ? 答案:Readable 為可被讀流,在作為輸入數(shù)據(jù)源時使用;Writable 為可被寫流,在作為輸出源時使用;Duplex 為可讀寫流,它作為輸出源接受被寫入,同時又作為輸入源被后面的流讀出.Transform 機(jī)制和Duplex一樣,都是雙向流,區(qū)別時 Transfrom 只需要實現(xiàn)一個函數(shù)transfrom(chunk, encoding, callback);而 Duplex 需要分別實現(xiàn)read(size)函數(shù)和_write(chunk, encoding, callback)函數(shù).
? ? ? ? ? ? 3. 實現(xiàn)一個 Writable Stream?
? ? ? ? ? ? ? 答案: 三步走:1)構(gòu)造函數(shù)call Writable 2) 繼承 Writable 3) 實現(xiàn)_write(chunk,encoding, callback)函數(shù)
5. ES6有哪些新特性?
? - [ ] 類的支持,模塊化,箭頭操作符,let/const塊作用域,字符串模板,解構(gòu),參數(shù)默認(rèn)值/不定參數(shù)/拓展參數(shù), for-of遍歷, generator, Map/Set, Promise
6. 你對ES6的個人看法
? - [ ] 從軟件工程角度來看,以前真的很弱,不適合做大型應(yīng)用,很容易導(dǎo)致爛尾工程。ES6就相當(dāng)于當(dāng)年的Java5,是歷史性的發(fā)展,從此我們可以用js做大型項目了。事實上,各大主流瀏覽器現(xiàn)在已經(jīng)支持大部分新特性了,后端的Node.js更是可以直接使用ES6的絕大多數(shù)語法。
7. node中的Buffer如何應(yīng)用?
? - [ ] Buffer是用來處理二進(jìn)制數(shù)據(jù)的,比如圖片,mp3,數(shù)據(jù)庫文件等.Buffer支持各種編碼解碼,二進(jìn)制字符串互轉(zhuǎn).
8. 什么是“前端路由”?什么時候適合使用“前端路由”? “前端路由”有哪些優(yōu)點和缺點?
? - [ ] 1. 什么是前端路由
? ? ? ? ? ? 路由是根據(jù)不同的url地址展示不同的內(nèi)容或頁面。前端路由就是把不同路由對應(yīng)不同的內(nèi)容或頁面的任務(wù)交給前端來做,之前通過服務(wù)端根據(jù)url的不同返回不同的頁面實現(xiàn)的
? ? ? ? 2. 什么時候使用前端路由
? ? ? ? ? ? 在單頁面應(yīng)用,大部分頁面結(jié)構(gòu)不變,只改變部分內(nèi)容的使用
? ? ? ? 3. 前端路由有什么優(yōu)缺點
? ? ? ? ? ? 優(yōu)點:
? ? ? ? ? ? ? ? ? ? 用戶體驗好,不需要每次都從服務(wù)器全部獲取,快速展現(xiàn)給用戶
? ? ? ? ? ? 缺點:
? ? ? ? ? ? ? ? ? ? 使用瀏覽器的前進(jìn),后退鍵的時候會重新發(fā)送請求,沒有合理利用緩存
? ? ? ? ? ? ? ? ? ? 單頁面無法記住之前滾動的位置,無法再前進(jìn),后退的時候記住滾動的
9. 如何判斷當(dāng)前腳本運行在瀏覽器還是node環(huán)境中?
? - [ ] exports? ? =? ? typeof? ? window? ? ===? ? ? ? 'undefined'? ? ? ?? ? global? ? :? ? window? ;
? ? ? ? 獲取全局對象的方式
? ? ? ? 同理可得,typeof window可以用來判斷是不是在瀏覽器環(huán)境中
實際工作部分
1. node中的異步和同步怎么理解?
? - [ ] node是單線程的,異步是通過一次次的循環(huán)事件隊列來實現(xiàn)的.同步則是說阻塞式的IO,這在高并發(fā)環(huán)境會是一個很大的性能問題,所以同步一般只在基礎(chǔ)框架的啟動時使用,用來加載配置文件,初始化程序什么的.
2. 有哪些方法可以進(jìn)行異步流程的控制?
? - [ ] 1. 多層嵌套回調(diào)
? ? ? ? 2. 為每一個回調(diào)寫單獨的函數(shù),函數(shù)里邊再回調(diào)
? ? ? ? 3. 用第三方框架比方async, q, promise等
3. npm有哪些常用的命令,請列舉并說明作用
? - [ ] $npm init? ? ? ? ? ? ? ? 項目初始化
? ? ? ? $npminstall -g <name>? 安裝并更新package.json中的版本配置
? ? ? ? $npm run<name>? ? ? ? 執(zhí)行一段腳本
? ? ? ? $npm update -n <name>? 更新模塊