2021-05-16Node.js第三天

一、包管理配置文件

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文件。


捕獲.PNG

②在入口文件index.js中導入各個js文件伙菜,并將js文件里的各個方法對外共享轩缤。

捕獲.PNG

5. 安裝說明
捕獲.PNG

六、發(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ù)

捕獲.PNG

// 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 文件名

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末沈撞,一起剝皮案震驚了整個濱河市慷荔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌缠俺,老刑警劉巖显晶,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異壹士,居然都是意外死亡磷雇,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門躏救,熙熙樓的掌柜王于貴愁眉苦臉地迎上來唯笙,“玉大人,你說我怎么就攤上這事盒使”谰颍” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵少办,是天一觀的道長苞慢。 經(jīng)常有香客問我,道長英妓,這世上最難降的妖魔是什么挽放? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任绍赛,我火速辦了婚禮,結果婚禮上辑畦,老公的妹妹穿的比我還像新娘惹资。我一直安慰自己,他們只是感情好航闺,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著猴誊,像睡著了一般潦刃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上懈叹,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天乖杠,我揣著相機與錄音,去河邊找鬼澄成。 笑死胧洒,一個胖子當著我的面吹牛,可吹牛的內容都是我干的墨状。 我是一名探鬼主播卫漫,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼肾砂!你這毒婦竟也來了列赎?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤镐确,失蹤者是張志新(化名)和其女友劉穎包吝,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體源葫,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡诗越,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了息堂。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嚷狞。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖储矩,靈堂內的尸體忽然破棺而出感耙,到底是詐尸還是另有隱情,我是刑警寧澤持隧,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布即硼,位于F島的核電站,受9級特大地震影響屡拨,放射性物質發(fā)生泄漏只酥。R本人自食惡果不足惜褥实,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望裂允。 院中可真熱鬧损离,春花似錦、人聲如沸绝编。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽十饥。三九已至窟勃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間逗堵,已是汗流浹背秉氧。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蜒秤,地道東北人汁咏。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像作媚,于是被迫代替她去往敵國和親攘滩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內容

  • 個人入門學習用筆記纸泡、不過多作為參考依據(jù)轰驳。如有錯誤歡迎斧正 目錄 簡書好像不支持錨點、復制搜索(反正也是寫給我自己看...
    kirito_song閱讀 2,479評論 1 37
  • NODE.JS 什么是node.js弟灼? Node.js? is a JavaScript runtime(運行時级解、...
    渣一窩閱讀 504評論 0 1
  • 寫在前面 總是喜歡自己造輪子, 自己造的輪子又不如已有的輪子好, 然后就半途而廢了. 現(xiàn)在想起來, 還是沒有到自己...
    dinfer閱讀 749評論 0 1
  • 1.什么是Node.js 1.1Node.js是一款基于“V8引擎”的javaScript運行環(huán)境 V8引擎:V8...
    秋風_ca42閱讀 227評論 0 1
  • Node.js的介紹 什么是 Node.js(官方解釋) Node.js 是一個基于 Chrome V8 引擎的 ...
    zhmbo閱讀 743評論 0 3