1. 程式人生 > 其它 >node基礎入門筆記

node基礎入門筆記

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 和 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

寫入讀取檔案

  1. 同步檔案寫入/讀取(開啟、讀寫、關閉)
  2. 非同步檔案寫入/讀取
  3. 簡單檔案寫入/讀取
    • fs.writeFile()
    • fs.writeFileSync()
    • fs.readFile()
    • fs.readFileSync()
  4. 流式檔案寫入/讀取
    • 寫入或讀取大量資料時,最好的方法之一是使用流。
    • 使用流需要建立 :
      • fs.createWriteStream()
      • fs.createReadStream()
    • 使用了 ws = fs.createWriteStream() ,就可以使用 ws.write() 方法來寫入它,寫入完成後,在呼叫 ws.close() 方法來關閉流。
    • 如果要讀取一個可讀流中的資料,必須要為可讀流繫結一個 data 事件, data 事件繫結完畢,它會自動開始讀取資料(用on繫結)。
    • pipe() 可以將可讀流中的內容,直接輸出到可寫流中。
    • 可以通過監聽流的open和close事件來監聽流的開啟和關閉(用once監聽)。
      • on() : 可以為物件繫結一個事件
      • once() : 可以為物件繫結一個一次性的事件,該事件將會在觸發一次以後自動失效
  5. 讀取檔案時返回 buffer ,因為讀的不一定是文字,也有可能是圖片視訊。

其餘fs方法見文件

學識淺薄,如有錯誤,懇請斧正,在下不勝感激。