nodejs的理解

nodejs的由來?javascript

Node.js是一個Javascript運行環境(runtime environment),發佈於2009年5月,由Ryan Dahl開發,實質是對Chrome V8引擎進行了封裝。css

 

優勢html

藉助JavaScript天生的事件驅動機制加V8高性能引擎,使編寫高性能Web服務垂手可得前端

 

請先下載源文件,一邊操做一遍執行。地址:https://github.com/yb81312043/node-summaryjava

 

事件驅動機制(單線程多進程)node

node 事件驅動.jsmysql

看輸出不是1,2,3。緣由是代碼通過2的時候把事件丟進事件隊列中,等待1s後回調輸出2,並不影響3的執行輸出。git

其餘的架構是多線程模型,也就是爲每一個業務邏輯提供一個系統線程,經過系統線程切換來彌補同步式 I/O 調用時的時間開銷。es6

Node.js 使用的是單線程模型,對於全部 I/O 都採用異步式的請求方式,避免了頻繁的上下文切換。Node.js 在執行的過程當中會維護一個事件隊列,程序在執行時進入事件循環等待下一個事件到來,每一個異步式 I/O 請求完成後會被推送到事件隊列,等待程序進程進行處理。github

 

學習

若是有模塊找不到,可使用npm install 模塊名 安裝

使用node啓動js文件

node 1.js

執行了一下js,輸出

 

認識一下基本的模塊

http

node http.js

http.createServer啓動一個服務。req是request請求體,res是response響應體。

node http1.js 

new http.Server()也能夠建立一個服務,request表示服務端收到請求,connection表明創建了鏈接,close表明關閉服務

node http2.js

服務端發送了一個請求,能夠看到返回頁面信息,能夠利用在數據抓取上

node httpRouter.js

實現簡單得路由

還有不少事件:

http.IncomingMessage http請求信息

http.ServerResponse  客戶端響應得信息

http.get 是http.request得簡化版

...

http模塊是C++語言開發得node基礎模塊,效率很是高,構建也很是簡單

 

url

node url.js

對應三個方法:

url.parse解析url

urk.formatzu組裝url

url.resolve拼合url

utl模塊其實就是封裝了一些簡化url操做得方法

 

querystring

node  querystring.js

對應四個方法:

querystring.parse  解析請求參數

querystring.stringify  格式化成字符串

querystring.escape  對請求字符串進行編碼

querystring.unescape  對編碼字符串進行解碼

querystring模塊是封裝了一些簡化參數解析得方法

 

mysql

node mysql.js

簡單得鏈接數據庫,sql操做數據

 

crypto

node  crypto.js

在這個數據增加驚人得互聯網時代,網絡安全問題層出不窮。crypto是node核心模塊之一,提供安全相關的功能。

 

path

node path.js

path模塊用於處理文件與目錄的路徑,還有不少方法我沒有寫,用到路徑方面的本身去查api

 

fs

node fs,js

訪問:http://127.0.0.1:8080/http.jshttp://127.0.0.1:8080/1.js訪問相對應的文件

node fsReadFile.js

使用fs.readFile讀取文件,能夠看到讀出的數據事buffer格式.

node fsWriteFile.js

使用fs.fsWriteFile寫入文件

node fsPipe.js

使用pipe()一邊接入輸入流,一邊接入輸出流,實現管道傳輸。

fs還有不少對應的方法:

fs.open 打卡文件
fs.mkdir 建立目錄
fs.readdir 讀取目錄
fs.exists 查看文件是否存在

...

使用fs模塊操做文件系統的api

 

zlib

node zlib.js 

開啓gzip壓縮,網站反應速遞提高不少。

 

events

node events.js

on() 監聽,emit()觸發,跟jq的綁定事件差很少

node eventsOne.js

once綁定一次監聽事件

還有更多的事件操做方法:

emitter.addListener emitter.on別名

emitter.eventNames 返回監聽的事件名數組

emitter.getMaxListeners  當前監聽器最大限制數值

...

events模塊管理全部的異步 I/O 操做的事件隊列

 

緩衝區

buffer

node buffer.js

JavaScript 語言自身只有字符串數據類型,沒有二進制數據類型。Buffer 類,該類用來建立一個專門存放二進制數據的緩存區。一個 Buffer 相似於一個整數數組,但它對應於 V8 堆內存以外的一塊原始內存。

Buffer對象佔用的內存空間是不計算在Node.js進程內存空間限制上的,所以,咱們也經常會使用Buffer來存儲須要佔用大量內存的數據:

 

koa的核心代碼

promise

在JavaScript的世界中,全部代碼都是單線程執行的。因爲這個「缺陷」,致使JavaScript的全部網絡操做,瀏覽器事件,都必須是異步執行。異步執行能夠用回調函數實現:

node callBack.js 

pomise是es6中統一規範,須要瀏覽器直接支持

node pomise1.js

resolve表示成功觸發then回調函數,reject表示失敗觸發catch回調函數

node pomise2.js

串行的pomise方式解決了異步回調嵌套的問題

node pomiseAll.js

all簡化了連續.then,最後得到的results是resolve返回值的集合

pomise簡化了異步回調多層嵌套的問題,使代碼變得很清晰

 

generator

node generator.js

generator是es6的新特性,經過yield關鍵字,可讓函數的執行流掛起

next方法會執行函數體,直到遇到第一個yield語句,而後掛起函數執行,等待後續調用。可是next會返回一個對象,這個對象有2個key,value表示yield語句後面的表達式的值,done是個布爾值,表示函數體是否已經執行結束。再次調用g。next時,執行流在掛起的地方繼續執行,直到遇到第2個yield,依次類推。

 

promise+generator

node koa原理.js

如今asysc替換generator函數得*,await替換了yield

 

中間件

中間件得做用是在請求處理以前一層過濾,集中處理很是得方便

cookie-parser

node cookieParser.js

cookie-parser模塊是對cookie得解析

 

咱們本身寫個中間件

node customConnect.js

在響應頭中統一添加header

 

經常使用得中間件

body-parser  POSTPUTPATCH三種請求方法中包含請求體,body-parser是一個HTTP請求體解析中間件

static  靜態文件服務器 

limit  幫助過濾巨型請求 

query  GET請求解析

logger  日誌中間件,能夠定製日誌

favicon  網站小圖標

...

 

node環境中得變量有哪些?

node global.js

node環境中有個global對象,相似與瀏覽器環境下得windows對象。像env一些默認得

剩下得全局變量方法:http://www.javashuo.com/article/p-qsmdamsk-be.html

 

框架推薦

thinkjs3.0

優勢:thinkjs致力於集成項目最佳實踐,規範項目讓企業級團隊開發變得更加簡單,更加高效。底層基於 koa 2.x 實現,兼容 koa 的全部功能。該框架借鑑了不少 ThinkPHP 的特性,同時結合Node.js的特性,使用了 ES6 Promise,讓異步編程更加簡單、方便。

thinkjs官網:https://thinkjs.org/ 

快速安裝:https://thinkjs.org/zh-cn/doc/3.0/create_project.html

瞭解一下cli生成得項目結構:

src>>config>>adapter.js 這個文件是整個項目得配置文件

 

寫一個簡單得接口試試

src>>config>>controller是整個項目得控制器文件

項目重啓一下,chrome訪問一下

這就是一個簡單得接口啦

 

模板語言ejs

配置一下ejs:https://thinkjs.org/zh-cn/doc/3.0/adapter.html

使用assign像頁面輸出模板變量,使用display返回html頁面

建立頁面文件,使用ejs輸出返回變量

訪問頁面:

跟其餘模板語言大同小異,學習一下:http://www.javashuo.com/article/p-caxqkcwz-q.html

 

鏈接數據庫

在adapter.js裏面配置mysql:https://thinkjs.org/zh-cn/doc/3.0/relation_model.html

鏈接上數據庫後寫一個簡單得接口

訪問一下

能夠看到,要是異步事件同步操做得話須要async/await配合使用

 

總結:

nodejs優勢:高併發(最大優勢),適合I/O密集型應用。

nodejs缺點:可靠性低,一旦代碼某個環節崩潰,整個系統都崩潰

    緣由:單進程,單線程

    解決方案:(1)Nnigx反向代理,負載均衡,開多個進程,綁定多個端口;

           只支持單核CPU,不能充分利用CPU,不適合CPU密集型應用

nodejs跟其餘後臺語言,也就是說其餘語言能作的事情nodejs也能幹,只是幹得效率得問題,是否是適當得問題而已。

nodejs對前端來講是友好得,語言就是js,因此學習起來比較容易,入門也至關得快。

如今nodejs是前端得基石,可能在人們生活中得使用仍是比較少,可是瞭解服務端對前端得發展也很是有意義。

 

學習參考

nodejs中文網:http://nodejs.cn/

nodejs中文社區:https://cnodejs.org/

npm淘寶鏡像:https://npm.taobao.org/

thinkjs框架官網:https://thinkjs.org/

express框架官網:http://www.expressjs.com.cn/

koa框架官網:https://koa.bootcss.com/#

egg框架官網:https://eggjs.org/zh-cn/

相關文章
相關標籤/搜索