Node.js
入門
NODE安裝
http://www.runoob.com/nodejs/nodejs-install-setup.html
建立應用
Node.js使用 require 指令來載入模組。(這個檔案可能是JavaScript 程式碼、JSON 或者編譯過的C/C++ 擴充套件)
伺服器需要載入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可以處理大量併發,效能還是可以的。
路由
我們需要檢視 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
特性
相關文章
- Node.js 指南(關於Node.js)Node.js
- 安裝 Node.js安裝 Node.jsNode.js
- 【Node.js】Node.js
- Node.js教程第三篇—— Node.js 流Node.js
- Node.js 系列:構建原生 Node.js 應用Node.js
- 初識Node.js【01】Node.js是什麼?Node.js
- Learning Node.jsNode.js
- node.js一Node.js
- Node.js三Node.js
- [野路子學 Node.js] Node.js,NPM,cnpm 為何物Node.jsNPM
- Node.js多程式Node.js
- Node.js Stream(流)Node.js
- Node.js之BufferNode.js
- 自學Node.JsNode.js
- Node.js快取Node.js快取
- Node.js Stream(流)Node.js
- Node.js 函式Node.js函式
- 12、Node.js 路由Node.js路由
- Node.js函式Node.js函式
- node.js相比JavaScriptNode.jsJavaScript
- node.js筆記Node.js筆記
- Node.js Express 框架Node.jsExpress框架
- Node.js包管理Node.js
- Node.js Streams(流)Node.js
- Node.js安裝Node.js
- Node.js 安全指南Node.js
- 《Node.js設計模式》歡迎來到Node.js平臺Node.js設計模式
- 什麼是Node.jsNode.js
- node.js – 收藏集 – 掘金Node.js
- Node.js中的BufferNode.js
- Node.js的程式管理Node.js
- Node.js 葵花寶典Node.js
- Node.js 9.0.0 釋出Node.js
- 【核心模組】node.jsNode.js
- 【入門指南】node.jsNode.js
- node.js應用RedisNode.jsRedis
- Node.js EventEmitter解讀Node.jsMIT
- Node.js Buffer解讀Node.js