Node.js簡介
• Node.js是一個能夠在服務器端運行JavaScript的開放源代碼、 跨平臺JavaScript運行環境。
• Node採用Google開發的V8引擎運行js代碼,使用事件驅動、 非阻塞和異步I/O模型等技術來提高性能,可優化應用程序的傳輸量和規模。
• Node大部分基本模塊都用JavaScript編寫。在Node出現之前, JS通常作爲客戶端程序設計語言使用,以JS寫出的程序常在用戶的瀏覽器上運行。
• Node主要用於編寫像Web服務器一樣的網絡應用,這和PHP 和Python是類似的。
• 但是Node與其他語言最大的不同之處在於,PHP等語言是阻 塞的而Node是非阻塞的。
• Node是事件驅動的。開發者可以在不使用線程的情況下開發 出一個能夠承載高併發的服務器。其他服務器端語言難以開發 高併發應用,而且即使開發出來,性能也不盡人意。
• Node正是在這個前提下被創造出來。
• Node把JS的易學易用和Unix網絡編程的強大結合到了一起。
• Node.js允許通過JS和一系列模塊來編寫服務器端應用和網絡 相關的應用。
• 核心模塊包括文件系統I/O、網絡(HTTP、TCP、UDP、DNS、 TLS/SSL等)、二進制數據流、加密算法、數據流等等。Node 模塊的API形式簡單,降低了編程的複雜度。
• 使用框架可以加速開發。常用的框架有Express.js、Socket.IO 和Connect等。Node.js的程序可以在Microsoft Windows、 Linux、Unix、Mac OS X等服務器上運行。
• Node.js也可以使用CoffeeScript、TypeScript、Dart語言,以 及其他能夠編譯成JavaScript的語言編程。
模塊引用
• 在規範中,定義了require()方法,這個方 法接手模塊標識,以此將一個模塊引入到 當前運行環境中。
• 模塊引用的示例代碼: – var math = require('math');
模塊定義
• 在運行環境中,提供了exports對象用於導 出當前模塊的方法或者變量,並且它是唯 一的導出的出口。
• 在模塊中還存在一個module對象,它代表 模塊自身,而exports是module的屬性。
• 在Node中一個文件就是一個模塊。
exports.xxx = function() {};
module.exports = {};
模塊標識
• 模塊標識其實就是模塊的名字,也就是傳 遞給require()方法的參數,它必須是符合 駝峯命名法的字符串,或者是以.、..開頭的 相對路徑、或者絕對路徑。
• 模塊的定義十分簡單,接口也十分簡潔。 每個模塊具有獨立的空間,它們互不干擾, 在引用時也顯得乾淨利落。
Node的模塊實現
• Node中雖然使用的是CommonJS規範,但是 其自身也對規範做了一些取捨。
• 在Node中引入模塊,需要經歷如下3個步驟: – 路徑分析 – 文件定位 – 編譯執行
• 在Node中,模塊分爲三類:一類是底層由 C++編寫的內建模塊,一類是Node提供的核 心模塊;還有一類是用戶編寫的模塊,稱爲文 件模塊。
包 package
• CommonJS的包規範允許我們將一組相關 的模塊組合到一起,形成一組完整的工具。
• CommonJS的包規範由包結構和包描述文 件兩個部分組成。
• 包結構 – 用於組織包中的各種文件
• 包描述文件 – 描述包的相關信息,以供外部讀取分析
包結構
• 包實際上就是一個壓縮文件,解壓以後還 原爲目錄。符合規範的目錄,應該包含如 下文件:
– package.json 描述文件
– bin 可執行二進制文件
– lib js代碼
– doc 文檔
– test 單元測試
包描述文件
• 包描述文件用於表達非代碼相關的信息, 它是一個JSON格式的文件 – package.json, 位於包的根目錄下,是包的重要組成部分。
• package.json中的字段
– name、description、version、keywords、 maintainers、contributors、bugs、 licenses、repositories、dependencies、 homepage、os、cpu、engine、builtin、 directories、implements、scripts、author、 bin、main、devDependencies。
NPM(Node Package Manager)
• CommonJS包規範是理論,NPM是其中一 種實踐。
• 對於Node而言,NPM幫助其完成了第三 方模塊的發佈、安裝和依賴等。藉助NPM, Node與第三方模塊之間形成了很好的一個 生態系統。
NPM命令
• npm –v
– 查看版本
• npm
– 幫助說明
• npm search 包名
– 搜索模塊包
• npm install 包名
– 在當前目錄安裝包
• npm install 包名 –g
– 全局模式安裝包
• npm remove 包名
– 刪除一個模塊
• npm install 文件路徑
– 從本地安裝
• npm install 包名 –registry=地址
– 從鏡像源安裝
• npm config set registry 地址
– 設置鏡像源
Buffer(緩衝區)
• 從結構上看Buffer非常像一個數組,它的元 素爲16進制的兩位數。
• 實際上一個元素就表示內存中的一個字節。
• 實際上Buffer中的內存不是通過JavaScript 分配的,而是在底層通過C++申請的。
• 也就是我們可以直接通過Buffer來創建內存中的空間。
Buffer的操作
• 使用Buffer保存字符串
let str = "你好 nodejs";
let buf = Buffer.from(str , "utf-8");
• 創建指定大小的Buffer對象
let buf3 = Buffer.alloc(1024*8)
Buffer的轉換
• Buffer與字符串間的轉換
– 支持的編碼:
• ASCII、UTF-8、UTF-16LE/UCS-2、Base64、 Binary、Hex
– 字符串轉Buffer
• Buffer.from(str , [encoding]);
– Buffer轉字符串
• buf.toString([encoding] , [start] , [end]);
寫入操作
• 向緩衝區中寫入字符串
– buf.write(string[, offset[, length]][, encoding])
• 替換指定索引位置的數據
– buf[index]
• 將指定值填入到緩衝區的指定位置
– buf.fill(value[, offset[, end]][, encoding])
讀取操作
• 將緩衝區中的內容,轉換爲一個字符串返回
– buf.toString([encoding[, start[, end]]])
• 讀取緩衝區指定索引的內容
– buf[index]
其他操作
• 複製緩衝區
– buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]])
• 對緩衝區切片
– buf.slice([start[, end]])
• 拼接緩衝區
– Buffer.concat(list[, totalLength])
fs(文件系統)
• 在Node中,與文件系統的交互是非常重要 的,服務器的本質就將本地的文件發送給 遠程的客戶端
• Node通過fs模塊來和文件系統進行交互
• 該模塊提供了一些標準文件訪問API來打開、 讀取、寫入文件,以及與其交互。
• 要使用fs模塊,首先需要對其進行加載 – const fs = require("fs");
同步和異步調用
• fs模塊中所有的操作都有兩種形式可供選擇 同步和異步。
• 同步文件系統會阻塞程序的執行,也就是 除非操作完畢,否則不會向下執行代碼。
• 異步文件系統不會阻塞程序的執行,而是 在操作完成時,通過回調函數將結果返回。