深入基础(一)模块化
簡介
? ? 學習基礎,JQuery 原生JS有一定基礎,有自己一定技術認知(ps:原型鏈依然迷糊中.閉包6不起來!哎!)
當然最好有語言基礎,C#,java,PHP等等..
? ? 最初學習這個東西的原因很簡單,在園子里面看到一篇關于node編寫的小爬蟲 的文章,沒想到這個可以做一些服務自己的東西而不是公司那些服務用戶啊什么什么的.總之不牽扯到公司的技術都很感興趣,后來發現angluar.js里面也有node.js一點身影,好吧,好吧逼我唄..so 學吧!說實話并不想靠掌握這個如果升職加薪如何如何的,我只想做自己喜歡的事兒寫服從于我自己的程序,就是這么簡單.
這里要說明一下文中很多地方都是各出引用過來,對于很多不明白的地方會針對某個對象,方法等作出補充說明,爭取學習不留死角,一般一片學習很少很少的內容卻需要大量的補充來填補知識空白這也許就是最難的地方.
安裝
? ?言歸正傳,node.js簡介:
?
? ? ? ? ? 簡單的說 Node.js 就是運行在服務端的 JavaScript。
?
? ? ? ? ? Node.js 是一個基于Chrome JavaScript 運行時建立的一個平臺。
?
? ? ? ? ? Node.js是一個事件驅動I/O服務端JavaScript環境,基于Google的V8引擎,V8引擎執行Javascript的速度非常快,性能非常好。
?
? ? ? ? ? 模塊化(module),JS的致命傷一直計劃引進據說ES6中已經引入了模塊化概念了并沒有實際實現(知識薄淺,書到用時方恨少),通過實現CommonJS中的Modules1.0概念來完善自己的模塊化
?
?
? ?如題谷歌V8引擎,聽起來吊吊的 實際上也是很吊的,前端開發的同學對于谷歌瀏覽器并不陌生或多或少接觸過或者使用過我就不多介紹啦,主要是多了我也不知道哈哈.但是最顯而易見的效果在于node處理高并發問題上有突出效果!
?
? ? ? ?安裝環境 windows啊,linux啊,os啊,自己去看 網址在這里:https://nodejs.org/en/download/。
?
? ? ? ?安裝過程就不多說了,哦,有一點對于DOS命令不熟的童鞋們還是老老實實安裝C盤吧 ,或多或少會用到一點點 .教程:http://jingyan.baidu.com/article/656db9189b826ce381249ce8.html
?
? ? 搞完了之后看看系統PATH環境里面有沒有配置node.js:
?
? ? ? ?檢測PATH環境變量是否配置了Node.js,點擊開始=》運行=》輸入"cmd" => 輸入命令"path",輸出如下結果:
?
? ? ? ?PATH=C:\oraclexe\app\oracle\product\10.2.0\server\bin;C:\Windows\system32;?C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\; c:\python32\python;C:\MinGW\bin;C:\ProgramFiles\GTK2-Runtime\lib;?C:\Program?Files\MySQL\MySQL?Server?5.5\bin;C:\Program?Files\nodejs\;?C:\Users\rg\AppData\Roaming\npm
? ? ? ?似乎就是你所安裝的node.js的地址不過這東西沒有的話node是運行不起來的!找到它 沒有的話就添加上!
當然可以手動修改一下Path地址右鍵我的電腦-屬性-高級系統設置-環境變量-找到path 關于nodejs那段文字 修改去吧~只要吧你的文件地址搞上面去就行了,別的別輕易動,雖然我也不知道會發生什么但是我還是鼓勵喜歡動手的小伙伴修改一下試試看!
? ? ? 搞完了之后基本工作就完成了!當然安裝的不僅僅是node.js安裝同時也會默認安裝臺的包管理工具npm! 個人認為比較強大的包管理工具,有點像git工具一樣可以直接用命令從服務器更新啊,下模塊啊,上傳自己的包啊等等,反正很好用可以搞很多事兒理解有限以后我再詳細研究一下子
輸入npm-v直接顯示當前npm的版本.
模塊化
? ? 關于nodejs里面的模塊化知識點(module),nodejs模塊化大致分為兩類一類是原生模塊(跟JS一樣原生什么的都是重中之重),另外一類是文件模塊.
? ? 文件模塊
? ? 文件模塊,我首先想到的是類似與C#里面文件數據交互相關的IO數據流,其實不然nodejs中文件模塊引用了三種文件識別方式:
? ? ? ? ? 1. .js ?既然是模塊化 當然自己得有個專門處理文件的模塊了 -- fs模塊(那筆記下來好不容易找到的--)
? ? ? ? ? ? ? FS模塊剛剛被我言中了,采用的是標準的POSIX文件 I/O操作集(不明白的童鞋自己去百度吧,不能再深入了!),可以通過nodejs中的require("fs")來喚起該模塊并且該模塊有同步/異步兩種傳輸方式:
? ? ? ? ? ? ? ? ? ?1)兩種方式不同點在于?同步傳遞文件時候會出現程序異常,當然可以trycatch捕獲到,而異步傳遞時候會直接返回null或者undefined
? ? ? ? ? ? ? ? ? ?2)讀取文件時一定要設置文件編碼,默認編碼是'buffer'如果你在下面的例子中文件里面輸入的是中文就能明顯的看出來了!
? ? ? ? ? ? ? 下面介紹兩個例子,這是下面具體實例:
//文件讀取操作var fs = require("fs") ;fs.readFile("bb.txt","utf8",function (error,data){if(error) throw error ;console.log(data) ;}) ;//文件寫入操作 var fs = require("fs") ;var txt = "大家要好好學習NodeJS啊!!!" ;//寫入文件fs.writeFile("bb.txt",txt,function (err) {if (err) throw err ;console.log("File Saved !"); //文件被保存}) ;? ? ? ??2.".node" ?Addon這個是C/C++編寫的操作原理未知...通過其中的dlopen方法來進行加載(想更深入的童鞋請自行百度,這塊我大致看了一下太深入了真心不好懂)
? ? ? ? ? 3.".Json" 這個大家都不會陌生 尤其做前端的小伙伴們 這個是調取JSON.parse 方式來解析json數據的
? ? ?原生模塊
? ? ? ? ??關于原生模塊,也就是nodejs自帶模塊還是參考一下官方文檔吧,畢竟那個東西是最最基礎的最最可信的,后續也會陸續介紹一些常用的原生模塊.
? ? ?NodeJS模塊查詢策略
? ? ? ? ? ? ?node提供了兩個對象,exports和require兩個對象,其中exports是模塊公開的接口,require是從外部獲取一個模塊接口,即所獲取模塊的exports對象.(這句話有點難以理解稍后有解釋)
? ?原生模塊在nodejs編譯進了二進制執行文件,加載速度最快,另外就是文件模塊速度肯定比不上原生模塊,但是由于加載機制,已經加載過的原生模塊和文件模塊不會再次被重新加載,如圖:
? ??
? ? ? ?這就很明朗了,這么吊的圖肯定不是我畫的呀 大神傳送門-->https://liuzhichao.com/p/1669.html
? ? ?剛才提到有兩個對象exports和require,這個圖很詳細說明了這哥倆之間的關系,我是這樣理解的:
? ? ? require對象就像JQuery中的$選擇器,這個大家肯定不陌生,當然有區別的,只是個比喻 如果把頁面元素都劃分為模塊的話$("<div></div>"),很簡單吧.我選擇的就是div這個模塊,好比require("fs")選擇的是原生模塊fs, ? ?有一點不知大家感覺到沒有,nodejs緩存機制特別到位,優先緩存查找有點像radis緩存一樣一些已經執行過方法不會被再次執行大大縮減了重復調取的性能損耗,但是這里不得不提及緩存問題,機制固然好畢竟這東西是一 ?把雙刃劍性能上去了,緩存溢出咋辦?有沒有專業的緩存清理機制,目前還不幾道,不過我肯定他絕對有.
? ? ?其次require接收的參數是啥? 1.原生模塊 2.相對,絕對路徑文件模塊 3.非原生模塊的文件模塊. require的查找線路是當年文件目錄的node_modules開始找,找不到就找父級目錄node_module以此類推直到根目錄下的 ?node_module文件為止,第二條的時候大家肯定注意到絕對路徑! ?沒錯性能就在一瞬間了 如果你給文件模塊地址是絕對地址,必然相當快省去反復遍歷時間而且require的查找機制不是遍歷全局這種機制 ?so好好利用這一點:? ? ??
? ? ? 這里的異常是有區別的下文提及調用類型有同步異步兩種 同步調用肯定就是異常了,這個可以trycatch截取到 另外就是異步調用啦 返回null或者undefined..很簡單的說 .
? ? ?Exports ?or ?module.exports
? ? ? ? ?首先必須理解了上面哪個圖,自然而然就會產生一個疑問exports干毛用的?為毛都返回的是exports,難道就是簡單的對象返回問題?
? ? ? ? ?帶著問題,這里有三個例子:創建兩個文件,server.js和test.js
? ? ? ? ? ? ?server.js中代碼:
?
var add=function(a,b){return a+b; };var minus=function(a,b){return a-b; };?
? test.js中的代碼:
var test=require("./server"); console.log(test.add(4,2));??然后執行test.js文件 神奇的效果出現了!! ? ? ?異常報錯!
? ? ? ? ? ?修改一下server.js代碼
?
var add=function(a,b){return a+b; };var minus=function(a,b){return a-b; };exports.add=add; exports.minus=minus;?
?結果為 6! ?簡單說明一下子 首先是require選擇執行文件server.js 結合上面哪個圖,之后nodejs 就去找了..哎~找到了 但是返回的是啥 他本身不認識 而是通過對象返回才認識的! 這個傳遞的快遞小哥就是exports!很明朗了吧!
? ? ? ? ? 吶是不是就可以認為返回的東西都可以往exports里面放呢?真的只是他自己返回的嘛?別忘了之前為啥叫module模塊化!當然module.exports,這里我就懶一下子 不舉例給大家啦 當然原文地址不能少:https://liuzhichao.com/p/1669.html
? ? ? ? ? 關于exports和module.exports 我個人是這樣理解的,因為node中沒有類的概念而某些特定情況下需要返回一個特定"對象"這種情景下module.exports就排上用場了 指定的對象情況,而exports并非指定的對象,也就是位置對象類型,這個有點類似C#中的泛型和非泛型...只是說類似,純屬個人理解.
?
?
? 1. .js ?既然是模塊化 當然自己得有個專門處理文件的模塊了 -- fs模塊(那筆記下來好不容易找到的--)
? ? ? ?FS模塊剛剛被我言中了,采用的是標準的POSIX文件 I/O操作集(不明白的童鞋自己去百度吧,不能再深入了!),可以通過nodejs中的require("fs")來喚起該模塊并且該模塊有同步/異步兩種傳輸方式:
? ? ? ? ?1)兩種方式不同點在于?同步傳遞文件時候會出現程序異常,當然可以trycatch捕獲到,而異步傳遞時候會直接返回null或者undefined
? ? ? ? ?2)讀取文件時一定要設置文件編碼,默認編碼是'buffer'如果你在下面的例子中文件里面輸入的是中文就能明顯的看出來了!
? ? ? ? ?下面介紹兩個例子,這是下面具體實例:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | //文件讀取操作 ?var?fs = require("fs") ; ?fs.readFile("bb.txt","utf8",function?(error,data){ ?????if(error)?throw?error ; ?????console.log(data) ; ?}) ; //文件寫入操作 var?fs = require("fs") ; ?var?txt =?"大家要好好學習NodeJS啊!!!"?; ?//寫入文件 ?fs.writeFile("bb.txt",txt,function?(err) { ?????if?(err)?throw?err ; ?????console.log("File Saved !");?//文件被保存 ?}) ; |
2.".node" ?Addon這個是C/C++編寫的操作原理未知...通過其中的dlopen方法來進行加載(想更深入的童鞋請自行百度)
? ? ?3.".Json" 這個大家都不會陌生 尤其做前端的小伙伴們 這個是調取JSON.parse 方式來解析json數據的
轉載于:https://www.cnblogs.com/workstation-liunianguowang/p/6268537.html
總結
以上是生活随笔為你收集整理的深入基础(一)模块化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql补充(1)校对集utf8_un
- 下一篇: 卡萨帝净水器好不好?