一、包管理配置文件
1.package.json 包管理配置文件
npm 規(guī)定,在項目根目錄中,必須提供一個叫做 package.json 的包管理配置文件。用來記錄與項目有關的一些配置信息。例如:
- 項目的名稱、版本號、描述等
- 項目中都用到了哪些包
- 哪些包只在開發(fā)期間會用到
- 那些包在開發(fā)和部署時都需要用到
2. 多人開發(fā)問題
由于包的體積過大,不方便上傳到gitHub遠程倉庫耘婚。
今后在項目開發(fā)中,一定要把 node_modules 文件夾陆赋,添加到 .gitignore 忽略文件中沐祷。
3. 快速創(chuàng)建 package.json
npm init -y
① 上述命令只能在英文的目錄下成功運行!所以攒岛,項目文件夾的名稱一定要使用英文命名赖临,不要使用中文,不能出現(xiàn)空格灾锯。
② 運行 npm install 命令安裝包的時候兢榨,npm 包管理工具會自動把包的名稱和版本號,記錄到 package.json 中顺饮。不要手動修改吵聪。
4. 一次性安裝所有依賴包
如果項目還沒有node_modules文件夾,必須先下載項目中所有要用到的包兼雄。
系統(tǒng)會根據(jù)package.json文件中的dependencies節(jié)點下載所有包吟逝。
npm install
5. 刪除包
npm uninstall 完整包名
6. dependencies 節(jié)點
① package.json文件中有一個dependencies節(jié)點屬性,專門用來記錄項目中使用npm install命令安裝了哪些包赦肋。
② 安裝的包的信息會默認記錄到這個節(jié)點中块攒。
③ 這個節(jié)點中記錄的包在開發(fā)時和上線后都會用到。
7. devDependencies 節(jié)點
① 如果某些包只在項目開發(fā)階段會用到佃乘,在項目上線之后不會用到囱井,則建議把這些包記錄到 devDependencies 節(jié)點中。
② 下載包時用下面的命令趣避,系統(tǒng)機會將包的信息記錄到devDependencies 節(jié)點中琅绅。
npm install 完整包名 --save-dev
或者簡寫成:npm install 完整包名 -D
總結
①項目首次安裝 包 時會自動添加node_module文件夾和package.json包管理配置文件。
②一個用來存放包鹅巍,一個用來記錄包。
③node_module文件夾太大料祠,多人開發(fā)時不要上傳到云端骆捧,而是添加到忽略文件中。
④項目根目錄中必須有package.json文件髓绽,系統(tǒng)會根據(jù)這個文件下載所有依賴的包敛苇。
⑤多人開發(fā)時,拿到?jīng)]有node_module的項目,首先將項目中所有依賴的包下載到項目中枫攀。
二括饶、解決下包慢的問題
1. 切換npm的下包 鏡像源(服務器地址)
查看當前的下包鏡像源:
npm config get registry
設置為淘寶鏡像:
npm config set registry https://registry.npm.taobao.org
2. 安裝與使用nrm工具 切換鏡像源
安裝nrm工具:
npm install nrm -g
查看可用鏡像列表:
nrm ls
設置需要的鏡像源:
nrm use taobao
-
注意:如果出現(xiàn)下面的問題
捕獲.PNG
找到cli.js文件,將第17行代碼替換為:
const NRMRC = path.join(process.env[(process.platform == 'win32') ? 'USERPROFILE' : 'HOME'], '.nrmrc');
3.nvm的安裝與使用:
https://juejin.cn/post/7011398696999288839
如果有依賴版本與node不兼容来涨,可以嘗試:npm update 图焰, npm rebuild xxx依賴
三、 包的分類
1. 項目包
(1)那些被安裝到項目的 node_modules 目錄中的包蹦掐,都是項目包技羔。
(2)項目包又分為兩類,分別是:
- 開發(fā)依賴包(被記錄到 devDependencies 節(jié)點中的包卧抗,只在開發(fā)期間會用到)
- 核心依賴包(被記錄到 dependencies 節(jié)點中的包藤滥,在開發(fā)期間和項目上線之后都會用到)
2. 全局包
(1)在執(zhí)行 npm install 命令時,如果提供了-g 參數(shù)社裆,則會把包安裝為全局包拙绊。
(2)全局包會被安裝到 C:\Users\用戶目錄\AppData\Roaming\npm\node_modules 目錄下。
安裝全局包:npm i 包名 -g
卸載全局包:npm uninstall 包名 -g
注意:
① 只有工具性質的包泳秀,才有全局安裝的必要性标沪。因為它們提供了好用的終端命令。
② 判斷某個包是否需要全局安裝后才能使用晶默,可以參考官方提供的使用說明谨娜。
四、 安裝與使用 i5ting_toc工具
i5ting_toc 是一個可以把 md 文檔轉為 html 頁面的小工具磺陡。
(1)全局安裝i5ting_toc:
npm install i5ting_toc -g
(2)將md文件轉換成html文件:
i5ting_toc -f 要轉換的md文件路徑 -o
注意:在終端里趴梢,從C盤目錄切換到E盤目錄,直接 " E:"币他。
五坞靶、開發(fā)自己的包
1. 規(guī)范的包結構
① 包必須以單獨的目錄而存在。
② 包的頂級目錄下要必須包含 package.json 這個包管理配置文件蝴悉。
③ package.json 中必須包含 name彰阴,version,main 這三個屬性拍冠,分別代表包的名字尿这、版本號、包的入口庆杜。
2. 初始化包的基本結構
① 新建 lisaifei-tools 文件夾射众,作為包的根目錄。( 全英文晃财,不能有空格 )
② 在lisaifei-tools 文件夾中叨橱,新建如下三個文件:
- package.json (包管理配置文件)
- index.js (包的入口文件)
- README.md (包的說明文檔)
3. 初始化 package.json
{
"name": "lisaifei-tools",
"version": "1.0.0",
"main": "index.js",
"description": "提供了格式化時間、HTMLEscape等功能",
"keywords": ["lisaifei","dateFormate","escape"],
"license": "ISC"
}
注意:package.json文件里的name屬性值才是包真正的名字,與文件夾的名字無關罗洗。
4. 各個功能代碼的編寫
①在根目錄下新建src文件夾愉舔,在src文件夾內存放實現(xiàn)具體功能的js文件。
②在入口文件index.js中導入各個js文件伙菜,并將js文件里的各個方法對外共享轩缤。
5. 安裝說明
六、發(fā)布包
(1)登錄https://www.npmjs.com/網(wǎng)站仇让,注冊賬號典奉。
(2)在終端里登錄賬號。
首先丧叽,把下載包的服務器地址更改為npm官方地址卫玖。再登錄:
npm login
(3)發(fā)布包。
首先踊淳,把終端目錄切換到包的根目錄假瞬。再發(fā)布:
npm publish
(4)刪除包
npm unpublish 包名 --force
注意:
① npm unpublish 命令只能刪除 72 小時以內發(fā)布的包
② npm unpublish 刪除的包,在 24 小時內不允許重復發(fā)布
七迂尝、模塊的加載機制
1. 優(yōu)先從緩存中加載
模塊在第一次加載后會被緩存脱茉。 這也意味著多次調用 require() 不會導致模塊的代碼被執(zhí)行多次。
注意:不論是內置模塊垄开、用戶自定義模塊琴许、還是第三方模塊,它們都會優(yōu)先從緩存中加載溉躲,從而提高模塊的加載效率榜田。
2. 內置模塊的加載機制
內置模塊是由 Node.js 官方提供的模塊,內置模塊的加載優(yōu)先級最高锻梳。
例如箭券,require('fs') 始終返回內置的 fs 模塊,即使在 node_modules 目錄下有名字相同的包也叫做 fs
3. 自定義模塊的加載機制
使用 require() 加載自定義模塊時疑枯,必須指定以 ./ 或 ../ 開頭的相對路徑辩块。否則,node 會把它當作內置模塊或第三方模塊進行加載荆永。
在使用 require() 導入自定義模塊時废亭,如果省略了文件的擴展名,則 Node.js 會按順序分別嘗試加載以下的文件:
① 按照確切的文件名進行加載
② 補全 .js 擴展名進行加載
③ 補全 .json 擴展名進行加載
④ 補全 .node 擴展名進行加載
⑤ 加載失敗具钥,終端報錯
4. 第三方模塊的加載機制
如果傳遞給 require() 的模塊標識符不是一個內置模塊豆村,也沒有以 ‘./’ 或 ‘../’ 開頭,則 Node.js 會從當前文件的父目錄開始氓拼,嘗試從 /node_modules 文件夾中加載第三方模塊。
如果沒有找到對應的第三方模塊,則移動到再上一層父目錄中桃漾,進行加載坏匪,直到文件系統(tǒng)的根目錄。
例如撬统,假設在 'C:\Users\itheima\project\foo.js' 文件里調用了 require('tools')适滓,則 Node.js 會按以下順序查找:
① C:\Users\itheima\project\node_modules\tools
② C:\Users\itheima\node_modules\tools
③ C:\Users\node_modules\tools
④ C:\node_modules\tools
5. 目錄作為模塊被導入加載
當把目錄作為模塊標識符,傳遞給 require() 進行加載的時候恋追,有三種加載方式:
① 在被加載的目錄下查找一個叫做 package.json 的文件凭迹,并尋找main 屬性,作為 require() 加載的入口
② 如果目錄里沒有 package.json 文件苦囱,或者 main 入口不存在或無法解析嗅绸,則 Node.js 將會試圖加載目錄下的 index.js 文件。
③ 如果以上兩步都失敗了撕彤,則 Node.js 會在終端打印錯誤消息鱼鸠,報告模塊的缺失:Error: Cannot find module 'xxx‘
八、express包
1. 什么是express包
(1)express就是npm 上的第三方包羹铅,作用和 Node.js 內置的 http 模塊類似蚀狰,是專門用來創(chuàng)建Web 服務器的。(或API接口服務器)
(2)http 內置模塊與 Express 的關系類似于瀏覽器中 Web API 和 jQuery 职员,后者是基于前者進一步封裝出來的麻蹋。
Express 的中文官網(wǎng): http://www.expressjs.com.cn/
2. express包的基本使用
(1)在項目目錄的終端下載express包
npm i express@版本號
(2) 創(chuàng)建基本的 Web 服務器
const express = require(' express ' ) //導入express包
const app = express( ) //創(chuàng)建服務器,app是服務器名稱
app.listen( 端口號焊切,啟動成功后的回調函數(shù) ) //調用listen方法啟動服務器
(3)監(jiān)聽客戶端的get( )請求和post( )請求
app.get( ' 客戶端輸入的URL地址 ' 扮授,(req,res)=>{ res.send( "請求成功" ) } )
①回調函數(shù)中req參數(shù)是請求對象蛛蒙,包含了與請求相關的屬性和方法糙箍。
②回調函數(shù)中res參數(shù)是響應對象,包含了與響應相關的屬性和方法牵祟。
③回調函數(shù)中res.send( )方法可以把JSON對象或是文本字符串響應給客戶端深夯。
(4)獲取 URL 中攜帶的查詢參數(shù)
res.send( req.query )
① req.query 對象默認是一個空對象。
②它可以保存客戶端通過查詢字符串的形式發(fā)送到服務器的參數(shù)诺苹。?name=吳磊&age=22
(5)獲取 URL 中的動態(tài)參數(shù)
app.get('/user/:id/:name', (req, res) => {
res.send(req.params);
});
①req.params默認是一個空對象咕晋。
②它可以保存客戶端動態(tài)拼接的參數(shù)。
// 1.導入express模塊
const express = require('express');
// 2.創(chuàng)建web服務器
const app = express();
// 4.監(jiān)聽用戶發(fā)起的get請求和post請求
app.get('/user', (req, res) => {
// 使用express的res.send方法向客戶端響應JSON對象
res.send({ name: '吳磊', age: '21' });
});
app.post('/user', (req, res) => {
// 使用express的res.send方法向客戶端響應文本
res.send('請求成功收奔!');
});
// 3.調用app.listen(端口號掌呜,啟動成功后的回調函數(shù)),啟動服務器
app.listen(80, () => {
console.log('express server running at http://127.0.0.1');
});
// 5.獲取URL中攜帶的查詢參數(shù)
app.get('/', (req, res) => {
// express中的req.query默認是一個空對象∑汉澹可以訪問到客戶端發(fā)送的 ?name=吳磊&age=20 查詢字符串
res.send(req.query);
});
// 6.獲取URL中的動態(tài)參數(shù)
app.get('/user/:id/:name', (req, res) => {
// express中的req.params默認是一個空對象质蕉∈拼郏可以存儲客戶端動態(tài)拼接的參數(shù)
res.send(req.params);
});
九、 托管靜態(tài)資源
express.static()方法可以創(chuàng)建一個靜態(tài)資源服務器模暗。
app.use( ' 前綴名 '禁悠,express.static(' 文件夾名 '))
①上面代碼可以將指定文件夾里的內容對外開放訪問。
②前綴名一般定義為文件夾名兑宇,這樣客戶端輸入URL地址時必須添加前綴名才能訪問碍侦。
③如果不加自定義的前綴名,客戶端輸入URL地址時不能寫被托管的這個文件夾名隶糕。
④如果要托管多個靜態(tài)資源目錄瓷产,就多次調用express.static() 函數(shù)。
⑤訪問靜態(tài)資源文件時枚驻,express.static() 函數(shù)會根據(jù)目錄的添加順序查找所需的文件濒旦。
十、安裝nodemon插件
npm install -g nodemon
nodemon能夠監(jiān)聽項目文件的變動测秸,當代碼被修改后疤估,nodemon會自動幫我們重啟項目,極大方便了開發(fā)和調試霎冯。
啟動項目時铃拇,將node 命令替換為nodemon 命令。
nodemon 文件名