1、node有哪些特征,與其他服務器端對比
特征:單線程、事件驅動、非阻塞I/O
node 無法直接渲染靜態頁面,提供靜態服務
node 沒有根目錄的概念
node 必須通過路由程序指定文件才能渲染文件
node 比其他服務端性能更好,速度更快
2、CommonJS中require/exports和ES6中import/export區別
CommonJS模塊的重要特性是加載時執行,及腳本代碼在require的時候,就會全部執行。一旦出現某個模塊被“循環加載”就只輸出已經執行的部分,還沒有執行的部分是不輸出的
ES6模塊是動態引用,如果使用import從一個模塊加載變量,那些變量不會緩存,而是成為一個指向被加載模塊的引用,impor/export最終都是編譯為require/exports來執行的
4、使用npm有哪些好處?
通過NPM,你可以安裝和管理項目的依賴,並且能夠指明依賴項的具體版本號,可以通過package.json文件來管理項目信息,配置腳本
5、AMD CMD規范的區別
CommonJS和AMD都是JavaScript模塊化規范
CMD依賴就近,而AMD依賴前置
CMD是延遲執行的,而AMD是提前執行的
AMD的API默認是一個當多個用,CMD的API嚴格區分,推崇職責單一
6、如何判斷當前腳本運行在瀏覽器還是node環境中
通過判斷 Global 對象是否為 window ,如果不為window ,當前腳本沒有運行在瀏覽器中
7、簡述同步和異步的區別,如何避免回調地獄
同步方法調用一旦開始,調用者必須等到方法調用返回后,才能繼續后續的行為
異步方法調用一旦開始,方法調用就會立即返回,調用者就可以繼續后續的操作。而異步方法通常會在另外一個線程中,整個過程,不會阻礙調用者的工作
避免回調地獄:
1)Promise
2)async/await
3)generator
4)事件發布/監聽模式
8、幾種常見模塊化規范的簡介
CommonJS規范主要用於服務端編程,加載模塊是同步的,這並不適合在瀏覽器環境,因為同步意味着阻塞加載,瀏覽器資源是異步加載的
AMD規范在瀏覽器環境中異步加載模塊,而且可以並行加載多個模塊。不過,AMD規范開發成本高,代碼的閱讀和書寫比較困難
CMD規范與AMD規范很相似,都用於瀏覽器編程,依賴就近,延遲執行,可以很容易在Node.js中運行(依賴SPM 打包,模塊的加載邏輯偏重)
ES6 在語言標准的層面上,實現了模塊功能,而且實現得相當簡單,完全可以取代 CommonJS 和 AMD 規范,成為瀏覽器和服務器通用的模塊解決方案
9、app.use和app.get區別
app.use(path,callback)中的callback既可以是router(路由)對象又可以是函數
app.get(path,callback)中的callback只能是函數
10、說一下事件循環eventloop
1)所有同步任務都在主線程上執行,形成一個執行棧
2)當主線程中的執行棧為空時,檢查事件隊列是否為空,如果為空,則繼續檢查;如不為空,則執行3
3)取出任務隊列的首部,加入執行棧
4)執行任務
5)檢查執行棧,如果執行棧為空,則跳回第 2 步;如不為空,則繼續檢查
11、node怎么跟MongoDB建立連接
1)引入mongoose
2)使用mongoose.connect()方法連接到MongoDB數據庫
3)監聽連接是否成功
4)然后通過node,書寫接口,對數據庫進行增刪改查
12、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(); });