什么是nodejs
Node.js 是一個基于 Chrome V8 引擎的 JavaScript 運行環(huán)境。 Node.js 使用了一個事件驅動、非阻塞式 I/O 的模型,使其輕量又高效。
tips:nodejs不是一個框架,也不是一門編程語言。
nodejs的作用
- nodejs一般用于服務器開發(fā)。解決和創(chuàng)建高性能的網(wǎng)絡應用程序,這里就不得不提到nodejs的幾個特點了。
- 事件驅動
- 簡單的來說就是有事情觸發(fā)在執(zhí)行,如果你學習過java,那么你或多或少會知道觀察者模式,nodejs就相當于觀察者模式。
由于JavaScript是單線程的,利用事件輪詢、任務隊列的異步操作來執(zhí)行。生動的說就像有一個死循環(huán),當有事物觸發(fā)循環(huán)中的某個條件時,再執(zhí)行該條件對應的邏輯。
- 簡單的來說就是有事情觸發(fā)在執(zhí)行,如果你學習過java,那么你或多或少會知道觀察者模式,nodejs就相當于觀察者模式。
- 非阻塞 IO(異步) 模型
- 了解JavaScript就一定知道異步操作,回調函數(shù)這是JavaScript語言的一種特性。tips:es6 promise鏈式編程者的福音。
- 單線程
- 這個沒得說JavaScript本生就是單線程。
- 跨平臺
- 只要有node環(huán)境就能運行node程序了。
- 事件驅動
- 命令行工具
- 爬蟲
- ......
nodejs的發(fā)展歷史
-
node之父是Ryan Dahl
tips: 現(xiàn)在去搞
go了- 2009年,Ryan Dahl發(fā)布了最初的 Node 版本
- 2010年,Ryan Dahl 全職負責 Node 的發(fā)展
- 2011年,Node 在微軟的支持下發(fā)布了 Windows 版
- 2012年,Ryan Dahl 將node轉交給了 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:要學就用最新版本
安裝node環(huán)境
- 下載后一直點下一步,下一步就能安裝成功
- 安裝成功后打開命令行輸入
node --version,能顯示相應的版本表示安裝成功。
- 安裝成功后打開命令行輸入
這時候我們可以試試nodejs的作用,你可以直接在命令行輸入node,這就相當于一個編寫頁一樣,你可以試著寫console.log('hello'),回車控制臺輸出 hello。
-
其實
node不僅可以跟命令還可以接js文件執(zhí)行- 你可以將代碼寫到文件中,
node hello.js也是同樣的效果,前提是你當前路徑必須包含此文件,不然報錯
- 你可以將代碼寫到文件中,
-
common.js
- nodejs是采用了commonJS規(guī)范的。
- 為什么會有這個規(guī)范呢,因為
JavaScript天生就不支持模塊化。還沒有塊級作用域。
- 為什么會有這個規(guī)范呢,因為
本java程序員表示非常不解。
* 所以瀏覽器的JavaScript和node中的JavaScript不是一樣的。
+ nodejs的模塊化
* nodejs中使用require關鍵字來加載模塊,使用exports來導出模塊。
* nodejs中內置了一些核心模塊,我們可以使用fs這個讀寫文件的模塊來簡單了解nodejs。 - nodejs是采用了commonJS規(guī)范的。
//引入fs模塊
var fs = require('fs');
//假設我要讀取一個名字問hello.txt的文件
fs.readFile('./hello.txt',function (err, data) {
//如果讀取失敗
if (err) {
console.log('讀取文件失??!');
return;
}
console.log(data);
})
這是一個簡單的異步的讀取文件
其實fs模塊還有寫文件等功能,這里就不一一說明。
- 我們可以了解到
var fs = require('fs');可以引入一個核心模塊,它也可以引入一個第三方模塊,還可以引入自己寫的模塊。- 假設我有個模塊叫hello.js那么它就是這樣。
//后綴的.js可以省略,也可以不省,隨你的性子來,但是99%人都省了所以.... var hello = require('./hello');- 加載的時候會執(zhí)行hello.js內的所有代碼。但是如果hello.js中沒有
exports的話那這個hello就是空的。
- nodejs中的模塊導出。
- 你可以這樣寫hello.js來返回內容
exports.say = function () { console.log('hello'); }- 那么調用這個模塊的人就可以這樣用
var hello = require('./hello'); hello.say();- 這是導出一個say,當然你也可以導出任何js支持的數(shù)據(jù)格式
- 但是這不是單個成員的時候
var num = 1; exports.num = num; exports.fun = function () { } //........
exports我們不導出單個成員時能這么寫,導出單個成員就不能這么寫了。
- exports的導出原理
- 其實可以這樣理解
- 很簡單我相信你一看代碼就懂了
//相當于每個模塊最前方有這幾句代碼
var module = {
exports:{}
}
// 模塊中同時還有一個成員 exports 等價于 module.exports
var exports = module.exports;
/**
* 你寫的代碼其實都在這里,懂了嗎?
* 其實實際返回的是module.exports。exports只是module.exports的簡寫。
* 當exports=時引用地址變了,而module.exports的引用地址沒有改變。
* 實際返回的是module.exports
**/
return module.exports;
+ 所以要返回單個成員必須這樣
```javascript
module.exports = xx;
```
ok,今天就寫到這。