Node.js簡單瞭解

席潤發表於2019-02-15

官方文件中對Node.js的描述為:

Node.js 是一個基於 Chrome V8 引擎的 JavaScript 執行環境。 Node.js 使用了一個事件驅動、非阻塞式 I/O 的模型,使其輕量又高效。

1、Node.js是一個讓JavaScript執行在伺服器端的開發平臺。Node.js不是一種獨立的語言,Node.js使用JavaScript語言進行開發,執行在伺服器端的V8引擎上。Node.js沒有Web容器,它開發的網站可以不部署在任何HTTP伺服器上。

例知

http

var http = require('http')  //引入http模組

http
  .createServer(function(req, res) {
  	res.writeHead(200, {'Content-Type': 'text/plain'})
  	res.write('Hello Nodejs')
  	res.end()
  })  //啟動伺服器
  .listen(2019)  //監聽埠
複製程式碼

在瀏覽器開啟網址:localhost:2019,頁面列印出Hello Nodejs

小應用:程式碼

爬取頁面HTML原始碼

爬取頁面內資料

站內評論

事件監聽

var EventEmitter = require('events').EventEmitter
// 生成一個EventEmitter例項
var life = new EventEmitter()

// 設定監聽事件數量增大,<=11
life.setMaxListeners(11)

// 監聽函式

// 具名函式,可清楚
function water(who) {
	console.log('給 ' + who + ' 倒水')
}
life.on('touch', water)  //addEventListener

life.on('touch', function(who) {
  console.log('給 ' + who + ' 按摩')
})
life.on('touch', function(who) {
  console.log('給 ' + who + ' 做飯')
})
life.on('touch', function(who) {
  console.log('給 ' + who + ' 洗衣服')
})
life.on('touch', function(who) {
  console.log('給 ' + who + ' 掃地')
})
life.on('touch', function(who) {
  console.log('給 ' + who + ' 。。。6')
})
life.on('touch', function(who) {
  console.log('給 ' + who + ' .。。7')
})
life.on('touch', function(who) {
  console.log('給 ' + who + ' .。。8')
})
life.on('touch', function(who) {
  console.log('給 ' + who + ' .。。9')
})
life.on('touch', function(who) {
  console.log('給 ' + who + ' .。。10')
})
life.on('touch', function(who) {
  console.log('我還能再做一件事哦')
})

life.on('nani', function(who) {
  console.log('給 ' + who + ' 買衣服')
})
life.on('nani', function(who) {
  console.log('給 ' + who + ' 交工資')
})

// // 清除單個事件
// life.removeListener('touch', water)
// // 清除所有的指定事件
// life.removeAllListeners('touch')
// // 清除所有的事件
// life.removeAllListeners()

var a = life.emit('touch', '寶寶我')
var b = life.emit('nani', '老孃我')
var c = life.emit('haha', '老孃和寶寶')

// 檢視被監聽的事件數量
console.log(life.listeners('touch').length)
console.log(EventEmitter.listenerCount(life, 'touch'))
console.log(EventEmitter.listenerCount(life, 'nani'))
// 判斷事件是否被監聽
console.log(a) //true
console.log(b) //true
console.log(c) //false
複製程式碼

輸出為:

給 寶寶我 倒水
給 寶寶我 按摩
給 寶寶我 做飯
給 寶寶我 洗衣服
給 寶寶我 掃地
給 寶寶我 。。。6
給 寶寶我 .。。7
給 寶寶我 .。。8
給 寶寶我 .。。9
給 寶寶我 .。。10
我還能再做一件事哦
給 老孃我 買衣服
給 老孃我 交工資
11
11
2
true
true
false
複製程式碼

上下文

this
// var pet = {
// 	words: '...',
// 	speak: function() {
// 		console.log(this.words)
// 		console.log(this === pet)
// 	}
// }
// pet.speak()  //作為物件的方法呼叫,this指向呼叫這個函式的物件
/*-----------------------------------------------------------*/
// function pet(words) {
// 	this.words = words

// 	console.log(this.words)
// 	console.log(this === global)
// }
// pet('...')  //函式的呼叫,this指向全域性變數
/*-----------------------------------------------------------*/
function Pet(words) {
	this.words = words
	this.speak = function() {
		console.log(this.words)
		console.log(this)
	}
}
var cat = new Pet('Miao')
cat.speak()  //建構函式的呼叫,this指向例項物件(新構建好的物件)
複製程式碼

輸出為:

... true

... true

Miao Pet { words: 'Miao', speak: [Function] }

call和apply

使用call和apply可以改變上下文執行物件,可以在自定義上下文中執行函式,兩者作用相同,僅僅是方法的第二個引數不同,call直接使用引數列表,apply使用引數陣列(可以直接用JavaScript本身有的arguments陣列或者封裝成陣列[引數1,引數2,…])。具體作用是呼叫一個物件的方法,以另一個物件替換當前物件,實際上是改變this指向的物件內容。

function Pet(words) {
	this.words = words
	this.speak = function() {
		console.log(this.words)
	}
}

function Dog(words) {
	//使用call繼承,引數直接傳遞
	Pet.call(this, words)  //通過call繼承
	
	//使用apply繼承,引數作為一個陣列傳遞
	// Pet.apply(this, arguments)
}

var dog = new Dog('Wang')

dog.speak()
複製程式碼

輸出為:Wang

回撥函式

function learn(something) {
	console.log(something)
}

// 具名函式呼叫
function we(callback, something) {
	something += ' is cool'
	callback(something)
}
we(learn, 'Nodejs')


// 匿名函式呼叫
we(function(something) {
	console.log(something)
}, 'Jack')
複製程式碼

輸出為:

Nodejs is cool

Jack is cool

同步/非同步

var c = 0

function printIt() {
	console.log(c)
}

//同步
// function plus() {
// 	// 設定延時
// 	setTimeout(function() {
// 		c += 1
// 	}, 1000)
// }
// plus()
// printIt()


//非同步
function plus(callback) {
	setTimeout(function() {
		c += 1
		callback()
	}, 1000)
}
plus(printIt)
複製程式碼

同步:輸出0,1秒後結束

非同步:1秒後輸出1,結束

Promise

Promise最大的好處是在非同步執行的流程中,把執行程式碼和處理結果的程式碼清晰地分離

Promise可以序列執行若干非同步任務

Promise可以並行執行非同步任務

Buffer

Buffer 類的例項類似於整數陣列,但 Buffer 的大小是固定的、且在 V8 堆外分配實體記憶體。 Buffer 的大小在建立時確定,且無法改變。

Buffer 類是一個全域性變數,使用時無需 require('buffer').Buffer

小應用:程式碼

將圖片轉換為base64編碼及從base64編碼轉換為圖片

Stream

流(stream)是 Node.js 中處理流式資料的抽象介面。 stream 模組用於構建實現了流介面的物件。

Node.js 提供了多種流物件。 例如,HTTP 伺服器的請求process.stdout 都是流的例項。

流可以是可讀的、可寫的、或者可讀可寫的。 所有的流都是 EventEmitter 的例項。

使用方法如下:

const stream = require('stream');
複製程式碼

程式碼 參考

參考

上面的demo小例都來自慕課課程《進擊的Node.js繼承》一、二,但已下架╮(╯=╰)╭

相關文章