(一)初識NodeJs
說明:該學習筆記參考《深入淺出Node.js》在學習過程中,新增了自己的理解和適當的補充!僅供參考!
NodeJs的出現,讓JavaScript工程師實現了獨自完成全棧的夢想。NodeJs作為後端JavaScript的執行平臺,保留了前端瀏覽器中那些熟悉的介面,沒有改寫語言本身的任何特性,依然基於作用鏈和原型鏈。
NodeJs有以下幾個特點:
非同步I/O
非同步I/O的最常見實現場景就是發起Ajax呼叫。這裡演示的是一個Ajax請求:
$.post("/url", {"title": "這是引數"}, function(data){
console.log("收到響應");
});
console.log("傳送Ajax結束");
這裡,我們會注意到,輸出“傳送Ajax結束”並不一定是在輸出“收到響應”之後,因為“收到響應”的執行時間是不被預期的。這裡是比較重要的非同步的原則:‘Don`t call me, I will call you’,注重結果,不關心過程。
在NodeJs中,絕大多數的操作都是以非同步的方式進行呼叫。在NodeJs中,我們可以從語言層面很自然的進行並行I/O操作,每個呼叫之間無需等待其他呼叫結束,在程式設計模型上可以極大的提升效率。
這裡是兩個檔案讀取任務的耗時取決於最慢的那個檔案讀取的耗時:
var fs = require("fs");
fs.readFile("/path1", function(err, file){
console.log("讀取檔案1完成");
});
fs.readFile("/path2", function(err, file){
console.log("讀取檔案2完成");
});
事件與回撥函式
NodeJs是將前端瀏覽器中廣泛且成熟的事件引入後端,配合非同步I/O,將事件點暴露給業務邏輯。
var http = require("http");
var querystring = require("querystring");
// 偵聽服務其的request事件
http.createServer(function(req, res){
var postData = '';
req.setEncoding('utf8');
// 偵聽請求的data事件
req.on('data', function(chunk){
postData += chunk;
});
// 偵聽請求的end事件
req.on('end', function(){
res.end(postData);
});
}).listen(8080);
console.log('server start at port:8080')
在web伺服器繫結request事件,對於請求物件,為其繫結data事件和end事件。相應的在前端Ajax請求中繫結success事件,在發出請求後,只需關心請求成功時執行相應的業務邏輯即可。
$.ajax({
'url': '127.0.0.1:8080',
'method': 'POST',
'data': {},
'success': function(data){
console.log(data);
}
})
以上程式碼只是演示,此處的ajax並不能執行。在此只是說明“事件”。
事件的程式設計方式具有輕量級、鬆耦合、只關注事務點等優勢。但是也會造成在多個非同步任務的場景下,事件和事件之間各自獨立,如何協作是一個重要的問題。
回撥函式無處不在。在JavaScript中,是將函式作為第一等公民來對待的,可以將函式作為物件傳遞給方法作為引數進行呼叫(這裡說的是不是閉包?可以去深揪一下!)
回撥函式是最好的接受非同步呼叫、返回資料的方式,但是這種程式設計方式對於同步思路程式設計的人來說,是一大挑戰。程式碼的編寫順序與執行順序並無關係,在流程控制方面,由於穿插了非同步和回撥使得變得不是那麼一目瞭然。但是對於業務的劃分和對事件的提煉上覆雜度與同步方式是一致的。
單執行緒
NodeJs保持了JavaScript在瀏覽器中的單執行緒的特點。而且在NodeJs中,JavaScript與其他執行緒是無法共享任何狀態的。
單執行緒的最大好處就是:不用向多執行緒那樣處處在意狀態的同步問題,沒有死鎖的的存在,也沒有執行緒上下文交換(這點需要深入解釋下)所帶來的效能上的開銷。
當然單執行緒也是有很大的弱點,但是必須要積極面對才能享受到node帶來的好處。主要有以下三大方面:
- 無法利用多核CPU。
- 錯誤會引起整個應用的退出,應用的健壯性值得考驗。
- 大量計算佔用CPU導致無法繼續呼叫非同步I/O。
在瀏覽器中JavaScript與UI共用一個執行緒,JavaSript長時間執行會導致UI的渲染和相應被終端(這裡思考瀏覽器載入資源的方式是並行還是序列,如何提高這方面的效能!)
第三個弱點,有相應的解決方案,這裡暫時先不提!
跨平臺
相容於Windows和Linux平臺。
應用場景
I/O密集型
NodeJs擅長I/O密集型的應用場景,面向網路且擅長並行I/O,能夠有效的組織更多的硬體資源,
I/O密集的優勢主要在於NodeJs利用事件迴圈的處理能力,而不是啟動每一個執行緒為每一個請求服務,資源佔用極少。
分散式應用
與遺留系統和平相處
是否不擅長CPU密集型業務
這裡簡單的認識NodeJs,瞭解了其特性和應用場景,接下來,需要深入了,加油哦!
相關文章
- Nodejs初識NodeJS
- 初識 NodejsNodeJS
- Lesson-12 初識Nodejs (4)NodeJS
- 前端筆記之NodeJS(一)初識NodeJS&內建模組&特點前端筆記NodeJS
- 初入nodejsNodeJS
- 初識 webpack (一)Web
- RocketMq(一)初識MQ
- 初識Django(一)Django
- 一.初識JavaJava
- mysql初識(一)MySql
- CQRS框架(nodejs的DDD開發落地框架)初識感想框架NodeJS
- 初識NodeJS-使用Express框架路由和中介軟體NodeJSExpress框架路由
- Docker初認識(一)Docker
- kafka初認識(一)Kafka
- 初識vue系列一Vue
- 初識 HTTP/2(一)HTTP
- Oracle VM初識(一)Oracle
- 一、初識NettyNetty
- HikariPool原始碼(一)初識原始碼
- RxJava學習一:初識RxJava
- 初識oracle block系列(一)OracleBloC
- 必會webpack(一)--- 初識webpackWeb
- 初識神經網路----一神經網路
- Redis學習(一)——初識RedisRedis
- Angular 4 系列(一)初識 AngularAngular
- JMS學習(一):初識JMS
- 初識cuda一文通
- Maven知識記錄(一)初識Maven私服Maven
- 這有一篇Nodejs+Express的初級指南……NodeJSExpress
- 深入淺出 Runtime(一):初識
- 初識分散式:MIT 6.284系列(一)分散式MIT
- JVM效能優化 (一) 初識JVMJVM優化
- 初識Netty原理(一)—— 基本使用Netty
- Android-Window(一)——初識WindowAndroid
- Weex開發系列(一):初識Weex
- 初識MybatisMyBatis
- 初識 DockerDocker
- rocketmq初識MQ