你应该知道的 Node 基础知识
大家好,我是若川。最近組織了源碼共讀活動(dòng),感興趣的可以加我微信?ruochuan12?參與,已進(jìn)行兩個(gè)多月,大家一起交流學(xué)習(xí),共同進(jìn)步。源碼共讀學(xué)的多數(shù)是 Node.js ,今天分享一篇 Node.js 基礎(chǔ)知識(shí)的文章。
一. ?Node執(zhí)行代碼
1.1. JavaScript文件執(zhí)行
如果我們編寫一個(gè)js文件,里面存放JavaScript代碼,如何來執(zhí)行它呢?
//?1.直接打印一段文字 console.log("我是一段JavaScript代碼");//?2.定義一個(gè)函數(shù),?調(diào)用這個(gè)函數(shù) function?sum(num1,?num2)?{return?num1?+?num2; }const?result?=?sum(20,?30); console.log("計(jì)算結(jié)果:",?result);//?3.執(zhí)行定時(shí)器代碼 setTimeout(()?=>?{console.log("2s后執(zhí)行的代碼"); },?2000);目前我們知道有兩種方式可以執(zhí)行:
將代碼交給瀏覽器執(zhí)行;
將代碼載入到node環(huán)境中執(zhí)行;
演練一:瀏覽器執(zhí)行
如果我們希望把代碼交給瀏覽器執(zhí)行:
需要通過讓瀏覽器加載、解析html代碼,所以我們需要?jiǎng)?chuàng)建一個(gè)html文件;
在html中通過script標(biāo)簽,引入js文件;
當(dāng)瀏覽器遇到script標(biāo)簽時(shí),就會(huì)根據(jù)src加載、執(zhí)行JavaScript代碼;
index.html文件:
<!DOCTYPE?html> <html?lang="en"> <head><meta?charset="UTF-8"><meta?name="viewport"?content="width=device-width,?initial-scale=1.0"><title>Document</title> </head> <body><script?src="./index.js"></script> </body> </html>瀏覽器執(zhí)行結(jié)果演練二:Node執(zhí)行
如果我們希望把js文件交給node執(zhí)行:
首先電腦上需要安裝Node.js環(huán)境,安裝過程中會(huì)自動(dòng)配置環(huán)境變量;
可以通過終端命令node js文件的方式來載入和執(zhí)行對(duì)應(yīng)的js文件;
1.2. Node的REPL
什么是REPL呢?感覺挺高大上
REPL是Read-Eval-Print Loop的簡(jiǎn)稱,翻譯為**“讀取-求值-輸出”循環(huán)**;
REPL是一個(gè)簡(jiǎn)單的,交互式的編程環(huán)境;
事實(shí)上,我們?yōu)g覽器的console就可以看成一個(gè)REPL:
瀏覽器控制臺(tái)Node也給我們提供了一個(gè)REPL環(huán)境,我們可以在其中演練簡(jiǎn)單的代碼:
REPL演練二. Node輸入輸出
2.1. 給node程序傳遞參數(shù)
正常情況下執(zhí)行一個(gè)node程序,直接跟上我們對(duì)應(yīng)的文件即可:
node?index.js但是,在某些情況下執(zhí)行node程序的過程中,我們可能希望給node傳遞一些參數(shù):
node?index.js?env=development?coderwhy如果我們這樣來使用程序,就意味著我們需要在程序中獲取到傳遞的參數(shù):
獲取參數(shù)其實(shí)是在process的內(nèi)置對(duì)象中的;
如果我們直接打印這個(gè)內(nèi)置對(duì)象,它里面包含特別的信息:
其他的一些信息,比如版本、操作系統(tǒng)等大家可以自行查看,后面用到一些其他的我們還會(huì)提到;
現(xiàn)在,我們先找到其中的argv屬性:
我們發(fā)現(xiàn)它是一個(gè)數(shù)組,里面包含了我們需要的參數(shù);
你可能有個(gè)疑問,為什么叫argv呢?
在C/C++程序中的main函數(shù)中,實(shí)際上可以獲取到兩個(gè)參數(shù):
argc:argument counter的縮寫,傳遞參數(shù)的個(gè)數(shù);
argv:argument vector的縮寫,傳入的具體參數(shù)。
vector翻譯過來是矢量的意思,在程序中表示的是一種數(shù)據(jù)結(jié)構(gòu)。
在C++、Java中都有這種數(shù)據(jù)結(jié)構(gòu),是一種數(shù)組結(jié)構(gòu);
在JavaScript中也是一個(gè)數(shù)組,里面存儲(chǔ)一些參數(shù)信息;
我們可以在代碼中,將這些參數(shù)信息遍歷出來,使用:
//?獲取參數(shù) console.log(process.argv); process.argv.forEach(item?=>?{console.log(item); });//?結(jié)果如下: //?/usr/local/bin/node //?/Users/coderwhy/Desktop/Node/TestCode/04_learn_node/02_給Node傳遞參數(shù)/index.js //?ENV=dev //?coderwhy2.2. node程序輸出內(nèi)容
console.log
最常用的輸入內(nèi)容的方式:console.log
console.log("hello?coderwhy");console.clear
清空控制臺(tái):console.clear
console.clearconsole.trace
打印函數(shù)的調(diào)用棧:console.trace
function?test()?{demo(); }function?demo()?{foo(); }function?foo()?{console.trace(); }test();console.trace結(jié)果還有一些其他的方法,其他的一些console方法,可以自己在下面學(xué)習(xí)研究一下。
image-20201008163045395三. 常見全局對(duì)象
3.1. 常見的全局對(duì)象
Node中給我們提供了一些全局對(duì)象,方便我們進(jìn)行一些操作:
這些全局對(duì)象,我們并不需要從一開始全部一個(gè)個(gè)學(xué)習(xí);
某些全局對(duì)象并不常用,某些全局對(duì)象我們會(huì)在后續(xù)學(xué)習(xí)中講到;
比如module、exports、require()會(huì)在模塊化中講到;
比如Buffer后續(xù)會(huì)專門講到;
3.2. 特殊的全局對(duì)象
為什么我稱之為特殊的全局對(duì)象呢?
這些全局對(duì)象可以在模塊中任意使用,但是在命令行交互中是不可以使用的;
包括:__dirname、__filename、exports、module、require()
__dirname
獲取當(dāng)前文件所在的路徑:
注意:不包括后面的文件名
__filename
獲取當(dāng)前文件所在的路徑和文件名稱:
注意:包括后面的文件名稱
3.3. 常見的全局對(duì)象
process對(duì)象
process提供了Node進(jìn)程中相關(guān)的信息:
比如Node的運(yùn)行環(huán)境、參數(shù)信息等;
后面在項(xiàng)目中,我也會(huì)講解,如何將一些環(huán)境變量讀取到?process?的?env?中;
console對(duì)象
提供了簡(jiǎn)單的調(diào)試控制臺(tái),在前面講解輸入內(nèi)容時(shí)已經(jīng)學(xué)習(xí)過了。
更加詳細(xì)的查看官網(wǎng)文檔:https://nodejs.org/api/console.html
定時(shí)器函數(shù)
在Node中使用定時(shí)器有好幾種方式:
setTimeout(callback, delay[, ...args]):callback在delay毫秒后執(zhí)行一次;
setInterval(callback, delay[, ...args]):callback每delay毫秒重復(fù)執(zhí)行一次;
setImmediate(callback[, ...args]):callbackI / O事件后的回調(diào)的“立即”執(zhí)行;
這里先不展開討論它和setTimeout(callback, 0)之間的區(qū)別;
因?yàn)樗婕暗绞录h(huán)的階段問題,我會(huì)在后續(xù)詳細(xì)講解事件循環(huán)相關(guān)的知識(shí);
process.nextTick(callback[, ...args]):添加到下一次tick隊(duì)列中;
具體的講解,也放到事件循環(huán)中說明;
代碼演練:
暫時(shí)不用關(guān)心執(zhí)行順序問題,在后續(xù)事件循環(huán)中我會(huì)講到;
當(dāng)然,它們有對(duì)應(yīng)的取消定時(shí)器的方法:
clearTimeout(timeoutObject);
clearInterval(intervalObject);
clearImmediate(immediateObject)
global對(duì)象
global是一個(gè)全局對(duì)象,事實(shí)上前端我們提到的process、console、setTimeout等都有被放到global中:
console.log(process); console.log(global.process);為什么結(jié)果是一樣的呢?
Node的源碼global中還有哪些屬性呢?
global其他屬性的查看window和global的區(qū)別是什么?
在瀏覽器中,全局變量都是在window上的,比如有document、setInterval、setTimeout、alert、console等等
在Node中,我們也有一個(gè)global屬性,并且看起來它里面有很多其他對(duì)象。
但是在瀏覽器中執(zhí)行的JavaScript代碼,如果我們?cè)陧敿?jí)范圍內(nèi)通過var定義的一個(gè)屬性,默認(rèn)會(huì)被添加到window對(duì)象上:
var?name?=?'coderwhy'; console.log(window.name);?//?coderwhy但是在node中,我們通過var定義一個(gè)變量,它只是在當(dāng)前模塊中有一個(gè)變量,不會(huì)放到全局中:
var?name?=?'coderwhy'; console.log(global.name);?//?undefined更多的全局對(duì)象,我們后面用到的時(shí)候再詳細(xì)講解。
最近組建了一個(gè)江西人的前端交流群,如果你是江西人可以加我微信?ruochuan12?私信 江西?拉你進(jìn)群。
推薦閱讀
1個(gè)月,200+人,一起讀了4周源碼
我歷時(shí)3年才寫了10余篇源碼文章,但收獲了100w+閱讀
老姚淺談:怎么學(xué)JavaScript?
我在阿里招前端,該怎么幫你(可進(jìn)面試群)
·················?若川簡(jiǎn)介?·················
你好,我是若川,畢業(yè)于江西高校。現(xiàn)在是一名前端開發(fā)“工程師”。寫有《學(xué)習(xí)源碼整體架構(gòu)系列
從2014年起,每年都會(huì)寫一篇年度總結(jié),已經(jīng)寫了7篇,點(diǎn)擊查看年度總結(jié)。
同時(shí),最近組織了源碼共讀活動(dòng)
識(shí)別上方二維碼加我微信、拉你進(jìn)源碼共讀群
今日話題
略。歡迎分享、收藏、點(diǎn)贊、在看我的公眾號(hào)文章~
總結(jié)
以上是生活随笔為你收集整理的你应该知道的 Node 基础知识的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小米路由器能搭建虚拟服务器吗,【教程】如
- 下一篇: react(86)--列表项控制选中