node学习篇02-模块机制
一、BS or CS ?
? ? ? ? C/S:即Client/Server,客戶機/服務器模式。
? ? ? ? 兩層:客戶機和服務器兩層,第一層,在客戶機系統上結合了界面顯示與業務邏輯;第二? 層,通過網絡結合了數據庫服務器。
? ? ? ? ? 特 點:如果用戶要使用的話,需要下載客戶端,安裝后就可以使用
? ? ? ? ? 優缺點:界面和操作可以很豐富;兩層傳輸,安全性高;只有一層交互,響應速度快。一般在局域網中,適用面窄;需安裝,用戶群固定;升級成本高,發生一次升級,所有程序都需要更新。
? ? ? ? ?B/S:全稱為Browser/Server,即瀏覽器/服務器結構。
? ? ? ? ?三層:表現層主要完成用戶和后臺的交互及最終查詢結果的輸出功能;邏輯層主要是利用服務器完成客戶端的應用邏輯功能;數據層主要是接受客戶端請求后獨立進行各種運算。?
? ? ? ? ?優缺點:無需安裝客戶端,有瀏覽器即可; 架構在廣域網上,交互性強;更新迭代方便,只需更新服務器即可。跨瀏覽器適配問題;中間層較多,速度和安全性問題;請求響應的交互模式,需要刷新頁面,不友好。
? ? ? ? ? 架構形式:客戶端-服務器-數據庫;
? ? ? ? ? ? ? ? ? ? ? ? ? ? 客戶端-web服務器-應用服務器-數據庫
? ? ? ? ? ? ? ? ? ? ? ? ? ? 客戶端-負載均衡器(Nginx)-中間服務器(Node)-應用服務器-數據庫
二、JavaScript發展歷程
? ? ? ?工具類庫-〉組件庫-〉前端框架-〉前端應用(不斷抽象類化的過程)
? ? ? ?暴露的問題:缺乏模塊。通過script方式引入代碼雜亂無章。
? ? ? ?Javascript規范:CommomJs
三、CommonJs規范
? ? ? Javascript缺陷:沒有模塊系統;標準庫較少;沒有統一標準接口;缺乏包管理系統。
? ? ? CommonJs目的:希望javascript能夠在任何地方運行。使javascript能編寫服務端應用程序,命令行工具,桌面應用程序,混合應用。
? ? ? Node借鑒了commonJs的modules規范。
? ? ? 規范:引用:require();定義:exports;模塊標識:小駝峰命名的字符患/路徑;
? ? ? 導出:在node中,一個文件就是一個模塊,模塊中存在module對象,它代表模塊本身,exports是module的屬性。
四、Node模塊實現
? ? ? ? node加載模塊三步驟:路徑分析 文件定位 編譯執行
? ? ? ? node模塊分類:核心模塊 文件模塊
? ? ? ? 核心模塊:node提供,在node源碼編譯中編譯進了二進制執行文件,在node啟動時,部分加載到內存中,不需要文件定位和編譯執行,并且在路徑分析中優先判斷,加載速度最快
? ? ? ?文件模塊:運行時動態加載,需完成三步驟,速度比核心模塊慢
? ? ? ?模塊緩存加載策略:node對引入過的模塊進行緩存,緩存的是編譯和執行之后的對象。
? ? ? ?路徑分析與模塊定位:modules.paths,與js作用域鏈查找方式相似,逐級查找直到查找到文件。文件標示符不包含擴展名,按照.js 、.json、.node的順序依次補足擴展名嘗試。
? ? ? ?模塊編譯:按照不同擴展名采用不同載入方式
? ? ? ? ? ? ? ? ? ? ? ? .js 通過fs模塊同步讀取后編譯執行。
? ? ? ? ? ? ? ? ? ? ? ? .node,c++編寫的擴展文件,通過dlopen()加載后編譯生成文件
? ? ? ? ? ? ? ? ? ? ? ? .json,通過fs模塊同步讀取后,用json.parse()返回結果
? ? ? ? ? ? ? ? ? ? ? ? 其余文件按js文件載入
五、核心模塊
? ? ? ? ?編譯成可執行文件過程中被編譯進了二進制文件。分為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執行,被直接加載到內存中,無需標識定位、文件定位、編譯過程即可執行。
六、C++擴展模塊??
? ? ? ? 通過預先編譯為.node文件,然后調用process.dlopen()方法執行。
七、包與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++等可以編譯成二進制代碼,以可執行文件的形式存在,腳本語言不需要編譯,可以直接用,由解釋器來負責解釋。
? ? ? ? ??
轉載于:https://juejin.im/post/5d079112f265da1b8b2b5f2a
總結
以上是生活随笔為你收集整理的node学习篇02-模块机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring学习总结(2)——Sprin
- 下一篇: RPA女子计划—面向日本女性的工作方式改