Node.js

Chiaki17發表於2024-11-05

入門

NODE安裝

http://www.runoob.com/nodejs/nodejs-install-setup.html

建立應用

Node.js使用 require 指令來載入模組。(這個檔案可能是JavaScript 程式碼、JSON 或者編譯過的C/C++ 擴充套件)

13760813-9c51377fcff43211.png
image.png

伺服器需要載入http模組。
建立監聽客戶端請求的伺服器。
接受埠請求並響應。

var http = require('http');
http.createServer(function (request, response) {
    // 傳送 HTTP 頭部 
    // HTTP 狀態值: 200 : OK
    // 內容型別: text/plain
    response.writeHead(200, {'Content-Type': 'text/plain'});
    // 傳送響應資料 "Hello World"
    response.end('Hello World\n');
}).listen(8888);
// 終端列印如下資訊
console.log('Server running at http://127.0.0.1:8888/');

應用管理

npm

npm是javascript的包管理工具,主要作用是模組管理,類似java的maven。

#建議授權使用,防止許可權問題
sudo chown -R 你的賬號名 npm所在目錄的路徑 /{lib/node_modules,bin,share}

package.json

需要注意,與npm工具相關聯的是專案路徑下的package.json。
從github上clone的node.js專案,需要通過npm install安裝必要的依賴才能啟動,依賴的內容就是你的package.json中的dependencies和devDepencies。因此,開發時需要將依賴包的名稱和版本寫入package.json。

npm install 模組:安裝好後不寫入package.json中
npm install 模組 --save 安裝好後寫入package.json的dependencies中(生產環境依賴)
npm install 模組 --save-dev 安裝好後寫入package.json的devDepencies中(開發環境依賴)

package.json主要屬性
name - 包名。
version - 包的版本號。
scripts - 啟動命令指令碼。

非同步回撥與事件迴圈

在node中非同步程式設計的直接體現就是回撥。

#err為錯誤資訊,data為結果。
function (err, data) {
    if (err) return console.error(err);
    console.log(data.toString());
}

基於JavaScript的Node也是單執行緒的,但node使用的v8引擎提供了非同步執行回撥介面,所以使用事件驅動模型(實現類是EventEmitter,支援事件響應的核心模組都是EventEmitter的子類)的node可以處理大量併發,效能還是可以的。

13760813-efda1adbde9c668c.png
image.png

路由

我們需要檢視 HTTP 請求,為路由提供請求的 URL 和其他需要的 GET 及 POST 引數,隨後路由需要根據這些資料來執行相應的程式碼。

##get
var http = require('http');
var url = require('url');
var util = require('util');
http.createServer(function(req, res){
    res.writeHead(200, {'Content-Type': 'text/plain'});
    // 解析 url 引數
    var pathname = url.parse(request.url).pathname;
    route(pathname);
    var params = url.parse(req.url, true).query;
    res.write("網站名:" + params.name);
    res.write("\n");
    res.write("網站 URL:" + params.url);
    res.end();
}).listen(3000);
##post
var http = require('http');
var querystring = require('querystring');
var postHTML = 
  '<html><head><meta charset="utf-8"><title>菜鳥教程 Node.js 例項</title></head>' +
  '<body>' +
  '<form method="post">' +
  '網站名: <input name="name"><br>' +
  '網站 URL: <input name="url"><br>' +
  '<input type="submit">' +
  '</form>' +
  '</body></html>';
http.createServer(function (req, res) {
  var body = "";
  req.on('data', function (chunk) {
    body += chunk;
  });
  req.on('end', function () {
    // 解析引數
    body = querystring.parse(body);
    var pathname = url.parse(request.url).pathname;
    route(pathname);
    // 設定響應頭部資訊及編碼
    res.writeHead(200, {'Content-Type': 'text/html; charset=utf8'});
    if(body.name && body.url) { // 輸出提交的資料
        res.write("網站名:" + body.name);
        res.write("<br>");
        res.write("網站 URL:" + body.url);
    } else {  // 輸出表單
        res.write(postHTML);
    }
    res.end();
  });
}).listen(3000);
##route
function route(pathname) {
  console.log("About to route a request for " + pathname);
}
exports.route = route;

常用模組

var http = require("http");
var url = require("url");
var util = require('util'); //常用函式工具模組
var fs = require("fs"); //檔案模組
var mysql = require('mysql');//mysql
var MongoClient = require('mongodb').MongoClient;//mongodb
var redis = require('redis');//redis
var xlsx = require('node-xlsx');//xlsx模組,類似java的poi

多執行緒

Node.js 是以單執行緒的模式執行的,但它使用事件驅動來處理併發,有助於我們在多核 cpu 的系統上建立多個子程式,從而提高效能。

#child_process.exec 使用子程式執行命令,快取子程式的輸出,並將子程式的輸出以回撥函式引數的形式返回。
child_process.exec(command[, options], callback) 

#child_process.spawn 使用指定的命令列引數建立新程式。
child_process.spawn(command[, args][, options])

# child_process.fork 是 spawn()的特殊形式,用於在子程式中執行的模組,如 fork('./son.js') 相當於 spawn('node', ['./son.js']) 。
# 與spawn方法不同的是,fork會在父程式與子程式之間,建立一個通訊管道,用於程式之間的通訊。
child_process.fork(modulePath[, args][, options]) 

記憶體控制

node使用的v8引擎作者曾經參與hotspot的開發,因此,node也基於垃圾回收機制進行記憶體的自動管理。
在V8下,64位系統可以操縱1.4GB記憶體,32位系統可以操縱0.7GB記憶體。
當然,這個限制也可以通過v8提供的選項取出。我們可以通過在node啟動時增加引數,來去掉限制.

node --max-old-space-size=1700 test.js // 單位為MB
node --max-new-space-size=1024 test.js // 單位為KB

慎將記憶體當做快取

v8記憶體是通過垃圾回收進行處理的,沒有過期策略,而真正的快取是存在過期策略的,而且程式間是無法共享記憶體的,因此,使用記憶體作為快取不是一個好的解決方案。最好的解決方案是使用外部快取,例如redis等。這些快取可以將快取的壓力從記憶體轉移到程式的外部,減少常駐記憶體的物件數量,讓垃圾回收更有效率,同時,還可以實現程式間共享快取,節約寶貴的資源。

框架

Express

http://www.runoob.com/nodejs/nodejs-express-framework.html

Egg

特性

相關文章