node學習篇02-模塊機制

1、BS or CS ?javascript

        C/S即Client/Server,客戶機/服務器模式。前端

        兩層:客戶機和服務器兩層,第一層,在客戶機系統上結合了界面顯示與業務邏輯;第二  層,經過網絡結合了數據庫服務器。java


          特 點:若是用戶要使用的話,須要下載客戶端,安裝後就可使用node

          優缺點:界面和操做能夠很豐富;兩層傳輸,安全性高;只有一層交互,響應速度快。通常在局域網中,適用面窄;需安裝,用戶羣固定;升級成本高,發生一次升級,全部程序都須要更新。c++

         B/S全稱爲Browser/Server,即瀏覽器/服務器結構。web

         三層:表現層主要完成用戶和後臺的交互及最終查詢結果的輸出功能;邏輯層主要是利用服務器完成客戶端的應用邏輯功能;數據層主要是接受客戶端請求後獨立進行各類運算。 數據庫


         優缺點:無需安裝客戶端,有瀏覽器便可; 架構在廣域網上,交互性強;更新迭代方便,只需更新服務器便可。跨瀏覽器適配問題;中間層較多,速度和安全性問題;請求響應的交互模式,須要刷新頁面,不友好。npm

          架構形式:客戶端-服務器-數據庫;編程

                            客戶端-web服務器-應用服務器-數據庫json

                            客戶端-負載均衡器(Nginx)-中間服務器(Node)-應用服務器-數據庫

2、JavaScript發展歷程

       工具類庫-〉組件庫-〉前端框架-〉前端應用(不斷抽象類化的過程)

       暴露的問題:缺少模塊。經過script方式引入代碼雜亂無章。

       Javascript規範:CommomJs

3、CommonJs規範

      Javascript缺陷:沒有模塊系統;標準庫較少;沒有統一標準接口;缺少包管理系統。

      CommonJs目的:但願javascript可以在任何地方運行。使javascript能編寫服務端應用程序,命令行工具,桌面應用程序,混合應用。

      Node借鑑了commonJsmodules規範。

      規範:引用:require();定義:exports;模塊標識:小駝峯命名的字符患/路徑;

      導出:在node中,一個文件就是一個模塊,模塊中存在module對象,它表明模塊自己,exports是module的屬性。

4、Node模塊實現

        node加載模塊三步驟:路徑分析 文件定位 編譯執行

        node模塊分類:核心模塊 文件模塊

        核心模塊:node提供,在node源碼編譯中編譯進了二進制執行文件,在node啓動時,部分加載到內存中,不須要文件定位和編譯執行,而且在路徑分析中優先判斷,加載速度最快

       文件模塊:運行時動態加載,需完成三步驟,速度比核心模塊慢

       模塊緩存加載策略:node對引入過的模塊進行緩存,緩存的是編譯和執行以後的對象。

       路徑分析與模塊定位:modules.paths,與js做用域鏈查找方式類似,逐級查找直到查找到文件。文件標示符不包含擴展名,按照.js 、.json、.node的順序依次補足擴展名嘗試。

       模塊編譯:按照不一樣擴展名採用不一樣載入方式

                        .js 經過fs模塊同步讀取後編譯執行。

                        .node,c++編寫的擴展文件,經過dlopen()加載後編譯生成文件

                        .json,經過fs模塊同步讀取後,用json.parse()返回結果

                        其他文件按js文件載入

5、核心模塊

         編譯成可執行文件過程當中被編譯進了二進制文件。分爲javascript編寫和c++編寫兩部分。C++編寫的放在node項目src文件夾下,javascript編寫的放在lib目錄下。

       Javascript核心模塊的編譯:轉存爲c/c++代碼(v8附帶的js2c.py工具),經過process.binding(‘natives’)取出,編譯成功模塊緩存在NativeModule._cache對象上,文件模塊緩存在 Module._cache上。

        c/c++核心模塊的編譯:有的所有由c++編寫,有的c++完成核心部分,其餘部分由javascript實現包裝向外導出。這種c++完成核心,javascript完成峯和鑽過的模式是node提升性能的常見方式。一般腳本語言的開發速度優於靜態語言,可是其性能弱於靜態語言。Node的複合模式在開發速度和性能之間找到了平衡點。

        核心模塊分類:由存c++編寫的部分稱爲內建模塊。如buffer、fs、os。內建模塊的優點在於:首先它由c++編寫,性能上優於腳本語言,其次,在進行文本編譯時,編譯爲二進制文件,一旦node執行,被直接加載到內存中,無需標識定位、文件定位、編譯過程便可執行。

6、C++擴展模塊  

        經過預先編譯爲.node文件,而後調用process.dlopen()方法執行。

7、包與npm

        node第三方模塊經過包與npm將模塊聯繫起來。


      包結構:package.json:包描述文件。bin:存放包可執行二進制文件的目錄。lib:存放javascript代碼的目錄。doc:存放文檔的目錄。test:存放單元測試用例的代碼。

       

 ##代碼分類:源代碼/目標代碼

      源代碼:採用某種編程語言編寫的計算機程序,人類可讀,如result=1+2

      目標代碼:計算機可直接執行,人類不可讀(專家除外),如11010010

      將源代碼轉換爲目標代碼的方式:解釋/編譯

      編譯:將源代碼一次性轉換成目標代碼的過程。編譯是一次性翻譯,以後再也不須要源代碼(相似英文翻譯)經常使用的.exe文件,就是通過編譯後的源代碼。源代碼編譯生成機器語言,再由機器運行機器碼(二進制)。


      解釋:將源代碼逐條轉換成目標代碼,同時逐條運行的過程,解釋是每次程序運行是隨翻譯執行(相似英文的同聲傳譯)。程序時要由解釋器程序實時地將源代碼轉換成二進制形式運行。



##語言分類

*根據解釋和編譯兩種執行方式,編程語言分爲解釋型語言編譯型語言

編譯型語言的優勢:運行速度快,代碼效率高,編譯後程序不能夠修改,保密性好。

編譯型語言的缺點

  1. 代碼須要通過編譯方可運行,可移植性差,只能在兼容的操做系統上運行。
  2. 安全性不如解釋性語言,一個編譯型的程序能夠訪問內存的任何區域,而且能夠對你的PC作它想作的任何事情(大部分病毒是使用編譯型語言編寫的)。

  解釋型語言的優勢:

    ①解釋型語言提供了極佳的調試支持。

    ②解釋器比編譯器容易實現。

    ③中間語言代碼的大小比編譯型可執行代碼小不少。例如,C/C++的.exe文件要比一樣功能的Java的.class文件大不少。

    ④可移植性好,只要有解釋環境,能夠在不一樣的操做系統上運行。好比在解釋執行時能夠動態改變變量的類型、對程序進行修改以及在程序中插入良好的調試診斷信息等,而將解釋器移植到不一樣的系統上,則程序不用改動就能夠在移植瞭解釋器系統上運行。

    ⑤解釋型語言也能夠保證高度的安全性—這是互聯網應用迫切須要的。

    解釋型語言的缺點:

    ①運行須要解釋環境,程序嚴重依賴平臺。

    ②運行起來比編譯的要慢,佔用的資源也要多一些,代碼效率低。由於不只要給用戶程序分配空間,解釋器自己也佔用了寶貴的系統資源。

    ③因爲解釋型應用的decode-fetch-execute(解碼-抓取-執行)的週期,它們比編譯型程序慢不少。

*根據語言的結構是否可變,編程語言分爲動態語言靜態語言

    動態語言:動態類型語言是指在運行期間纔去作數據類型檢查的語言,也就是說,在用動態類型的語言編程時,永遠也不用給任何變量指定數據類型,該語言會在你第一次賦值給變量時,在內部將數據類型記錄下來。優勢在於其結構很是規範,便於調試,方便類型安全;缺點是爲此須要寫更多的類型相關代碼,致使不便於閱讀、不清晰明瞭;

    靜態語言:靜態類型語言與動態類型語言恰好相反,它的數據類型是在編譯其間檢查的,也就是說在寫程序時要聲明全部變量的數據類型。優勢在於方便閱讀,不須要寫很是多的類型相關的代碼;缺點:天然就是不方便調試,命名不規範時會形成讀不懂,不利於理解等。(因爲類型容易混淆,不容易調試任何類型能夠互相賦值的形成的結果);

    腳本語言:又被稱爲擴建的語言,或者動態語言,是一種編程語言,用來控制軟件應用程序,腳本一般以文本保存,只在被調用時進行解釋或編譯。腳本語言是一種解釋性的語言,它不象c/c++等能夠編譯成二進制代碼,以可執行文件的形式存在,腳本語言不須要編譯,能夠直接用,由解釋器來負責解釋。

相關文章
相關標籤/搜索