四川旅游網(wǎng)站設(shè)計論文全網(wǎng)營銷外包
一、Node.js是什么
1.node.js是什么
官方對Node.js的定義:
Node.js是一個基于V8 JavaScript引擎
的JavaScript運行時
環(huán)境。
也就是說Node.js基于V8引擎來執(zhí)行JavaScript的代碼,但是不僅僅只有V8引擎
:
前面我們知道V8可以嵌入到任何C ++應(yīng)用程序中,無論是Chrome還是Node.js,事實上都是嵌入了V8引擎
來執(zhí)行JavaScript代碼;
但是在Chrome瀏覽器中,還需要解析
、渲染HTML
、CSS
等相關(guān)渲染引擎,另外還需要提供支持瀏覽器操作的API
、瀏覽器自己的事件循環(huán)
等;
另外,在Node.js中我們也需要進行一些額外的操作,比如文件系統(tǒng)讀/寫
、網(wǎng)絡(luò)IO
、加密
、壓縮解壓文件
等操作;
2.瀏覽器和Node.js架構(gòu)的區(qū)別
我們可以簡單理解規(guī)劃出Node.js和瀏覽器的差異:
3.Node.js架構(gòu)
我們來看一個單獨的Node.js的架構(gòu)圖:
我們編寫的JavaScript代碼會經(jīng)過V8引擎
,再通過Node.js的Bindings
,將任務(wù)放到Libuv
的事件循環(huán)中;
- libuv(Unicorn Velociraptor—獨角伶盜龍)是使用
C語言
編寫的庫; - libuv提供了
事件循環(huán)
、文件系統(tǒng)讀寫
、網(wǎng)絡(luò)IO
、線程池
等等內(nèi)容;
4.Node.js的應(yīng)用場景
Node.js的快速發(fā)展也讓企業(yè)對Node.js技術(shù)越來越重視,在前端招聘中通常會對Node.js有一定的要求,特別對于高級前端開發(fā)工程師,Node.js更是必不可少的技能:
應(yīng)用一:目前前端開發(fā)的庫都是以node包的形式進行管理
;
應(yīng)用二:npm、yarn、pnpm工具成為前端開發(fā)使用最多的工具;
應(yīng)用三:越來越多的公司使用Node.js作為web服務(wù)器開發(fā)、中間件、代理服務(wù)器;
應(yīng)用四:大量項目需要借助Node.js完成前后端渲染的同構(gòu)應(yīng)用
;
應(yīng)用五:資深前端工程師需要為項目編寫腳本工具(前端工程師編寫腳本通常會使用JavaScript,而不是Python或者shell);
應(yīng)用六:很多企業(yè)在使用Electron來開發(fā)桌面應(yīng)用程序;
二、Node的安裝
1.Node的安裝
Node.js是在2009年誕生的,目前最新的版本是分別是LTS 16.15.1以及Current 18.4.0:
LTS版本
:(Long-term support, 長期支持)相對穩(wěn)定一些,推薦線上環(huán)境使用該版本;Current版本
:最新的Node版本,包含很多新特性;
這些我們選擇什么版本呢?
- 如果你是
學(xué)習(xí)使用
,可以選擇current版本; - 如果你是
公司開發(fā)
,建議選擇LTS版本(面向工作,選擇LTS版本);
Node的安裝方式有很多:
- 可以借助于一些操作系統(tǒng)上的軟件管理工具,比如Mac上的
homebrew
,Linux上的yum
、dnf等; - 也可以直接下載對應(yīng)的
安裝包
下載安裝;
我們選擇下載安裝,下載自己操作系統(tǒng)的安裝包直接安裝就可以了:
- window選擇.msi安裝包,Mac選擇.pkg安裝包,Linux會在后續(xù)部署中講解;
- 安裝過程中會配置
環(huán)境變量
(讓我們可以在命令行使用); - 并且會安裝
npm
(Node Package Manager)工具;
2.Node版本管理工具
在實際開發(fā)學(xué)習(xí)中,我們只需要使用一個Node版本來開發(fā)或者學(xué)習(xí)即可。
但是,如果你希望通過可以快速更新或切換多個版本
時,可以借助于一些工具:
nvm
:Node Version Manager;n
:Interactively Manage Your Node.js Versions(交互式管理你的Node.js版本)
問題:這兩個工具都不支持window
Window的用戶怎么辦?
針對nvm,在GitHub上有提供對應(yīng)的window版本:https://github.com/coreybutler/nvm-windows
-
通過 nvm install latest 安裝最新的node版本
-
通過 nvm list 展示目前安裝的所有版本
-
通過 nvm use 切換版本
3.版本管理工具:n
安裝n:直接使用npm安裝
即可
# 安裝工具n
npm install -g n
# 查看n的版本
n --version
安裝最新的lts
版本:
- 前面添加的sudo是權(quán)限問題;
- 可以兩個版本都安裝,之后我們可以通過n快速在兩個版本間切換;
# 安裝lts版本
n lts
# 安裝最新版本
n latest
三、JavaScript代碼運行
1.JavaScript代碼運行
如果我們編寫一個js文件,里面存放JavaScript代碼,如何來執(zhí)行它呢?
目前我們知道有兩種方式
可以執(zhí)行:
- 將代碼交給瀏覽器執(zhí)行;
- 將代碼載入到node環(huán)境中執(zhí)行;
如果我們希望把代碼交給瀏覽器執(zhí)行:
需要通過讓瀏覽器加載、解析html代碼,所以我們需要創(chuàng)建一個html文件;
- 在html中通過script標(biāo)簽,引入js文件;
- 當(dāng)瀏覽器遇到script標(biāo)簽時,就會根據(jù)src加載、執(zhí)行JavaScript代碼;
如果我們希望把js文件交給node執(zhí)行:
- 首先電腦上需要安裝Node.js環(huán)境,安裝過程中會
自動配置環(huán)境變量
; - 可以通過終端命令
node js文件
的方式來載入和執(zhí)行對應(yīng)的js文件;
2.Node的REPL
什么是REPL呢?感覺挺高大上
- REPL是Read-Eval-Print Loop的簡稱,翻譯為“讀取-求值-輸出”循環(huán);
- REPL是一個簡單的、交互式的
編程環(huán)境
;
事實上,我們?yōu)g覽器的console
就可以看成一個REPL。
Node也給我們提供了一個REPL環(huán)境,我們可以在其中演練簡單的代碼。
四、Node的輸入和輸出
1.Node程序傳遞參數(shù)
正常情況下執(zhí)行一個node程序,直接跟上我們對應(yīng)的文件即可:
node index.js
但是,在某些情況下執(zhí)行node程序的過程中,我們可能希望給node傳遞一些參數(shù):
node index.js env=dev abc
如果我們這樣來使用程序,就意味著我們需要在程序中獲取到傳遞的參數(shù)
:
- 獲取參數(shù)其實是在
process
的內(nèi)置對象中的; - 如果我們直接打印這個內(nèi)置對象,它里面包含特別多的信息:
- 其他的一些信息,比如版本、操作系統(tǒng)等大家可以自行查看,后面用到一些其他的我們還會提到;
現(xiàn)在,我們先找到其中的argv
屬性:
- 我們發(fā)現(xiàn)它是一個數(shù)組,里面包含了我們需要的參數(shù);
// 2.給程序輸入內(nèi)容
// node ./webpack.config.js env=development
const arg1 = process.argv[2]
const arg2 = process.argv[3]console.log(arg1, arg2)setTimeout(() => {// console.clear()console.trace()
}, 3000);
2.為什么叫argv呢?
你可能有個疑問,為什么叫argv
呢?
在C/C++程序中的main函數(shù)中,實際上可以獲取到兩個參數(shù):
- argc:argument counter的縮寫,傳遞參數(shù)的個數(shù);
- argv:argument vector(向量、矢量)的縮寫,傳入的具體參數(shù)。
vector
翻譯過來是矢量的意思,在程序中表示的是一種數(shù)據(jù)結(jié)構(gòu)
。
在C++、Java中都有這種數(shù)據(jù)結(jié)構(gòu),是一種數(shù)組結(jié)構(gòu)
;
在JavaScript中也是一個數(shù)組,里面存儲一些參數(shù)信息;
我們可以在代碼中,將這些參數(shù)信息遍歷出來,使用:
const args = process.argv
for (const arg of args) {console.log(arg)
}
3.Node的輸出
console.log
- 最常用的輸入內(nèi)容的方式:console.log
console.clear
- 清空控制臺:console.clear
console.trace
- 打印函數(shù)的調(diào)用棧:console.trace
還有一些其他的方法,其他的一些console方法,可以自己在下面學(xué)習(xí)研究一下。
- https://nodejs.org/dist/latest-v16.x/docs/api/console.html
五、常見的全局對象
1.常見的全局對象
Node中給我們提供了一些全局對象,方便我們進行一些操作:
- 這些全局對象,我們并不需要從一開始全部一個個學(xué)習(xí);
- 某些全局對象并
不常用
; - 某些全局對象我們會在
后續(xù)學(xué)習(xí)中講
到;- 比如module、exports、require()會在模塊化中講到;
- 比如Buffer后續(xù)會專門講到;
process對象:process提供了Node進程中相關(guān)的信息:
- 比如Node的運行環(huán)境、參數(shù)信息等;
- 后面在項目中,我也會講解,如何將一些環(huán)境變量讀取到 process 的 env 中;
console對象:提供了簡單的調(diào)試控制臺,在前面講解輸入內(nèi)容時已經(jīng)學(xué)習(xí)過了。
- 更加詳細的查看官網(wǎng)文檔:https://nodejs.org/api/console.html
定時器函數(shù):在Node中使用定時器有幾種方式:
- setTimeout(callback, delay[, …args]):callback在delay毫秒后執(zhí)行一次;
- setInterval(callback, delay[, …args]):callback每delay毫秒重復(fù)執(zhí)行一次;
- setImmediate(callback[, …args]):callback I / O事件后的回調(diào)的“立即”執(zhí)行;
- 這里先不展開討論它和setTimeout(callback, 0)之間的區(qū)別;
- 因為它涉及到事件循環(huán)的階段問題,我會在后續(xù)詳細講解事件循環(huán)相關(guān)的知識;
process.nextTick(callback[, …args]):添加到下一次tick隊列中;
- 具體的講解,也放到
事件循環(huán)
中說明;
2.global對象
global是一個全局對象,事實上前端我們提到的process、console、setTimeout等都有被放到global中:
我們之前講過:在新的標(biāo)準(zhǔn)中還有一個globalThis
,也是指向全局對象的;
類似于瀏覽器中的window
;
console.log(global === globalThis)// true
3.global和window的區(qū)別
在瀏覽器中,全局變量都是在window
上的,比如有document、setInterval、setTimeout、alert、console等等
在Node中,我們也有一個global
屬性,并且看起來它里面有很多其他對象。
但是在瀏覽器中執(zhí)行的JavaScript代碼,如果我們在頂級范圍內(nèi)通過var定義的一個屬性,默認會被添加到window對象上
:
var foo = 111
console.log(window.foo)// 111
但是在node中,我們通過var定義一個變量,它只是在當(dāng)前模塊中有一個變量,不會放到全局中
:
var foo = 111
console.log(window.foo)// undefined
3.特殊的全局對象
為什么我稱之為特殊的全局對象
呢?
- 這些全局對象實際上是模塊中的
變量
,只是每個模塊都有,看來像是全局變量; - 在命令行交互中是不可以使用的;
- 包括:__dirname、__filename、exports、module、require()
__dirname:獲取當(dāng)前文件所在的路徑:
- 注意:不包括后面的文件名
__filename:獲取當(dāng)前文件所在的路徑和文件名稱:
- 注意:包括后面的文件名稱
console.log("全局對象__dirname:" + __dirname)
// 全局對象__dirname:D:\disk\frontend\code\06JS_MODULE\01Nodejs
console.log("全局對象__filename:" + __filename)
// 全局對象__filename:D:\disk\frontend\code\06JS_MODULE\01Nodejs\03_全局對象.js