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.js,http://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來存儲須要佔用大量內存的數據:
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 POST
、PUT
和PATCH
三種請求方法中包含請求體,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/