這篇隨筆將會按序記錄如下內容:
-
NodeJs 簡介 安裝
-
NodeJs HTTP 模塊、URL 模塊
-
CommonJs 和 Nodejs 中自定義模塊
-
NodeJs FS 模塊
-
利用 HTTP 模塊 URl 模塊 PATH 模塊 FS模塊創建一個 WEB 服務器(基礎實戰)
- 關於Node.js的非阻塞IO,異步,事件驅動基礎
cnpm淘寶鏡像: npm install -g cnpm --registry=https://registry.npm.taobao.org
1. NodeJs簡介 安裝 開發工具配置
Nodejs介紹
Node優勢
I.NodeJs 語法完全是 js 語法,只要懂 JS 基礎就可以學會 Nodejs 后端開發。
這打破了過去 JavaScript 只能在瀏覽器中運行的局面。前后端編程環境統一,可以大大降低開發成本。
II.NodeJs 超強的高並發能力。
Node.js 的首要目標是提供一種簡單的、用於創建高性能服務器及可在該服務器中運行的各種應用程序的開發工具。在 Java、PHP 或者.net 等服務器端語言中,會為每一個客戶端連接創建一個新的線程。而每個線程需要耗費大約 2MB 內存。也就是說,理論上,一個 8GB 內存的服務器可以同時連接的最大用戶數為 4000 個左右,而Node.js 不為每個客戶連接創建一個新的線程,而僅僅使用一個線程。當有用戶連接了,就觸發一個內部事件,通過非阻塞 I/O、事件驅動機制,讓 Node.js 程序宏觀上也是並行的。使用 Node.js,一個 8GB內存的服務器,可以同時處理超過 4 萬用戶的連接。
III.實現高性能服務器。
嚴格地說,Node.js 是一個用於開發各種 Web 服務器的開發工具。在 Node.js 服務器中,運行的是高性能 V8JavaScript 腳本語言,該語言是一種可以運行在服務器端的 JavaScript 腳本語言。那么,什么是 V8 JavaScript 腳本語言呢?該語言是一種被 V8 JavaScript 引擎所解析並執行的腳本語言。V8JavaScript 引擎是由 Google 公司使用 C++語言開發的一種高性能 JavaScript 引擎,該引擎並不局限於在瀏覽器中運行。Node.js 將其轉用在了服務器中,並且為其提供了許多附加的具有各種不同用途的 API。例如,在一個服務器中,經常需要處理各種二進制數據。在 JavaScript 腳本語言中,只具有非常有限的對二進制數據的處理能力,而 Node.js 所提供的 Buffer 類則提供了豐富的對二進制數據的處理能力。另外,在 V8 JavaScript 引擎內部使用一種全新的編譯技術。這意味着開發者編寫的高端的 JavaScript 腳本代碼與開發者編寫的低端的 C語言具有非常相近的執行效率,這也是 Node.js 服務器可以提供的一個重要特性。
Node環境的搭建
2. NodeJs HTTP 模塊、URL 模塊
I. Node.js 創建第一個應用
var http = require("http");
var http = require('http'); http.createServer(function (request, response) { // 發送 HTTP 頭部 // HTTP 狀態值: 200 : OK //設置 HTTP 頭部,狀態碼是 200,文件類型是 html,字符集是 utf8 response.writeHead(200,{"Content-Type":"text/html;charset=UTF-8"}); // 發送響應數據 "Hello World" res.end("這是第一個node應用"); }).listen(3000);
node xxx.js
II. HTTP 模塊、URL 模塊
//引用模塊 var http = require("http"); //創建一個服務器,回調函數表示接收到請求之后做的事情 var server = http.createServer(function(req,res){ //req 參數表示請求,res 表示響應 console.log("服務器接收到了請求" + req.url); res.end(); // End 方法使 Web 服務器停止處理腳本並返回當前結果 }); //監聽端口 server.listen(3000);
設置一個響應頭
//引用模塊 var http = require("http"); //創建一個服務器,回調函數表示接收到請求之后做的事情 var server = http.createServer(function(req,res){ //req 參數表示請求,res 表示響應 res.writeHead(200,{"Content-Type":"text/html;charset=UTF8"});//插入響應頭 console.log("服務器接收到了請求" + req.url); res.end(); // End 方法使 Web 服務器停止處理腳本並返回當前結果 }); //監聽端口 server.listen(3000);
2.URL 模塊的使用
url.parse() //解析 URL url.format(urlObject) //是上面 url.parse() 操作的逆向操作 url.resolve(from, to) //添加或者替換地址
3. CommonJs 和 Nodejs 中自定義模塊
什么是Common.js
Nodejs 中的模塊化
// 定義一個 tools.js 的模塊 //模塊定義 var tools = { sayHello: function() { return 'hello NodeJS'; }, add: function(x, y) { return x + y; } }; // 模塊接口的暴露 // module.exports = tools; exports.sayHello = tools.sayHello; exports.add = tools.add;
var http = require('http'); // 引入自定義的 tools.js 模塊 var tools= require('./tools'); tools.sayHello(); //使用模塊
npm init 生成 package.json
npm init
package.json內保存了應用信息,比如版本,依賴,環境等。
4. NodeJs FS 模塊
!使用前先引入fs模塊
const fs = require('fs')
fs.stat('hello.js', (error, stats) =>{ if(error){ console.log(error) } else { console.log(stats) console.log(`文件:${stats.isFile()}`) console.log(`目錄:${stats.isDirectory()}`) } })
const fs = require('fs') fs.mkdir('logs', (error) => { if(error){ console.log(error) } else { console.log('成功創建目錄:logs') } })
fs.writeFile('logs/hello.log', '您好 ~ \n', (error) => { if(error) { console.log(error) } else { console.log('成功寫入文件') } })
fs.appendFile('logs/hello.log', 'hello ~ \n', (error) => { if(error) { console.log(error) } else { console.log('成功寫入文件') } })
const fs = require('fs') fs.readFile('logs/hello.log', 'utf8', (error, data) =>{ if (error) { console.log(error) } else { console.log(data) } })
const fs = require('fs') fs.readdir('logs', (error, files) => { if (error) { console.log(error) } else { console.log(files) } })
const fs = require('fs') fs.rename('js/hello.log', 'js/greeting.log', (error) =>{ if (error) { console.log(error) } else { console.log('重命名成功') } })
fs.rmdir('logs', (error) =>{ if (error) { console.log(error) } else { console.log('成功的刪除了目錄:logs') } })
fs.unlink(`logs/${file}`, (error) => { if (error) { console.log(error) } else { console.log(`成功的刪除了文件: ${file}`) } })
const fs = require('fs') var fileReadStream = fs.createReadStream('data.json') let count=0; var str=''; fileReadStream.on('data', (chunk) => { console.log(`${ ++count } 接收到:${chunk.length}`); str+=chunk }) fileReadStream.on('end', () => { console.log('--- 結束 ---'); console.log(count); console.log(str); }) fileReadStream.on('error', (error) => { console.log(error) })
var fs = require("fs"); var data = '我是從數據庫獲取的數據,我要保存起來'; // 創建一個可以寫入的流,寫入到文件 output.txt 中 var writerStream = fs.createWriteStream('output.txt'); // 使用 utf8 編碼寫入數據 writerStream.write(data,'UTF8'); // 標記文件末尾 writerStream.end(); // 處理流事件 --> finish 事件 writerStream.on('finish', function() { /*finish - 所有數據已被寫入到底層系統時觸發。*/ console.log("寫入完成。"); }); writerStream.on('error', function(err){ console.log(err.stack); }); console.log("程序執行完畢");
var fs = require("fs"); // 創建一個可讀流 var readerStream = fs.createReadStream('input.txt'); // 創建一個可寫流 var writerStream = fs.createWriteStream('output.txt'); // 管道讀寫操作 // 讀取 input.txt 文件內容,並將內容寫入到 output.txt 文件中 readerStream.pipe(writerStream); console.log("程序執行完畢");
5. Node.js 搭建靜態WEB服務器
待更新
6. 關於Node.js的非阻塞IO,異步,事件驅動基礎
Nodejs 的單線程 非阻塞 I/O 事件驅動:
Nodejs 回調處理異步:
//正確的處理異步: function getData(callback){ //模擬請求數據 var result=''; setTimeout(function(){ result='這是請求到的數據'; callback(result); },200); } getData(function(data){ console.log(data); })
Nodejs events 模塊處理異步:
// 引入 events 模塊 var events = require('events'); var EventEmitter=new events.EventEmitter(); /*實例化事件對象*/ EventEmitter.on('toparent',function(){ console.log('接收到了廣播事件'); }) setTimeout(function(){ console.log('廣播'); EventEmitter.emit('toparent'); /*發送廣播*/ },1000)
本文轉載自:https://www.cnblogs.com/zlforever-young/p/11558943.html