實在抱歉!今天(2018年12月13日10:01:41)纔看到有什麼多閱讀量,我寫這個是本身爲公司一個分享會,node從淺到深列弄的一些相關知識點,而後有童鞋現場提問的我就大概整理一下發出來而已,沒想到會有1千多的閱讀量,尷尬,抽個時間我整理一下,來個通俗易懂,條理分明的,抱歉抱歉~javascript
Node的首要目標是提供一種簡單的,用於建立高性能服務器的開發工具 Web服務器的瓶頸在於併發的用戶量,對比Java和Php的實現方式html
其實node 火爆最大的緣由是前端的火爆,前端後重視後,在的大前端的大潮中推向頂峯,由於Web主要場景就是接收客戶端的請求讀取靜態資源和渲染界面,因此Node很是適合Web應用的開發前端
Node.js是一個基於 Chrome V8 引擎的JavaScript運行環境(runtime),Node 不是一門語言 是讓js運行在後端的運行時,而且不包括javascript全集,由於在服務端中不包含DOM和BOM,Node也提供了一些新的模塊例如http,fs模塊等。Node.js 使用了事件驅動、非阻塞式 I/O 的模型,使其輕量又高效而且Node.js 的包管理器 npm,是全球最大的開源庫生態系統。java
我我的對node的事件輪詢的理解是這樣的,主線程分配任務下去,註冊回調函數。主線程裏在執行代碼的時候io繼續等待,主線程執行完畢後進行輪詢,由於這個時候主線程是空閒狀態,因此能夠一直輪詢,直到發現有某一個io操做給他發了信號告訴他我如今弄好了,你能夠用這個數據,主線程的資源就拿來執行回調函數。也就是說從始至終都只有主線程在作事情,主線程要否則是在執行函數,要否則就是在進行事件的輪詢,去尋找有哪一個事件完成了須要執行他的回調函數。node
大概就是所謂的單線程異步吧es6
固然不少童鞋可能會問,爲何js是單線程, javascript在最初設計時設計成了單線程,若是多個線程同時操做DOM那豈不會很混亂?這裏所謂的單線程指的是主線程是單線程的,因此在Node中主線程依舊是單線程的。數據庫
來一張圖關於瀏覽器的npm
本人查了一些資料,其實渲染引擎內部是多線程的,內部包含兩個最爲重要的線程ui線程和js線程。這裏要特別注意ui線程和js線程是互斥的,由於JS運行結果會影響到ui線程的結果。ui更新會被保存在隊列中等到js線程空閒時當即被執行。後端
其餘線程就是涉及事件循環(Event Loop),你們能夠自行谷歌。api
其實就是至關於咱們js數組理解就能夠了,那爲何node須要用buffer表示。 緩衝區Buffer是暫時存放輸入輸出數據的一段內存。 JS語言沒有二進制數據類型,而在處理TCP和文件流的時候,必需要處理二進制數據。 貌似es6也出了一個TypedArray,應該是差很少的。
以前寫的,如今基本忘記了~~ 流相關-機票
let http = require('http');
//req 流對象 是可讀流
//res 是一個可寫流 write
let server = http.createServer();
let url = require('url');
//當客戶端鏈接上服務器以後執行回調
server.on('connection', function () {
console.log('客戶端鏈接 ');
});
//req表明客戶端的鏈接,server服務器把客戶端的請求信息進行解析,而後放在req上面
//res表明響應,若是但願向客戶端迴應消息,須要經過 res
server.on('request', function (req, res) {
console.log(req.method);//獲取請求方法名
let { pathname, query } = url.parse(req.url, true);
console.log(pathname);
console.log(query);
console.log(req.url);//獲取請求路徑
console.log(req.headers);//請求頭對象
let result = [];
req.on('data', function (data) {
result.push(data);
});
req.on('end', function () {
let r = Buffer.concat(result);//請求體
console.log(r.toString());
//若是進行響應
res.end(r);
})
});
server.on('close', function (req, res) {
console.log('服務器關閉 ');
});
server.on('error', function (err) {
console.log('服務器錯誤 ');
});
server.listen(8089, function () {
console.log('server started at http://localhost:8089');
});
複製代碼
沒寫完,後續整理~