日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【Node】常用基础 API 整理

發(fā)布時(shí)間:2024/9/21 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Node】常用基础 API 整理 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、Debug 調(diào)試方法

Node 的調(diào)試方法有很多,主要分為安裝 node-inspect 包調(diào)試、用 Chrome DevTools 調(diào)試和 IDE 調(diào)試,可以在官網(wǎng)的 Docs Debugging Guide 查看安裝方法。

下面介紹使用 Chrome DevTools 調(diào)試的方法,首先安裝 Chrome Extension NIM,打開 Inspect 入口頁(yè)面 chrome://inspect

寫一個(gè)簡(jiǎn)單 debug.js 測(cè)試文件:

// apiTest/debug.js console.log("this is debug test") function test () {console.log("hello world") } test() 復(fù)制代碼

使用node --inspect-brk來(lái)啟動(dòng)腳本,-brk相當(dāng)于在程序入口前加一個(gè)斷點(diǎn),使得程序會(huì)在執(zhí)行前停下來(lái)

$ node --inspect-brk apiTest/debug.js Debugger listening on ws://127.0.0.1:9229/44b5d11e-3261-4090-a18c-2d811486fd0a For help, see: https://nodejs.org/en/docs/inspector 復(fù)制代碼

在 chrome://inspect 中設(shè)置監(jiān)聽端口 9229(默認(rèn)),就可以看到可以 debug 的頁(yè)面:

(function (exports, require, module, __filename, __dirname) { console.log("this is debug test") function test () {console.log("hello world") } test() }); 復(fù)制代碼

如果我們使用node --inspect來(lái)啟動(dòng)腳本,那整個(gè)代碼直接運(yùn)行到代碼結(jié)尾,無(wú)法進(jìn)行調(diào)試,但此時(shí) Node 還進(jìn)程沒(méi)有結(jié)束,所以可以在 http://127.0.0.1:9229/json/list 查詢 devtoolsFrontendUrl ,復(fù)制此 Url 到 Chrome 上進(jìn)行調(diào)試。

看到使用 Chrome DevTools 的調(diào)試方法還是比較復(fù)雜的,一些 IDE 都支持直接斷點(diǎn)調(diào)試,推薦WebStorm、VScode。

二、全局變量

在 Node 中常用的全局方法有 CommonJS、Buffer、process、console、timer 等,這些方法不需要 require引入 API 就可以直接使用。

如果希望有屬性或方法可以*“全局使用”*,那就將它掛載在 Node 的global對(duì)象上:

global.gNum = 300 console.log(gNum); // 300 復(fù)制代碼

在 Node 中所有模塊都可以使用這些全局變量,以下就介紹 Node 中的全局變量

2.1 CommonJS 模塊

Node CommonJS 模塊規(guī)范根據(jù)實(shí)現(xiàn)了module、exports和require模塊機(jī)制。Node 對(duì)每個(gè)文件都被進(jìn)行了模塊封裝,每個(gè)模塊有自己的作用域,如在 debug 時(shí)看到的:

(function (exports, require, module, __filename, __dirname) { // some code }); 復(fù)制代碼

模塊機(jī)制中的 __dirname、__filename、exports、module、require()這些變量雖然看起來(lái)是全局的,但其實(shí)它們僅存在于模塊范圍。需要注意的幾點(diǎn)是:

  • 模塊內(nèi)部module變量代表模塊本身
  • 模塊提供require()方法引入外部模塊到當(dāng)前的上下文中
  • module.exports屬性代表模塊對(duì)外接口,默認(rèn)的快捷方式exports

簡(jiǎn)單的使用方式如下:

/* common_exports.js */ exports.num = 100 exports.obj = {a : 200 } exports = {count : 300 }/* common_require.js */ const mod = require('./common_exports') console.log(mod) // { num: 100, obj: { a: 200 } } console.log(mod.count) // undefined 復(fù)制代碼

注意到上例中的mod.count為undefined,這是因?yàn)閑xports只是module.exports的引用,可以給exports添加屬性,但不能修改exports的指向。

更深入的了解模塊機(jī)制可以看 【Node】前后端模塊規(guī)范與模塊加載原理

2.2 process 進(jìn)程對(duì)象

process 包含了進(jìn)程相關(guān)的屬性和方法,Node 的 process 文檔 中的內(nèi)容特別多,列舉幾個(gè)常用方法。

Node 進(jìn)程啟動(dòng)時(shí)傳遞的參數(shù)都在 process.arg數(shù)組中:

// process.js const {argv , execPath} = processargv.forEach((val, index) => {console.log(`${index}: ${val}`) }) console.log(execPath) 復(fù)制代碼

可以在執(zhí)行 process.js 時(shí)傳遞其他參數(shù),這些參數(shù)都會(huì)保存在argv中:

$ node apiTest/process.js one=1 --inspect --version 0: /usr/local/bin/node 1: /Users/mobike/Documents/webProjects/testNode/apiTest/process.js 2: one=1 3: --inspect 4: --version /usr/local/bin/node 復(fù)制代碼

process.argv第一個(gè)參數(shù)就是 process.execPath ,即調(diào)用執(zhí)行程序 Node 的路徑,第二個(gè)參數(shù)時(shí)被執(zhí)行的 JS 文件路徑,剩下的就是自定義參數(shù)。


process.env是包含運(yùn)行環(huán)境各種參數(shù)的對(duì)象,可以直接輸出env查看所有參數(shù)信息,也可以輸出某個(gè)屬性:

const env = process.env console.log(env.PATH) // /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/Documents/webProjects/testNode/node_modules/.bin console.log(env.SHELL) // /bin/zsh 復(fù)制代碼

在 webpack 打包過(guò)程中常用process.env.NODE_ENV判斷生產(chǎn)環(huán)境或開發(fā)環(huán)境,process.env是沒(méi)有NODE_ENV這個(gè)屬性的,你可以在系統(tǒng)環(huán)境變量中配置,也可以在項(xiàng)目程序直接設(shè)置process.env.NODE_ENV=‘dev’。


process.cwd()方法返回 Node.js 進(jìn)程的當(dāng)前工作目錄,和 Linus 命令$ pwd功能一樣:

// process.js console.log(process.cwd()) // /Users/Documents/webProjects/testNode 復(fù)制代碼$ node process.js /Users/WebstormProjects/testNode $ pwd /Users/WebstormProjects/testNode復(fù)制代碼

2.3 Timers 異步

Node 中的計(jì)時(shí)器方法與 Web 瀏覽器中的JS 計(jì)時(shí)器類似,但內(nèi)部實(shí)現(xiàn)是基于 Node 的 Event Loop。Node 中的計(jì)時(shí)器有setImmediate()、setTimeout()、setInterval()。

在 Node 中有一個(gè)輕量級(jí)的process.nextTick()異步方法,它是在當(dāng)前事件隊(duì)列結(jié)束時(shí)調(diào)用, setImmediate()是當(dāng)前 Node Event Loop 結(jié)束時(shí)立即執(zhí)行,那執(zhí)行順序有什么區(qū)別呢?

下面舉例說(shuō)明process.nextTick(fn)與setImmediate(fn)與setTimeout(fn,0)之間的區(qū)別:

// timer.js setImmediate(()=>{console.log("setImmediate") });setTimeout(()=>{console.log("setTimeout 0") },0);setTimeout(()=>{console.log("setTimeout 100") },100);process.nextTick(()=>{console.log("nextTick")process.nextTick(()=>{console.log("nextTick inner")}) }); 復(fù)制代碼

看下執(zhí)行結(jié)果:

$ node timer.js nextTick nextTick inner setTimeout 0 setImmediate setTimeout 100 復(fù)制代碼

process.nextTick()中的回調(diào)函數(shù)最快執(zhí)行,因?yàn)樗鼘惒绞录迦氲疆?dāng)前執(zhí)行隊(duì)列的末尾,但如果process.nextTick()中的事件執(zhí)行時(shí)間過(guò)長(zhǎng),后面的異步事件就被延遲。

setImmediate()執(zhí)行最慢,因?yàn)樗鼘⑹录迦氲较乱粋€(gè)事件隊(duì)列的隊(duì)首,不會(huì)影響當(dāng)前事件隊(duì)列的執(zhí)行。當(dāng)setTimeout(fn, 0)是在setImmediate()之前執(zhí)行。

2.4 Buffer 二進(jìn)制

Buffer 對(duì)象用于處理二進(jìn)制數(shù)據(jù)流。JS 沒(méi)有處理二進(jìn)制的功能,而 Node 中的一部分代碼是由 C++ 實(shí)現(xiàn)的,所有 Node 中的 Buffer 性能部分用 C++ 實(shí)現(xiàn),非性能部分由 JS 封裝。

Buffer 實(shí)例類似整數(shù)數(shù)組,元素為十六進(jìn)制的兩位數(shù)(0~255),并且掛載在 global 對(duì)象上不需要 require就能使用。

最新的 Buffer API 使用Buffer.alloc(length, value)創(chuàng)建固定長(zhǎng)度為 length 的 Buffer 實(shí)例,value 默認(rèn)填充 0,使用Buffer.from()將其它類型數(shù)據(jù)轉(zhuǎn)為 Buffer:

console.log(Buffer.alloc(5)) // <Buffer 00 00 00 00 00> console.log(Buffer.alloc(5, 44)) // <Buffer 2c 2c 2c 2c 2c> console.log(Buffer.from([3, 4, 5])) // <Buffer 03 04 05> console.log(Buffer.from('test')) // <Buffer 74 65 73 74> console.log(Buffer.from('測(cè)試')) // <Buffer e6 b5 8b e8 af 95> 復(fù)制代碼

注意到字符串轉(zhuǎn) Buffer 時(shí)英文占一位,中文占三位,而不是四位,當(dāng)中文亂碼的時(shí)可以考慮沒(méi)有正確讀取 Buffer 流。

Buffer 類提供幾個(gè)靜態(tài)方法,Buffer.byteLength()計(jì)算長(zhǎng)度,Buffer.isBuffer()做驗(yàn)證,Buffer.concat()拼接 Buffer 實(shí)例:

const buf1 = Buffer.from([3, 4, 5]) const buf2 = Buffer.from('test')console.log(Buffer.byteLength('test')) // 4 console.log(Buffer.byteLength('測(cè)試')) // 6 console.log(Buffer.isBuffer('test')) // false console.log(Buffer.isBuffer(buf1)) // true console.log(Buffer.concat([buf1, buf2])) // <Buffer 03 04 05 74 65 73 74>復(fù)制代碼

除此之外,Buffer 實(shí)例也有常用的屬性和方法,類似 JS 中的 String,有l(wèi)ength、toString('base64')、equals()、indexOf()等。

以上就是 Node 全局變量的概述,其他的 API 或內(nèi)置模塊都需要· require('xxx')引入使用,我們可以在 nodejs.cn 中查看關(guān)于 Global API 更詳細(xì)的介紹。

三、基礎(chǔ) API

3.1 path 路徑相關(guān)

path 是處理和路徑相關(guān)問(wèn)題的內(nèi)置 API,可以直接require('path')使用。以下示例常用的 path 方法。

對(duì)路徑的處理常用path.normalize()規(guī)范路徑、path.join()拼接路徑,以及使用path.resolve()將相對(duì)路徑解析為絕對(duì)路徑:

const path = require('path') console.log(path.normalize('//asd\/das'), // /asd/daspath.join('user', 'local'), // user/localpath.resolve('./')) // /Users/Documents/webProjects/testNode/apiTest 復(fù)制代碼

解析某個(gè)路徑,可以用path.basename()得到文件名稱,path.extname()得到后綴擴(kuò)展名,path.dirname()得到目錄名:

const path = require('path') const filePath = 'webProjects/testNode/apiTest/path.js' console.log(path.basename(filePath), // path.js path.extname(filePath) // .js path.dirname(filePath), // webProjects/testNode/apiTest ) 復(fù)制代碼

以上解析路徑方法得到某個(gè)值,還可以使用path.parse()完全解析路徑為一個(gè)對(duì)象,path.format()反向操作:

let sp = path.parse(filePath) console.log(sp) // { root: '', // dir: 'webProjects/testNode/apiTest', // base: 'path.js', // ext: '.js', // name: 'path' } console.log(path.format(sp)) // webProjects/testNode/apiTest/path.js 復(fù)制代碼

除此之外,還有對(duì)于系統(tǒng)路徑的操作,使用path.sep取得路徑分隔符,路徑片段分隔符,POSIX 上是/, Windows 上是\,path.delimiter取得系統(tǒng)路徑定界符,POSIX 上是:,Windows 上是; ,示例如下:

console.log(filePath.split(path.sep)) // [ 'webProjects', 'testNode', 'apiTest', 'path.js' ]console.log(process.env.PATH) // 系統(tǒng)路徑配置 // /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbinconsole.log(process.env.PATH.split(path.delimiter)) // [ '/usr/local/bin', '/usr/bin', '/bin', '/usr/sbin', '/sbin' ] 復(fù)制代碼

以上就是 Node 對(duì)路徑的常用操作,需要注意的是,在獲取路徑時(shí)有幾種方式,得到的路徑是不同的:

  • __dirname 、__filename:總是返回文件絕對(duì)路徑;
  • process.cwd() 或 $ pwd :返回執(zhí)行 Node 命令的文件夾;
  • path.resolve('./'):是相對(duì) Node 啟動(dòng)文件夾,在require()中./是相對(duì)于當(dāng)前文件夾;

3.3 events 事件

大部分 Node API 都采用異步事件驅(qū)動(dòng),所有能觸發(fā)事件對(duì)象都是 EventEmitter 類的實(shí)例,通過(guò) EventEmitter.on()綁定事件,然后通過(guò) EventEmitter.emit() 觸發(fā)事件。

// apiTest/events.js const Events = require('events')class MyEvents extends Events{ } const event = new MyEvents()event.on('test-event',()=>{console.log('this is an event') })event.emit('test-event') setInterval(()=>{event.emit('test-event') },500) 復(fù)制代碼

執(zhí)行以上代碼會(huì)一直連續(xù)處罰 test-event 事件,當(dāng)然還可以傳遞事件參數(shù),并且可以傳遞多個(gè)參數(shù)。修改上訴代碼如下:

event.on('test-event', (data, time) => {console.log(data,time) }) event.emit('test-event', [1, 2, 3], new Date()) 復(fù)制代碼$ node apiTest/events.js [ 1, 2, 3 ] 2019-04-23T07:28:00.420Z 復(fù)制代碼

同一個(gè)事件監(jiān)聽器可以綁定多個(gè)事件,觸發(fā)時(shí)按照綁定順序加入執(zhí)行隊(duì)列,并且可以使用EventEmitter.removeListener()刪除監(jiān)聽器的事件:

function fn1 () {console.log('fn1') } function fn2 () {console.log('fn2') } event.on('multi-event',fn1) event.on('multi-event',fn2)setInterval(()=>{event.emit('multi-event') },500) setTimeout(()=>{event.removeListener('multi-event', fn2) }, 600) 復(fù)制代碼$ node apiTest/events.js [ 1, 2, 3 ] 2019-04-23T07:39:11.624Z fn1 fn2 fn1 fn1 ... 復(fù)制代碼

3.4 fs 文件系統(tǒng)

Node 文件模塊通過(guò)require('fs)使用,所用方法都有同步和異步方法。

文件系統(tǒng)中的異步方法,第一個(gè)參數(shù)保留給異常,操作成功時(shí)參數(shù)值為null或undefined,最后一個(gè)參數(shù)就是回調(diào)函數(shù)。例如讀取文件的fs.readFile()和寫文件的fs.writeFile()示例如下:

const fs = require('fs')fs.readFile('./apiTest/fs.js', (err, data) => {if (err) throw errconsole.log('readFile done!!!') })fs.writeFile('./apiTest/fs.txt', 'this is test file', {encoding: 'utf8' }, (err) => {if (err) throw errconsole.log('writeFile done!!!') }) 復(fù)制代碼

推薦 nodejs.cn 中的 Docs API 中文版查看更多 Node API 的使用。


加油呢少年~

總結(jié)

以上是生活随笔為你收集整理的【Node】常用基础 API 整理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。