深入淺出nodejs學習筆記-前三章 簡介、模塊機制、異步I/O


第一章 node簡介

在學習這章之前,先提三個問題,node是什麼,爲什麼用node,node可以用來幹什麼?

首先是回答第一個問題,node是什麼?

node習慣稱爲nodejs,聽起來類似於js庫,但是其實node並不是一個庫,node其實是一個可以在後端運行JavaScript的環境。

js爲什麼可以在後端運行呢,不是只可以在瀏覽器運行嗎?其實是js之所以可以再瀏覽器運行是因爲在瀏覽器中集成了js解析引擎,類似Firefox的SpiderMonkey和IE的Chakra,其中最有名的當屬於chrome的v8引擎,而node便是利用到了v8引擎,所以纔可以在服務器端跑js,當如正如你所想的,因爲node並沒有渲染引擎,所以node是不處理UI的。

那爲什麼要用node?

作爲一個後端js的運行平臺,node要好用纔會用啊,喏,如下:

  1. 異步IO:其實就是異步執行的IO操作,不用多說
  2. 單線程:node是單線程運行的,所以不用考慮多線程地帶來的同步啊、死鎖之類的問題,但同時會帶來一些問題,比如無法充分的利用多核CPU、一旦報錯,程序就GG、CPU過載就會出異常等,對於這些問題,node也有一個簡單的解決辦法就是child_process,這個暫時先不談
  3. 跨平臺:作爲一個後臺運行平臺,這是JavaScript浩浩蕩蕩進軍後臺之勢,當然也要像後臺爸爸Java一樣跨平臺纔好用哈
  4. 事件與回調函數:node是基於事件驅動的,基於事件編程有輕量級、輕耦合、只關注事務點等優勢,其實就是更關注業務邏輯,畢竟是前端

最後的問題,node可以用來幹什麼

如上的node優勢所說,一方面,node基於異步IO的特點,node擅長於處理IO密集型業務,另一方面,V8是十分強大的,所以node也很適合CPU密集型業務,而且效率不比java差哈,同時,node也比較適合於做一些遊戲開發領域的事情、做分佈式應用和一些工具類應用的開發


第二章 node模塊機制

node模塊機制

關於node的模塊機制,首先提一下CommonJS,CommonJS就是爲JS的表現來制定規範,因爲js沒有模塊的功能所以CommonJS應運而生,它希望js可以在任何地方運行,不只是瀏覽器中。CommonJS的模塊規範如下

//a.js
exports.yeah = function () {
    console.log('yeah')
}

//b.js
var yeah = require('yeah')

在文件a中通過exports暴露出去一個yeah方法,然後在b.js文件中通過require引用,十分方便,但是CommonJS的缺陷還是很明顯的,沒有模塊系統,標準庫很少,沒有標準的接口,缺乏包管理系統等。

作爲站在巨人肩膀上的node,node在實現中並非完全按照CommonJS的模塊規範,而是對模塊規範進行了一定的取捨,同事也增加了不少自身需要的特性。

node的模塊分爲兩類,一種是Node提供的模塊,叫做核心模塊;一種是用戶自己編寫的模塊,叫做文件模塊
核心模塊被編譯成二進制執行文件,在node啓動時就被直接加載到內存中,所以執行速度最快,文件模塊則是運行時加載,按照路徑分析 –> 文件定位 –> 編譯執行 的步驟加載執行

node有自己的包規範NPM,npm是什麼,npm是一個包管理的神器,這個真的不能多說,每天都用

前後端共用模塊

前後端共用模塊主要有兩種,AMD和CMD

AMD 即Asynchronous Module Definition,中文名是異步模塊定義的意思。它是一個在瀏覽器端模塊化開發的規範,由於不是JavaScript原生支持,使用AMD規範進行頁面開發需要用到對應的庫函數,也就是大名鼎鼎RequireJS,實際上AMD 是 RequireJS 在推廣過程中對模塊定義的規範化的產出

requireJS主要解決兩個問題

  1. 多個js文件可能有依賴關係,被依賴的文件需要早於依賴它的文件加載到瀏覽器
  2. js加載的時候瀏覽器會停止頁面渲染,加載文件越多,頁面失去響應時間越長

看一個使用requireJS的例子

// 定義模塊 myModule.js
define(['dependency'], function(){
    var name = 'Byron';
    function printName(){
        console.log(name);
    }

    return {
        printName: printName
    };
});

// 加載模塊
require(['myModule'], function (my){
  my.printName();
});

CMD由國內的玉伯提出,CMD模塊更接近於Node對CommonJS的實現,CMD和AMD有什麼區別,看下玉伯是怎麼回答的吧https://www.zhihu.com/question/20351507/answer/14859415


第三章 異步IO

異步IO真心沒啥可提的,需要知道的是異步IO實現的核心是事件循環(過去是輪詢技術),他與瀏覽器中的執行模型基本保持了一致。


前端新手,弱雞一枚,如有錯誤,請指正,謝謝!

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