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借鑑了commonJs的modules規範。
規範:引用: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文件,就是通過編譯後的源代碼。源代碼編譯生成機器語言,再由機器運行機器碼(二進制)。
解釋:將源代碼逐條轉換成目標代碼,同時逐條運行的過程,解釋是每次程序運行是隨翻譯執行(相似英文的同聲傳譯)。程序時要由解釋器程序實時地將源代碼轉換成二進制形式運行。
##語言分類
*根據解釋和編譯兩種執行方式,編程語言分爲解釋型語言和編譯型語言;
編譯型語言的優勢:運行速度快,代碼效率高,編譯後程序不能夠修改,保密性好。
編譯型語言的缺點:
解釋型語言的優勢:
①解釋型語言提供了極佳的調試支持。
②解釋器比編譯器容易實現。
③中間語言代碼的大小比編譯型可執行代碼小不少。例如,C/C++的.exe文件要比一樣功能的Java的.class文件大不少。
④可移植性好,只要有解釋環境,能夠在不一樣的操做系統上運行。好比在解釋執行時能夠動態改變變量的類型、對程序進行修改以及在程序中插入良好的調試診斷信息等,而將解釋器移植到不一樣的系統上,則程序不用改動就能夠在移植瞭解釋器系統上運行。
⑤解釋型語言也能夠保證高度的安全性—這是互聯網應用迫切須要的。
解釋型語言的缺點:
①運行須要解釋環境,程序嚴重依賴平臺。
②運行起來比編譯的要慢,佔用的資源也要多一些,代碼效率低。由於不只要給用戶程序分配空間,解釋器自己也佔用了寶貴的系統資源。
③因爲解釋型應用的decode-fetch-execute(解碼-抓取-執行)的週期,它們比編譯型程序慢不少。
*根據語言的結構是否可變,編程語言分爲動態語言和靜態語言;
動態語言:動態類型語言是指在運行期間纔去作數據類型檢查的語言,也就是說,在用動態類型的語言編程時,永遠也不用給任何變量指定數據類型,該語言會在你第一次賦值給變量時,在內部將數據類型記錄下來。優勢在於其結構很是規範,便於調試,方便類型安全;缺點是爲此須要寫更多的類型相關代碼,致使不便於閱讀、不清晰明瞭;
靜態語言:靜態類型語言與動態類型語言恰好相反,它的數據類型是在編譯其間檢查的,也就是說在寫程序時要聲明全部變量的數據類型。優勢在於方便閱讀,不須要寫很是多的類型相關的代碼;缺點:天然就是不方便調試,命名不規範時會形成讀不懂,不利於理解等。(因爲類型容易混淆,不容易調試任何類型能夠互相賦值的形成的結果);
腳本語言:又被稱爲擴建的語言,或者動態語言,是一種編程語言,用來控制軟件應用程序,腳本一般以文本保存,只在被調用時進行解釋或編譯。腳本語言是一種解釋性的語言,它不象c/c++等能夠編譯成二進制代碼,以可執行文件的形式存在,腳本語言不須要編譯,能夠直接用,由解釋器來負責解釋。