域名和網(wǎng)站名不一樣百度推廣登錄平臺網(wǎng)址
一、概述
Node.js 是一個基于 Chrome V8 引擎的 JavaScript 運行環(huán)境 ,使用了一個事件驅(qū)動、非阻塞式I/O模型, 讓JavaScript 運行在服務(wù)端的開發(fā)平臺,它讓JavaScript成為與PHP、Python、Perl、Ruby等服務(wù)端語言平起平坐的腳本語言。
官網(wǎng)地址:https://nodejs.org/zh-cn
Node.js 學(xué)習(xí)路線:JavaScript 基礎(chǔ)語法 + Node.js 內(nèi)置API模塊(fs、path、http等) + 第三方API模塊(express、mysql等)
二、安裝
打開 官網(wǎng) ,根據(jù)實際需求選擇下載方式以及下載內(nèi)容
三、Node.js 模塊
1、概述
Node.js 中根據(jù)模塊來源的不同,將模塊分為了 3 大類,分別是:
-
內(nèi)置模塊(內(nèi)置模塊是由 Node.js 官方提供的,例如 fs、path、http 等)
-
自定義模塊(用戶創(chuàng)建的每個 .js 文件,都是自定義模塊)
-
第三方模塊(由第三方開發(fā)出來的模塊,并非官方提供的內(nèi)置模塊,也不是用戶創(chuàng)建的自定義模塊,使用前需要先下載)
// 1. 加載內(nèi)置的 fs 模塊
const fs = require(‘fs’)
// 2. 加載用戶的自定義模塊
const custom = require(’ ./custom.js’)
// 3. 加載第三方模塊
const moment = require(‘moment’)
2、內(nèi)置模塊
教程參見:
- 【W(wǎng)3Cschool】Node.js 官方文檔
- 【RUNOOB】Node.js
3、模塊作用域
在自定義模塊中定義的變量、方法等成員,只能在當(dāng)前模塊內(nèi)被訪問,這種模塊級別的訪問限制,叫做模塊作用域。
模塊作用域防止了全局變量污染的問題
4、module
在每個 .js 自定義模塊中都有一個 module 對象,它里面存儲了和當(dāng)前模塊有關(guān)的信息。
在自定義模塊中,可以使用 module.exports 對象,將模塊內(nèi)的成員共享出去,供外界使用。
外界用 require() 方法導(dǎo)入自定義模塊時,得到的就是 module.exports 所指向的對象。
使用 require() 方法導(dǎo)入模塊時,導(dǎo)入的結(jié)果,永遠(yuǎn)以 module.exports 指向的對象為準(zhǔn)。
由于 module.exports 單詞寫起來比較復(fù)雜,為了簡化向外共享成員的代碼,Node 提供了 exports 對象。默認(rèn)情況下,exports 和 module.exports 指向同一個對象。最終共享的結(jié)果,還是以 module.exports 指向的對象為準(zhǔn)。
為了防止混亂,建議不要在同一個模塊中同時使用 exports 和 module.exports
5、模塊的加載過程
- 優(yōu)先從緩沖中加載
模塊在第一次加載后會被緩存。 這也意味著多次調(diào)用 require() 不會導(dǎo)致模塊的代碼被執(zhí)行多次。
不論是內(nèi)置模塊、用戶自定義模塊、還是第三方模塊,它們都會優(yōu)先從緩存中加載,從而提高模塊的加載效率。 - 內(nèi)置模塊的加載機(jī)制
內(nèi)置模塊是由 Node.js 官方提供的模塊,內(nèi)置模塊的加載優(yōu)先級最高。
例如,require(‘fs’) 始終返回內(nèi)置的 fs 模塊,即使在 node_modules 目錄下有名字相同的包也叫做 fs。 - 自定義模塊的加載機(jī)制
使用 require() 加載自定義模塊時,必須指定以./
或../
開頭的路徑標(biāo)識符。在加載自定義模塊時,如果沒有指定./
或../
這樣的路徑標(biāo)識符,則 node 會把它當(dāng)作內(nèi)置模塊或第三方模塊進(jìn)行加載。
在使用 require() 導(dǎo)入自定義模塊時,如果省略了文件的擴(kuò)展名,則 Node.js 會按順序分別嘗試加載以下的文件:
① 按照確切的文件名進(jìn)行加載
② 補(bǔ)全 .js 擴(kuò)展名進(jìn)行加載
③ 補(bǔ)全 .json 擴(kuò)展名進(jìn)行加載
④ 補(bǔ)全 .node 擴(kuò)展名進(jìn)行加載
⑤ 加載失敗,終端報錯 - 第三方模塊的加載機(jī)制
如果傳遞給 require() 的模塊標(biāo)識符不是一個內(nèi)置模塊,也沒有以./
或../
開頭,則 Node.js 會從當(dāng)前模塊的父目錄開始,嘗試從 /node_modules 文件夾中加載第三方模塊。
如果沒有找到對應(yīng)的第三方模塊,則移動到再上一層父目錄中,進(jìn)行加載,直到文件系統(tǒng)的根目錄。
例如,假設(shè)在 ‘C:Usersitheimaproject oo.js’ 文件里調(diào)用了 require(‘tools’),則 Node.js 會按以下順序查找:
① C:Usersitheimaproject ode_modules ools
② C:Usersitheima ode_modules ools
③ C:Users ode_modules ools
④ C: ode_modules ools - 目錄作為模塊
當(dāng)把目錄作為模塊標(biāo)識符,傳遞給 require() 進(jìn)行加載的時候,有三種加載方式:
① 在被加載的目錄下查找一個叫做 package.json 的文件,并尋找 main 屬性,作為 require() 加載的入口
② 如果目錄里沒有 package.json 文件,或者 main 入口不存在或無法解析,則 Node.js 將會試圖加載目錄下的 index.js 文件。
③ 如果以上兩步都失敗了,則 Node.js 會在終端打印錯誤消息,報告模塊的缺失:Error: Cannot find module ‘xxx’
四、npm與包
1、包
Node.js 中的第三方模塊又叫做包。
不同于 Node.js 中的內(nèi)置模塊與自定義模塊,包是由第三方個人或團(tuán)隊開發(fā)出來的,免費供所有人使用。
由于 Node.js 的內(nèi)置模塊僅提供了一些底層的 API,導(dǎo)致在基于內(nèi)置模塊進(jìn)行項目開發(fā)的時,效率很低。包是基于內(nèi)置模塊封裝出來的,提供了更高級、更方便的 API,極大的提高了開發(fā)效率。
-
https://www.npmjs.com/ 網(wǎng)站上搜索自己所需要的包
-
https://registry.npmjs.org/ 服務(wù)器上下載自己需要的包
-
npm 用于從服務(wù)器下載包
一個規(guī)范的包,它的組成結(jié)構(gòu),必須符合以下 3 點要求:
- 包必須以單獨的目錄而存
- 在包的頂級目錄下要必須包含 package.json 這個包管理配置文件
- package.json 中必須包含 name,version,main 這三個屬性,分別代表包的名字、版本號、包的入口。
關(guān)于更多的約束參見:【包約束規(guī)范】
2、npm(Node Package Manager)
2.1 概述
npm 是隨著 Node.js 的安裝一塊安裝的包管理和分發(fā)工具。
npm 常見的場景:
- 允許用戶從 npm 服務(wù)器下載別人編寫的第三方包到本地使用。
- 允許用戶從 npm 服務(wù)器下載并安裝別人編寫的命令行程序到本地使用。
- 允許用戶將自己編寫的包或命令行程序上傳到 npm 服務(wù)器供別人使用。
npm 的背后,是基于 couchdb 的一個數(shù)據(jù)庫,詳細(xì)記錄了每個包的信息,包括作者、版本、依賴、授權(quán)信息等。它的一個很重要的作用就是:將開發(fā)者從繁瑣的包管理工作(版本、依賴等)中解放出來,更加專注于功能的開發(fā)。
npm 命令參見:npm 官方文檔
2.2 package.json
項目使用 npm 初始化命令(項目名需為英文):
npm init -y
該命令會在項目根目錄生成包管理配置文件 package.json
,用來記錄與項目有關(guān)的一些配置信息。
{"name": "code", // 項目名稱 "version": "1.0.0", // 項目版本號"description": "", // 項目描述"main": "index.js", // 包的入口文件"scripts": {} // 腳本"author": "", // 作者"keywords": [], // 關(guān)鍵字"license": "ISC", // 開源許可協(xié)議"devDependencies": {}, // 開發(fā)依賴包"dependencies": {} // 核心依賴包
}
dependencies & devDependencies
如果某些包只在項目開發(fā)階段會用到,在項目上線之后不會用到,則建議把這些包記錄到 devDependencies 節(jié)點中。
與之對應(yīng)的,如果某些包在開發(fā)和項目上線之后都需要用到,則建議把這些包記錄到 dependencies 節(jié)點中。
將包記錄到 devDependencies 節(jié)點中:
// 安裝指定的包,并記錄到 devDependencies 節(jié)點中 npm i 包名 -D//注意:上述命令是簡寫形式,等價于下面完整的寫法: npm install 包名 --save-dev
判斷一個包是否在項目上線后會不會用到:https://www.npmjs.com/包名#install
2.3 node_modules & package-lock.json
初次裝包完成后,在項目文件夾下多一個叫做 node_modules 的文件夾和 package-lock.json 的配置文件。
- node_modules 文件夾用來存放所有已安裝到項目中的包。require() 導(dǎo)入第三方包時,就是從這個目錄中查找并加載包。
- package-lock.json 配置文件用來記錄 node_modules 目錄下的每一個包的下載信息,例如包的名字、版本號、下載地址等。
程序員不要手動修改 node_modules 或 package-lock.json 文件中的任何代碼,npm 包管理工具會自動維護(hù)它們。
多個第三方包體積較大,在協(xié)作開發(fā)時,一般不將第三方包上傳至代碼倉庫。
即將 node_modulus 文件夾,添加到 .gitignore 忽略文件中。
當(dāng)我們拉代碼時,需執(zhí)行
npm install
來一次性安裝所有的包。npm install` 會先讀取 package.json 中的 dependencies 節(jié)點,讀取到新記錄的所有依賴包名稱和版本號之后,npm包管理工具把所有包安裝。
公司項目有的時候會有自己開發(fā)的包,這類包一般存放在公司自己建的鏡像倉庫,所以在執(zhí)行
npm install
前,需要修改鏡像。
2.4 切換鏡像源
由于在國內(nèi)上網(wǎng)環(huán)境影響,一些依賴包下載會很慢,甚至?xí)螺d失敗,所以就要使用到鏡像下載。
將npm默認(rèn)的registry修改為淘寶registry:
# 查看當(dāng)前使用的鏡像路徑
npm config get registry# 修改為淘寶鏡像
npm config set registry https://registry.npm.taobao.org/# 檢查是否修改成功
npm config get registry
鏡像源地址:
npm 官方原始鏡像網(wǎng)址是:https://registry.npmjs.org/
淘寶 NPM 鏡像:http://registry.npmmirror.com
阿里云 NPM 鏡像:https://npm.aliyun.com
騰訊云 NPM 鏡像:https://mirrors.cloud.tencent.com/npm/
華為云 NPM 鏡像:https://mirrors.huaweicloud.com/repository/npm/
網(wǎng)易 NPM 鏡像:https://mirrors.163.com/npm/
中國科學(xué)技術(shù)大學(xué)開源鏡像站:http://mirrors.ustc.edu.cn/
清華大學(xué)開源鏡像站:https://mirrors.tuna.tsinghua.edu.cn/
nrm:可以快速查看和切換下包的鏡像源
# 通過 npm 包管理器,將 nrm 安裝為全局可用的工具
npm i nrm -g# 查看所有可用的鏡像源
nrm ls# 將下包的鏡像源切換力 taobao 鏡像
nrm use taobao
使用淘寶 cnpm:
# 全局安裝基于淘寶源的cnpm:
npm install -g cnpm --registry=https://registry.npm.taobao.org# 檢測cnpm安裝是否成功
cnpm -v
2.5 項目包 & 全局包
- 項目包:那些被安裝到項目的 node_modules 目錄中的包,都是項目包
- 全局包:在執(zhí)行 npm install 命令時,如果提供了 -g 參數(shù),則會把包安裝為全局包。全局包安裝路徑:
- Windows:
C:Users用戶目錄AppDataRoaming pm ode_modules
- Mac:
- Windows:
只有工具性質(zhì)的包,才有全局安裝的必要性。因為它們提供了好用的終端命令。
判斷某個包是否需要全局安裝后才能使用,可以參考官方提供的使用說明即可。
推薦一些全局包:
- nrm:切換鏡像源
- i5ting_toc:把 md 文檔轉(zhuǎn)為 html 頁面
- nodemon:監(jiān)聽項目文件的變動,當(dāng)代碼被修改后,nodemon 會自動重啟項目
五、Express
1、Express 概述
Express 是基于 Node.js 平臺,快速、開放、極簡的 Web 開發(fā)框架。
Express 的作用和 Node.js 內(nèi)置的 http 模塊類似,是專門用來創(chuàng)建 Web 服務(wù)器的。
Express 就是一個 npm 上的第三方包,提供了快速創(chuàng)建 Web 服務(wù)器的便捷方法。
Express 框架核心特性:
- 可以設(shè)置中間件來響應(yīng) HTTP 請求。
- 定義了路由表用于執(zhí)行不同的 HTTP 請求動作。
- 可以通過向模板傳遞參數(shù)來動態(tài)渲染 HTML 頁面。
2、Express 基本使用
- Express 快速入門
十、資料
- 【b站 黑馬】Node.js 教程