什么是nodejs
Node.js 是一個基于 Chrome V8 引擎的 JavaScript 運行環(huán)境。 Node.js 使用了一個事件驅(qū)動先匪、非阻塞式 I/O 的模型种吸,使其輕量又高效。
tips:nodejs不是一個框架胚鸯,也不是一門編程語言骨稿。
nodejs的作用
- nodejs一般用于服務(wù)器開發(fā)。解決和創(chuàng)建高性能的網(wǎng)絡(luò)應(yīng)用程序姜钳,這里就不得不提到nodejs的幾個特點了坦冠。
- 事件驅(qū)動
- 簡單的來說就是有事情觸發(fā)在執(zhí)行,如果你學(xué)習(xí)過java哥桥,那么你或多或少會知道觀察者模式辙浑,nodejs就相當(dāng)于觀察者模式。
由于JavaScript是單線程的拟糕,利用事件輪詢判呕、任務(wù)隊列的異步操作來執(zhí)行倦踢。生動的說就像有一個死循環(huán),當(dāng)有事物觸發(fā)循環(huán)中的某個條件時侠草,再執(zhí)行該條件對應(yīng)的邏輯辱挥。
- 簡單的來說就是有事情觸發(fā)在執(zhí)行,如果你學(xué)習(xí)過java哥桥,那么你或多或少會知道觀察者模式辙浑,nodejs就相當(dāng)于觀察者模式。
- 非阻塞 IO(異步) 模型
- 了解JavaScript就一定知道異步操作,回調(diào)函數(shù)這是JavaScript語言的一種特性边涕。tips:es6 promise鏈?zhǔn)骄幊陶叩母R簟?/li>
- 單線程
- 這個沒得說JavaScript本生就是單線程晤碘。
- 跨平臺
- 只要有node環(huán)境就能運行node程序了。
- 事件驅(qū)動
- 命令行工具
- 爬蟲
- ......
nodejs的發(fā)展歷史
-
node之父是Ryan Dahl
tips: 現(xiàn)在去搞
go
了- 2009年功蜓,Ryan Dahl發(fā)布了最初的 Node 版本
- 2010年园爷,Ryan Dahl 全職負責(zé) Node 的發(fā)展
- 2011年,Node 在微軟的支持下發(fā)布了 Windows 版
- 2012年式撼,Ryan Dahl 將node轉(zhuǎn)交給了 Isaac Z.Schlueter
- 2015年童社,Node 與 io.js 合并,Node 的版本從 0.12.7 升級到了 4.0.0
- 合并后的 io.js 和 Node 在 Joyent 公司的維護下并行了兩個版本:
- 一個是4.x.x 還是原來的 Node著隆,這個版本是穩(wěn)定版
- 一個是5.x.x扰楼,目前已經(jīng)更新到了 6.8.1,其實就是 io.js旅东,最新特性版灭抑,不建議生產(chǎn)環(huán)境使用
- Node 計劃在 2016 年 10月底正式發(fā)布 Node 7.0
- 7.0 已經(jīng)最大限度的支持了很多的 ES6 新語法
- 而且提高了整體的執(zhí)行性能,提供了一些別的API
tips:要學(xué)就用最新版本
安裝node環(huán)境
- 下載后一直點下一步抵代,下一步就能安裝成功
- 安裝成功后打開命令行輸入
node --version
,能顯示相應(yīng)的版本表示安裝成功腾节。
- 安裝成功后打開命令行輸入
這時候我們可以試試nodejs的作用,你可以直接在命令行輸入node
,這就相當(dāng)于一個編寫頁一樣荤牍,你可以試著寫console.log('hello')
,回車控制臺輸出 hello案腺。
-
其實
node
不僅可以跟命令還可以接js文件執(zhí)行- 你可以將代碼寫到文件中,
node hello.js
也是同樣的效果康吵,前提是你當(dāng)前路徑必須包含此文件劈榨,不然報錯
- 你可以將代碼寫到文件中,
-
common.js
- nodejs是采用了commonJS規(guī)范的。
- 為什么會有這個規(guī)范呢晦嵌,因為
JavaScript
天生就不支持模塊化同辣。還沒有塊級作用域。
- 為什么會有這個規(guī)范呢晦嵌,因為
本java程序員表示非常不解惭载。
* 所以瀏覽器的JavaScript和node中的JavaScript不是一樣的旱函。
+ nodejs的模塊化
* nodejs中使用require
關(guān)鍵字來加載模塊,使用exports
來導(dǎo)出模塊描滔。
* nodejs中內(nèi)置了一些核心模塊棒妨,我們可以使用fs這個讀寫文件的模塊來簡單了解nodejs。 - nodejs是采用了commonJS規(guī)范的。
//引入fs模塊
var fs = require('fs');
//假設(shè)我要讀取一個名字問hello.txt的文件
fs.readFile('./hello.txt',function (err, data) {
//如果讀取失敗
if (err) {
console.log('讀取文件失敽ぁ券腔!');
return;
}
console.log(data);
})
這是一個簡單的異步的讀取文件
其實fs模塊還有寫文件等功能伏穆,這里就不一一說明。
- 我們可以了解到
var fs = require('fs');
可以引入一個核心模塊纷纫,它也可以引入一個第三方模塊枕扫,還可以引入自己寫的模塊。- 假設(shè)我有個模塊叫hello.js那么它就是這樣涛酗。
//后綴的.js可以省略铡原,也可以不省,隨你的性子來商叹,但是99%人都省了所以.... var hello = require('./hello');
- 加載的時候會執(zhí)行hello.js內(nèi)的所有代碼。但是如果hello.js中沒有
exports
的話那這個hello就是空的只泼。
- nodejs中的模塊導(dǎo)出剖笙。
- 你可以這樣寫hello.js來返回內(nèi)容
exports.say = function () { console.log('hello'); }
- 那么調(diào)用這個模塊的人就可以這樣用
var hello = require('./hello'); hello.say();
- 這是導(dǎo)出一個say,當(dāng)然你也可以導(dǎo)出任何js支持的數(shù)據(jù)格式
- 但是這不是單個成員的時候
var num = 1; exports.num = num; exports.fun = function () { } //........
exports我們不導(dǎo)出單個成員時能這么寫,導(dǎo)出單個成員就不能這么寫了请唱。
- exports的導(dǎo)出原理
- 其實可以這樣理解
- 很簡單我相信你一看代碼就懂了
//相當(dāng)于每個模塊最前方有這幾句代碼
var module = {
exports:{}
}
// 模塊中同時還有一個成員 exports 等價于 module.exports
var exports = module.exports;
/**
* 你寫的代碼其實都在這里弥咪,懂了嗎?
* 其實實際返回的是module.exports十绑。exports只是module.exports的簡寫聚至。
* 當(dāng)exports=時引用地址變了,而module.exports的引用地址沒有改變本橙。
* 實際返回的是module.exports
**/
return module.exports;
+ 所以要返回單個成員必須這樣
```javascript
module.exports = xx;
```
ok,今天就寫到這扳躬。