前端面試題整理—Node篇

一、node有哪些特徵,與其餘服務器端對比前端

  特徵:單線程、事件驅動、非阻塞I/Ovue

  node 沒法直接渲染靜態頁面,提供靜態服務node

  node 沒有根目錄的概念webpack

  node 必須經過路由程序指定文件才能渲染文件web

  node 比其餘服務端性能更好,速度更快數據庫

 

二、CommonJS中require/exports和ES6中import/export區別npm

  CommonJS模塊的重要特性是加載時執行,及腳本代碼在require的時候,就會所有執行。一旦出現某個模塊被「循環加載」就只輸出已經執行的部分,尚未執行的部分是不輸出的編程

  ES6模塊是動態引用,若是使用import從一個模塊加載變量,那些變量不會緩存,而是成爲一個指向被加載模塊的引用,impor/export最終都是編譯爲require/exports來執行的json

 

三、談談對node.js npm webpack的理解跨域

  ebpack可以把.vue後綴名的文件打包成瀏覽器可以識別的js,而這個.vue文件裝換須要打包器vue-loader;這個vue-loader打包器是能夠從npm上面下載,npm下載文件以後;webpack打包文件的時須要node環境去運行

 

四、使用npm有哪些好處?

  經過NPM,你能夠安裝和管理項目的依賴,而且可以指明依賴項的具體版本號,能夠經過package.json文件來管理項目信息,配置腳本

 

五、AMD CMD規範的區別

  CommonJS和AMD都是JavaScript模塊化規範

  CMD依賴就近,而AMD依賴前置

  CMD是延遲執行的,而AMD是提早執行的

  AMD的API默認是一個當多個用,CMD的API嚴格區分,推崇職責單一

 

六、如何判斷當前腳本運行在瀏覽器仍是node環境中

  經過判斷 Global 對象是否爲 window ,若是不爲window ,當前腳本沒有運行在瀏覽器中

 

七、簡述同步和異步的區別,如何避免回調地獄

  同步方法調用一旦開始,調用者必須等到方法調用返回後,才能繼續後續的行爲

  異步方法調用一旦開始,方法調用就會當即返回,調用者就能夠繼續後續的操做。而異步方法一般會在另一個線程中,整個過程,不會阻礙調用者的工做

  避免回調地獄:

  1)Promise

  2)async/await

  3)generator

  4)事件發佈/監聽模式

  

八、幾種常見模塊化規範的簡介

   CommonJS規範主要用於服務端編程,加載模塊是同步的,這並不適合在瀏覽器環境,由於同步意味着阻塞加載,瀏覽器資源是異步加載的

  AMD規範在瀏覽器環境中異步加載模塊,並且能夠並行加載多個模塊。不過,AMD規範開發成本高,代碼的閱讀和書寫比較困難

  CMD規範與AMD規範很類似,都用於瀏覽器編程,依賴就近,延遲執行,能夠很容易在Node.js中運行(依賴SPM 打包,模塊的加載邏輯偏重)

  ES6 在語言標準的層面上,實現了模塊功能,並且實現得至關簡單,徹底能夠取代 CommonJS 和 AMD 規範,成爲瀏覽器和服務器通用的模塊解決方案

 

九、app.use和app.get區別

  app.use(path,callback)中的callback既能夠是router(路由)對象又能夠是函數

  app.get(path,callback)中的callback只能是函數

 

十、說一下事件循環eventloop 

  1)全部同步任務都在主線程上執行,造成一個執行棧

  2)當主線程中的執行棧爲空時,檢查事件隊列是否爲空,若是爲空,則繼續檢查;如不爲空,則執行3

  3)取出任務隊列的首部,加入執行棧

  4)執行任務

  5)檢查執行棧,若是執行棧爲空,則跳回第 2 步;如不爲空,則繼續檢查

 

十一、node怎麼跟MongoDB創建鏈接

  1)引入mongoose

  2)使用mongoose.connect()方法鏈接到MongoDB數據庫

  3)監聽鏈接是否成功

  4)而後經過node,書寫接口,對數據庫進行增刪改查

 

十二、node 和 前端項目怎麼解決跨域的

   經過在node服務器端設置

        //解決跨域問題
        app.use(async(ctx, next) => {
            
            //指定服務器端容許進行跨域資源訪問的來源域。能夠用通配符*表示容許任何域的JavaScript訪問資源,可是在響應一個攜帶身份信息(Credential)的HTTP請求時,必需指定具體的域,不能用通配符
            ctx.set("Access-Control-Allow-Origin", "*");

            //可選。它的值是一個布爾值,表示是否容許客戶端跨域請求時攜帶身份信息(Cookie或者HTTP認證信息)。默認狀況下,Cookie不包括在CORS請求之中。當設置成容許請求攜帶cookie時,須要保證"Access-Control-Allow-Origin"是服務器有的域名,而不能是"*";若是沒有設置這個值,瀏覽器會忽略這次響應。
            ctx.set("Access-Control-Allow-Credentials", true);
            
            //指定服務器容許進行跨域資源訪問的請求方法列表,通常用在響應預檢請求上
            ctx.set("Access-Control-Allow-Methods", "OPTIONS, GET, PUT, POST, DELETE");
            
            //必需。指定服務器容許進行跨域資源訪問的請求頭列表,通常用在響應預檢請求上
            ctx.set("Access-Control-Allow-Headers", "x-requested-with, accept, origin, content-type");
            // ctx.set("X-Powered-By", ' 3.2.1');
            
            //告訴客戶端返回數據的MIME的類型,這只是一個標識信息,並非真正的數據文件的一部分
            ctx.set("Content-Type", "application/json;charset=utf-8");
            
            //若是不設置mode,直接設置content-type爲application/json,則fetch會默認這是跨域模式(mode:'cors'),在跨域POST以前,客戶端會先發一條OPTIONS請求來」探探路」,若是服務器容許,再繼續POST數據。對於這種OPTIONS請求,須要在服務器配置容許接受OPTIONS請求,這樣寫就是直接容許了全部的OPTIONS請求,也能夠按照需求來判斷OPTIONS請求中更詳細的信息
            if (ctx.request.method == "OPTIONS") {
                ctx.response.status = 200
            }
            await next();
        });
相關文章
相關標籤/搜索