node基礎入門筆記
阿新 • • 發佈:2021-06-27
node基礎
1. 命令列視窗、CMD視窗、終端、shell
- windows ——> cmd ——> 回車
- 常用指令:
- dir : 列出當前目錄下的所有檔案
- cd 目錄名 : 進入到指定目錄
- md 目錄名 : 建立一個資料夾
- rd 目錄名 : 刪除一個資料夾
- 檔名 : 開啟此檔案
- e: : 進入e盤
- d: : 進入e盤
- cls : 清屏
- 目錄
- . : 表示當前目錄
- .. : 表示上一級目錄
- 環境變數(windows系統中變數,開啟方式 : 設定 ——> 系統 ——> 關於——> 高階系統設定)
Path(使用者變數)
C:\Users\LENONO.dnx\bin
C:\Users\LENONO\AppData\Local\Programs\Python\Python36\Scripts
C:\Users\LENONO\AppData\Local\Programs\Python\Python36\- 當我們在命令列視窗開啟一個檔案,或呼叫一個程式時,系統會首先在當前目錄下尋找檔案程式,如果找到了則直接開啟。如果沒有找到則會依次到環境變數path的路徑中尋找,直到找到為止。如果還是沒找到則報錯,類似於作用域鏈。
- 所以我們可以將一些經常需要訪問的程式和檔案的路徑新增Path中,這樣我們就可以在任意位置來訪問這些檔案和程式了。
- 注意,配置完需重啟命令列視窗方可生效。
2. node簡介
- I/O (Input/Output)指的是對磁碟的讀寫操作。
- Node可以在後臺來編寫伺服器。
- Node.js是一個能夠在伺服器端執行JavaScript的執行環境。
- Node可以在後臺來編寫伺服器,傳統的伺服器都是多執行緒的,Node的伺服器單執行緒的。
3. 使用 node 執行 js檔案
- 在命令列通過命令進入檔案所在資料夾(也可以在圖形介面進入此資料夾,在資料夾路徑欄直接輸入cmd),輸入 node xxx.js 來執行。
- 在vscode的終端上執行。
4. 模組化簡介
模組化
- 如果程式設計的規模達到了一定程度,則必須對其進行模組化。
- CommonJS 的模組功能可以幫我們解決該問題。
CommonJS規範
- CommonJS規範的提出,主要是為了彌補ES5沒有模組化標準的缺陷。
- CommonJS對模組的定義十分簡單:
- 模組引用
- 模組定義
- 模組標識
模組引用
- 在 node 中,通過 require() 函式來引入外部的模組。require() 可以傳遞模組標識表示作為引數。
- 使用 require() 引入模組以後,該函式會返回一個物件,這個物件是引入的模組的 exports 物件。
var math = require("./math.js");
模組定義
- 在Node中,一個js檔案就是一個模組。
- 在Node中,每一個js檔案中的js程式碼都是獨立執行在一個函式中,而不是全域性作用域,所以一個模組的中的變數和函式在其他模組中無法訪問。
- 我們可以通過 exports 來向外部暴露變數和方法,只需要將需要暴露給外部的變數或方法設定為 exports 的屬性即可。
模組標識
- 我們使用 require() 引入外部模組時,使用的就是模組標識,我們可以通過模組標識來找到指定的模組。
- 模組分成兩大類
- 核心模組
- 由node引擎提供的模組。
- 核心模組的標識就是模組的名字。
- 示例:var fs = require("fs")
- 檔案模組
- 由使用者自己建立的模組。
- 檔案模組的標識就是檔案的路徑(絕對路徑,相對路徑),相對路徑使用./或../開頭。
- 核心模組
node中的全域性物件
- 在node中有一個全域性物件 global,它的作用和網頁中window類似。
- 在全域性中建立的變數都會作為 global 的屬性儲存。
- 在全域性中建立的函式都會作為 global 的方法儲存。
模組的原理
//當node在執行模組中的程式碼時,它會首先在程式碼的最頂部,新增如下程式碼
function (exports, require, module, __filename, __dirname) {
//在程式碼的最底部,新增如下程式碼
}
-
實際上模組中的程式碼都是包裝在一個函式中執行的,並且在函式執行時,同時傳遞進了5個實參。(該函式由node.js呼叫)
- exports
- 該物件用來將變數或函式暴露到外部,值與 module.exports 的值相等,指向同一個物件。
- require
- 函式,用來引入外部的模組。
- module
- module代表的是當前模組本身。
- exports就是module的屬性。
- 既可以使用 exports 匯出,也可以使用 module.exports 匯出。
- __filename
- C:\Users\lilichao\WebstormProjects\class0705\01.node\04.module.js
- 當前模組的完整路徑。
- __dirname
- C:\Users\lilichao\WebstormProjects\class0705\01.node
- 當前模組所在資料夾的完整路徑。
- exports
-
exports 和 module.exports
- 通過exports只能使用.的方式來向外暴露內部變數。
exports.xxx = xxx
- 而module.exports既可以通過.的形式,也可以直接賦值。
module.exports.xxx = xxxx module.exports = {}
- 不能使用 exports = {},因為這樣 exports 指向的就不是 module.exports 所指向的物件 (實際暴露的是這個物件) 了。
5. 包 package
簡介
- CommonJS的包規範允許我們將一組相關的模組組合到一起,形成一組完整的工具。
- CommonJS的包規範由包結構和包描述檔案兩個部分組成:
- 包結構 : 用於組織包中的各種檔案。
- 包描述檔案 : 描述包的相關資訊,以供外部讀取分析。
- 所謂的包就是把你所寫的一組模組放到一個資料夾內,加一個 package.json 。
包結構
- 包實際上就是一個壓縮檔案,解壓以後還原為目錄。符合規範的目錄,必須包含這個檔案:package.json 描述檔案。
包描述檔案
- 包描述檔案用於表達非程式碼相關的資訊,最重要的是包描述檔案是 package.json。它是一個JSON格式的檔案 package.json,位於包的根目錄下,是包的重要組成部分。
- 注意:在JSON檔案不能寫註釋!
6. NPM(Node Package Manager)
- 對於Node而言,NPM幫助其完成了第三方模組的釋出、安裝和依賴等。藉助NPM,Node與第三方模組之間形成了很好的一個生態系統。
- node所有下載的模組都會放入 node_modules 資料夾中。
- node在使用模組名字來引入模組時,它會首先在當前目錄的 node_modules 中尋找是否含有該模組,如果有則直接使用。如果沒有則去上一級目錄的 node_modules 中尋找,如果有則直接使用。如果沒有則再去上一級目錄尋找,直到找到磁碟的根目錄,如果依然沒有,則報錯。
- npm 命令:
- npm init : 安裝包之前最好先用此命令建立 package.json
- npm -v : 檢視版本
- npm : 幫助說明
- npm search 包名 : 搜尋包
- npm install/i : 下載當前專案所依賴的包
- npm install/i 包名 : 在當前目錄安裝包
- npm install/i 包名 -g : 全域性模式安裝包(全域性安裝的包一般都是一些計算機使用的工具)
- npm remove/r 包名 : 刪除一個模組
- npm install/i 包名 --save : 安裝包並將其新增到依賴中 (vscode不用加 --save 自動向依賴新增/刪除)
7.cnpm
- 映象伺服器。
8. Buffer(緩衝區)
- Buffer 的結構和陣列很像,操作的方法也和陣列類似。
- 陣列中不能儲存二進位制的檔案,而 Buffer 就是專門用來儲存二進位制資料。
- 使用 Buffer 不需要引入模組,直接使用即可。(是node中擴充的一個物件)
- 在 Buffer 中儲存的都是二進位制資料,但是在顯示時都是以16進位制的形式顯示,但是隻要是數字輸出在控制檯,就是10進位制。
- Buffer 中的一個元素,佔用記憶體的一個位元組,Buffer 中每一個元素的範圍是從00 - ff 0 - 255。
- 在 Buffer 中一個漢字佔用3個位元組。
- Buffer 的大小一旦確定,則不能修改,Buffer 實際上是對底層記憶體的直接操作。(原因:再擴充會導致buffer所佔用的不是連續的記憶體空間,不好維護。)
- var buf = Buffer.alloc(10),buf.length 是 buf 佔用記憶體的大小。
- new Buffer() 方法都被棄用了。
- Buffer 方法 :
- Buffer.from(str) 將一個字串轉換為buffer
- Buffer.alloc(size) 建立一個指定大小的Buffer
- Buffer.alloUnsafe(size) 建立一個指定大小的Buffer,但是可能包含敏感資料(alock會初始化所分配的記憶體空間,allockUnsafe不會初始化)
- buf.toString() 將緩衝區中的資料轉換為字串
- 伺服器讀取/傳送資料之前,資料先存在緩衝區中。簡單來說 Buffer 就是一個類似於陣列的東西,但是儲存的是二進位制資料。
9. fs 檔案系統(File System)
- 檔案系統簡單來說就是通過Node來作業系統中的檔案。
- 使用檔案系統,需要先引入fs模組,fs是核心模組,直接引入不需要下載。
var fs = require("fs")
同步和非同步呼叫
- fs模組中所有的操作都有兩種形式可供選擇同步和非同步。
flag
寫入讀取檔案
- 同步檔案寫入/讀取(開啟、讀寫、關閉)
- 非同步檔案寫入/讀取
- 簡單檔案寫入/讀取
- fs.writeFile()
- fs.writeFileSync()
- fs.readFile()
- fs.readFileSync()
- 流式檔案寫入/讀取
- 寫入或讀取大量資料時,最好的方法之一是使用流。
- 使用流需要建立 :
- fs.createWriteStream()
- fs.createReadStream()
- 使用了 ws = fs.createWriteStream() ,就可以使用 ws.write() 方法來寫入它,寫入完成後,在呼叫 ws.close() 方法來關閉流。
- 如果要讀取一個可讀流中的資料,必須要為可讀流繫結一個 data 事件, data 事件繫結完畢,它會自動開始讀取資料(用on繫結)。
- pipe() 可以將可讀流中的內容,直接輸出到可寫流中。
- 可以通過監聽流的open和close事件來監聽流的開啟和關閉(用once監聽)。
- on() : 可以為物件繫結一個事件
- once() : 可以為物件繫結一個一次性的事件,該事件將會在觸發一次以後自動失效
- 讀取檔案時返回 buffer ,因為讀的不一定是文字,也有可能是圖片視訊。
其餘fs方法見文件
學識淺薄,如有錯誤,懇請斧正,在下不勝感激。