日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Node.js 从门详解 (二)

發(fā)布時(shí)間:2024/9/27 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Node.js 从门详解 (二) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

  • 1. 模塊化的基本概念
    • 1.1 什么是模塊化
    • 1.2 模塊化規(guī)范
  • 2. Node.js 中模塊化
    • 2.1 Node.js 中模塊的分類
    • 2.2 加載模塊
    • 2.3 Node.js中的模塊作用域
      • 2.3.1 什么是模塊作用域
      • 2.3.2 模塊作用域的好處
    • 2.4 對(duì)外共享模塊作用域中的成員
      • 2.4.1 module對(duì)象
      • 2.4.2 module.exports對(duì)象
      • 2.4.3 共享成員時(shí)的注意點(diǎn)
      • 2.4.4 exports 對(duì)象
      • 2.4.5 exports 和 module.exports 的使用誤區(qū)
    • 2.5 Node.js 中的模塊化規(guī)范
  • 3. npm與包
    • 3.1 包
      • 3.1.1 什么是包
      • 3.1.2 包的來源
      • 3.1.3 為什么需要包
      • 3.1.4 從哪里下載包
      • 3.1.5 如何下載包
    • 3.2 npm初體驗(yàn)
      • 3.2.1 格式化時(shí)間的傳統(tǒng)做法
      • 3.2.2 格式化時(shí)間的高級(jí)做法(npm)
      • 3.2.3 安裝npm包的命令
      • 3.2.4 初次裝包后多了哪些文件
      • 3.2.5 安裝指定版本的包
      • 3.2.6 包的語義化版本規(guī)范
    • 3.3 包管理配置文件
      • 3.3.1 多人協(xié)作的問題
      • 3.3.2 如何記錄項(xiàng)目中安裝了哪些包
      • 3.3.3 快速創(chuàng)建 package.json
      • 3.3.4 dependencies 節(jié)點(diǎn)
      • 3.3.5 一次性安裝所有的包
      • 3.3.6 卸載包
      • 3.3.7 devDependencies 節(jié)點(diǎn)
    • 3.4 解決下包速度慢的問題
      • 3.4.1為什么下包速度慢
      • 3.4.2 淘寶 NPM 鏡像服務(wù)器
      • 3.4.3 切換 npm 的下包鏡像源
      • 3.4.4 nrm 工具安裝及安裝出錯(cuò)的處理
    • 3.5 包的分類
      • 3.5.1 項(xiàng)目包
      • 3.5.2 全局包
      • 3.5.3 md文檔轉(zhuǎn)html工具 i5ting_toc
    • 3.6 規(guī)范的包結(jié)構(gòu)
    • 3.7 開發(fā)屬于自己的包
      • 3.7.1 功能需求
      • 3.7.2 初始化包的基本結(jié)構(gòu)
      • 3.7.3 初始化 package.json
      • 3.7.4 在 index.js 中定義格式化時(shí)間的方法
      • 3.7.5 在 index.js 中定義轉(zhuǎn)義 HTML 的方法
      • 3.7.6 在 index.js 中定義還原 HTML 的方法
      • 3.7.7 將不同的功能進(jìn)行模塊化拆分
      • 3.7.8 編寫包的說明文檔
    • 3.8 發(fā)布包
      • 3.8.1.注冊(cè) npm 賬號(hào)
      • 3.8.2 登錄npm帳號(hào)
      • 3.8.3 把包發(fā)布到 npm 上
      • 3.8.4 刪除已發(fā)布的包
  • 4. 模塊加載機(jī)制
    • 4.1 優(yōu)先從緩存中加載
    • 4.2 內(nèi)置模塊的加載機(jī)制
    • 4.3自定義模塊的加載機(jī)制
    • 4.4 第三方模塊的加載機(jī)制
    • 4.5 目錄作為模塊



1. 模塊化的基本概念


1.1 什么是模塊化

模塊化是指解決一個(gè)復(fù)雜問題時(shí),自頂向下逐層把系統(tǒng)劃分成若干模塊的過程。對(duì)于整個(gè)系統(tǒng)來說,模塊是可組合、分解和更換的單元

編程領(lǐng)域中的模塊化,就是遵守固定的規(guī)則,把一個(gè)大文件拆成獨(dú)立并互相依賴多個(gè)小模塊

把代碼進(jìn)行模塊化拆分的好處:

  • 提高了代碼的復(fù)用性
  • 提高了代碼的可維護(hù)性
  • 可以實(shí)現(xiàn)按需加載
  • 1.2 模塊化規(guī)范

    模塊化規(guī)范就是對(duì)代碼進(jìn)行模塊化的拆分與組合時(shí),需要遵守的哪些規(guī)則。

    例如:

    • 使用什么樣的語法格式來引用模塊
    • 在模塊中使用什么樣的語法格式向外暴露成員

    模塊化規(guī)范的好處
    大家都遵守同樣的模塊化規(guī)范寫代碼,降低了溝通的成本,極大方便了各個(gè)模塊之間的相互調(diào)用
    利人利己。


    2. Node.js 中模塊化


    2.1 Node.js 中模塊的分類

    Node.js中根據(jù)模塊來源的不同,將模塊分為了 3 大類,分別是:

    • 內(nèi)置模塊 (內(nèi)置模塊是由 Node.js 官方提供的,例如 fs 、 path 、 http 等);
    • 自定義模塊(用戶創(chuàng)建的每個(gè) .js 文件,都是自定義模塊);
    • 第三方模塊由第三方開發(fā)出來的模塊,并非官方提供的內(nèi)置模塊,也不是用戶創(chuàng)建的自定義模塊使用前需要先下載

    2.2 加載模塊

    使用強(qiáng)大的require()方法,可以加載需要的內(nèi)置模塊 、 用戶自定義模塊 、 第三方模塊 進(jìn)行使用

    例如:

    // 1.加載內(nèi)置的 fs 模塊 const fs = require('fs')// 2.加載用戶的自定義模塊 const custom = require('./custom.js')// 3.加載第三方模塊(關(guān)于第三方模塊的下載和使用,會(huì)在后面的課程中進(jìn)行專門的講解) const moment = require('moment')

    以上可見,加載第三方模塊與加載內(nèi)置模塊是相同的,而自定義模塊則稍有不同。


    ?? 注意

    使用 require() 方法加載其它模塊時(shí),會(huì)同時(shí)執(zhí)行被加載模塊中的代碼。



    2.3 Node.js中的模塊作用域


    2.3.1 什么是模塊作用域

    函數(shù)作用域類似,在自定義模塊中定義的變量 、 方法等成員,只能在當(dāng)前模塊內(nèi)被訪問,這種模塊級(jí)別的訪問限制,叫做模塊作用域


    如上圖,在左側(cè)的模塊中,無法訪問到右側(cè)模塊中的私有成員。

    2.3.2 模塊作用域的好處

    防止了全局變量污染的問題



    2.4 對(duì)外共享模塊作用域中的成員

    2.4.1 module對(duì)象

    在每個(gè).js 自定義模塊中都有一個(gè) module 對(duì)象,它里面存儲(chǔ)了和當(dāng)前模塊有關(guān)的信息,打印如下:



    2.4.2 module.exports對(duì)象

    在自定義模塊中,可以使用 module.exports 對(duì)象,將模塊內(nèi)的成員共享出去,供外界使用。

    外界用 require() 方法導(dǎo)入自定義模塊時(shí),得到的就是 module.exports 所指向的對(duì)象。

    2.4.3 共享成員時(shí)的注意點(diǎn)

    使用require()方法導(dǎo)入模塊時(shí),導(dǎo)入的結(jié)果, 永遠(yuǎn)以 module.exports 指向的對(duì)象為準(zhǔn) 。



    2.4.4 exports 對(duì)象

    由于 module.exports 單詞寫起來比較復(fù)雜,為了簡化向外共享成員的代碼, Node 提供了 exports 對(duì)象。 默認(rèn)情況下 exports 和 module.exports 指向同一個(gè)對(duì)象 。最終共享的結(jié)果,還是 以 module.exports 指向的對(duì)象為準(zhǔn)

    2.4.5 exports 和 module.exports 的使用誤區(qū)

    時(shí)刻謹(jǐn)記,require() 導(dǎo)入模塊時(shí),得到的永遠(yuǎn)是 module.exports 指向的對(duì)象:


    注意:為了防止混亂,建議不要在同一個(gè)模塊中同時(shí)使用 exportsmodule.exports

    2.5 Node.js 中的模塊化規(guī)范

    Node.js 遵循了 CommonJS 模塊化規(guī)范,CommonJS 規(guī)定了 模塊的特性各模塊之間如何相互依賴

    CommonJS規(guī)定:

  • 每個(gè)模塊內(nèi)部, module 變量 代表當(dāng)前模塊;
  • module 變量是一個(gè)對(duì)象,它的 exports 屬性(即 module.exports)是對(duì)外的接口 ;
  • 加載某個(gè)模塊,其實(shí)是加載該模塊的 module.exports 屬性。 require() 方法用于加載模塊


  • 3. npm與包

    3.1 包

    3.1.1 什么是包

    Node.js 中的 第三方模塊 又叫做
    就像 電腦計(jì)算機(jī) 通常指的是相同的東西,第三方模塊 指的是同一個(gè)概念,只不過叫法不同。

    3.1.2 包的來源

    不同于 Node.js 中的內(nèi)置模塊與自定義模塊, 包是由第三方個(gè)人或團(tuán)隊(duì)開發(fā)出來的 ,免費(fèi)供所有人使用。


    🔔

    Node.js 中的包都是免費(fèi)且開源的,不需要付費(fèi)即可免費(fèi)下載使用。

    3.1.3 為什么需要包

    由于 Node.js 的內(nèi)置模塊僅提供了一些底層的 API ,導(dǎo)致在基于內(nèi)置模塊進(jìn)行項(xiàng)目開發(fā)時(shí),效率很低。

    包是基于內(nèi)置模塊封裝出來的,提供了更高級(jí)、更方便的 API極大的提高了開發(fā)效率

    內(nèi)置模塊 之間的關(guān)系,類似于 jQuery瀏覽器內(nèi)置 API 之間的關(guān)系。


    3.1.4 從哪里下載包

    國外有一家 IT 公司,叫做 npm, Inc. 這家公司旗下有一個(gè)非常著名的網(wǎng)站:https://www.npmjs.com/,它是 全球最大的包共享平臺(tái) ,你可以從這個(gè)網(wǎng)站上搜索到任何你需要的包,只要你有足夠的耐心;

    到目前位置,全球約 1100 多萬 的開發(fā)人員,通過這個(gè)包共享平臺(tái),開發(fā)并共享了超過 120 多萬個(gè)包 供我們使用。

    npm, Inc.公司 提供了一個(gè)地址為 https://registry.npmjs.org/ 的服務(wù)器,來對(duì)外共享所有的包,我們可以從這個(gè)服務(wù)器上下載自己所需要的包。


    🔔 注意:

    • https://www.npmjs.com/ (網(wǎng)站):用于搜索自己所需要的包
    • https://registry.npmjs.org/ (服務(wù)器):用于下載自己需要的包


    3.1.5 如何下載包

    npm, Inc.公司 提供了一個(gè)包管理工具,我們可以使用這個(gè)包管理工具,從 https://registry.npmjs.org/ 服務(wù)器把需要的包下載到本地使用。

    這個(gè)包管理工具的名字叫做 Node Package Manager (簡稱 npm包管理工具 ),這個(gè)包管理工具隨著 Node.js 的安裝包一起被安裝到了用戶的電腦上。

    我們可以在終端中執(zhí)行 npm -v 命令,來查看自己電腦上已安裝的 npm 包管理工具的版本號(hào):



    3.2 npm初體驗(yàn)

    3.2.1 格式化時(shí)間的傳統(tǒng)做法

    1)思路:

  • 創(chuàng)建格式化時(shí)間的自定義模塊;
  • 定義格式化時(shí)間的方法;
  • 創(chuàng)建補(bǔ)零函數(shù);
  • 從自定義模塊中導(dǎo)出格式化時(shí)間的函數(shù);
  • 導(dǎo)入格式化時(shí)間的自定義模塊;
  • 調(diào)用格式化時(shí)間的函數(shù)
  • 2)代碼

    // 1. 定義格式化時(shí)間的方法 function dateFormat(dtStr) {const dt = new Date(dtStr)const y = dt.getFullYear()const m = padZero(dt.getMonth() + 1)const d = padZero(dt.getDate())const hh = padZero(dt.getHours())const mm = padZero(dt.getMinutes())const ss = padZero(dt.getSeconds())return `${y}-${m}-${d} ${hh}:${mm}:${ss}` }// 定義補(bǔ)零函數(shù) function padZero(n) {return n > 9 ? n : '0' + n }// 導(dǎo)出將要格式化時(shí)間的函數(shù) module.exports = {dateFormat } // 導(dǎo)入自定義的格式化時(shí)間的模塊 const TIME = require('./15.dateFormat')// 調(diào)用方法,進(jìn)行時(shí)間的格式化 const dt = new Date() // console.log(dt) const newDT = TIME.dateFormat(dt) console.log(newDT)

    3.2.2 格式化時(shí)間的高級(jí)做法(npm)

  • 使用 npm 包管理工具,在項(xiàng)目中安裝格式化時(shí)間的包 moment
  • 使用 require() 導(dǎo)入格式化時(shí)間的包;
  • 參考 moment 的官方 API文檔 對(duì)時(shí)間進(jìn)行格式化。
  • 1)項(xiàng)目中安裝格式化時(shí)間包:

    npm install moment

    2)導(dǎo)入和使用包:

    // 1. 導(dǎo)入需要的包 const moment = require('moment') // 注:導(dǎo)入的名稱,就是裝包時(shí)的名稱const dt = moment().format('YYYY-MM-DD HH:mm:ss') console.log(dt) //輸出 2020-09-26 17:08:48

    🔔 對(duì)比 以上3.2.1 和 3.2.2兩種方式,npm包的 效率 和 便利性 顯而易見!


    3.2.3 安裝npm包的命令

    如果想在項(xiàng)目中安裝指定名稱的包,需要運(yùn)行如下的命令:

    npm install 包的完整名稱

    上述的裝包命令,可以簡寫成如下格式:

    npm i 包的完整名稱

    3.2.4 初次裝包后多了哪些文件

    初次裝包完成后,在項(xiàng)目文件夾下多一個(gè)叫做 node_modules 的文件夾和 package lock.json 的配置文件。

    其中:

    node_modules 文件夾 用來 存放所有已安裝到項(xiàng)目中的包 。 require() 導(dǎo)入第三方包時(shí),就是從這個(gè)目錄中查找并加載包。

    package lock.json 配置文件 用來 記錄 node_modules 目錄下的每一個(gè)包的下載信息 ,例如包的名字、版本號(hào)、下載地址等。


    ?? 注意:我們不要去手動(dòng)修改 node_modulespackage lock.json 文件中的任何代碼, npm 包管理工具會(huì)自動(dòng)維護(hù)它們。


    3.2.5 安裝指定版本的包

    默認(rèn)情況下,使用 npm install 命令安裝包的時(shí)候, 會(huì)自動(dòng)安裝最新版本的包 。如果需要安裝指定版本的包,可以在包名之后,通過 @ + 版本號(hào) 指定具體的版本,例如:

    npm i moment@2.23.1

    3.2.6 包的語義化版本規(guī)范

    包的版本號(hào)是以 “點(diǎn)分十進(jìn)制” 形式進(jìn)行定義的,總共有三位數(shù)字,例如 2.24.0

    其中每一位數(shù)字所代表的的含義如下:

    • 1 段數(shù)字: 大版本
    • 2 段數(shù)字: 功能版本
    • 3 段數(shù)字: Bug 修復(fù)版本

    版本號(hào)提升的規(guī)則:只要前面的版本號(hào)增長了,則后面的版本號(hào) 歸零



    3.3 包管理配置文件

    npm規(guī)定,在 項(xiàng)目根目錄 中, 必須 提供一個(gè)叫做 package.json 的包管理配置文件。用來記錄與項(xiàng)目有關(guān)的一些配置信息。例如:

    • 項(xiàng)目的名稱、版本號(hào)、描述等;
    • 項(xiàng)目中都用到了哪些包;
    • 哪些包只在 開發(fā)期間 會(huì)用到;
    • 那些包在 開發(fā)部署 時(shí)都需要用到。

    3.3.1 多人協(xié)作的問題


    整個(gè)項(xiàng)目的體積是 30.4M

    第三方包的體積是 28.8M

    項(xiàng)目源代碼的體積 1.6M


    🔔 遇到的問題:

    第三方包的體積過大 ,不方便團(tuán)隊(duì)成員之間共享項(xiàng)目源代碼。


    解決方案:

    共享時(shí)剔除 node_modules(??在項(xiàng)目開發(fā)中,把 node_modules 文件夾添加到 gitignore 忽略文件中)。



    3.3.2 如何記錄項(xiàng)目中安裝了哪些包

    項(xiàng)目根目錄 中,創(chuàng)建一個(gè)叫做 package.json 的配置文件,即可用來記錄項(xiàng)目中安裝了哪些包。從而方便在剔除 node_modules 目錄之后,在團(tuán)隊(duì)成員之間共享項(xiàng)目的源代碼。

    3.3.3 快速創(chuàng)建 package.json

    npm 包管理工具提供了一個(gè) 快捷命令 ,可以在執(zhí)行命令時(shí)所處的目錄中 ,快速創(chuàng)建 package.json 這個(gè)包管理配置文件:

    // 作用:在執(zhí)行命令所處的目錄中,快速新建 package.json 文件 npm init -y

    ??注意:

  • 上述命令 只能在英文的目錄下成功運(yùn)行 !所以,項(xiàng)目文件夾的名稱一定要使用英文命名不能使用中文,不能出現(xiàn)空格
  • 運(yùn)行 npm install 命令安裝包的時(shí)候, npm 包管理工具會(huì)自動(dòng)把 包的名稱版本號(hào) ,記錄到 package.json 中。

  • 3.3.4 dependencies 節(jié)點(diǎn)


    package.json 文件中,有一個(gè) dependencies 節(jié)點(diǎn),專門用來記錄您使用 npm install 命令安裝了哪些包。

    3.3.5 一次性安裝所有的包

    可以運(yùn)行 npm install 命令(或 npm i )一次性安裝所有的依賴包。

    npm install

    執(zhí)行npm install 命令時(shí),npm 包管理工具會(huì)讀取 package.json 中的 dependencies 節(jié)點(diǎn),讀取到記錄的所有依賴包名稱和版本號(hào)之后,npm 包管理工具會(huì)把這些包一次性下載到項(xiàng)目中。

    3.3.6 卸載包

    可以運(yùn)行 npm uninstall 命令,來卸載指定的包,如:

    npm uninstall moment

    格式為: npm uninstall 具體的包名 (卸載包命令沒有簡寫)


    ??注意:

    npm uninstall 命令執(zhí)行成功后,會(huì)把與所卸載的包的相關(guān)信息,自動(dòng)從 package.json 這個(gè)配置文件中的 dependencies 對(duì)象中移除掉。

    3.3.7 devDependencies 節(jié)點(diǎn)

    如果某些包 只在項(xiàng)目開發(fā)階段 會(huì)用到,在 項(xiàng)目上線之后不會(huì)用到 ,則建議把這些包記錄到 devDependencies 節(jié)點(diǎn)中。

    與之對(duì)應(yīng)的,如果某些包在 開發(fā)項(xiàng)目上線之后 都需要用到,則建議把這些包記錄到 dependencies 節(jié)點(diǎn)中。

    我們可以使用如下的命令,將包記錄到 devDependencies 節(jié)點(diǎn)中:

    // 安裝指定的包,并記錄到 devDependencies 節(jié)點(diǎn)中 npm i 包名 -D// 注意:上述命令是簡寫形式,等價(jià)于下面完整的寫法 npm install 包名 --save-dev

    3.4 解決下包速度慢的問題

    3.4.1為什么下包速度慢

    在使用 npm 下包的時(shí)候,默認(rèn)從國外的 https://registry.npmjs.org/ 服務(wù)器進(jìn)行下載,此時(shí),網(wǎng)絡(luò)數(shù)據(jù)的傳輸需要經(jīng)過漫長的海底光纜 因此下包速度會(huì)很慢。

    3.4.2 淘寶 NPM 鏡像服務(wù)器

    淘寶在國內(nèi)搭建了一個(gè)服務(wù)器,專門把國外官方服務(wù)器上的包 同步 到國內(nèi)的服務(wù)器,然后在國內(nèi)提供下包的服務(wù)。從而極大的提高了下包的速度。

    鏡像:
    英文 Mirroring ,是一種文件存儲(chǔ)形式,一個(gè)磁盤上的數(shù)據(jù)在另一個(gè)磁盤上存在一個(gè)完全相同的副本即為鏡像。


    3.4.3 切換 npm 的下包鏡像源

    下包的鏡像源,指的就是下包的服務(wù)器地址

    1) 查看當(dāng)前的下包鏡像源:

    npm config get registry

    2)將下包的鏡像源切換為淘寶鏡像源:

    npm config set registry=https://registry.npm.taobao.org/

    3)檢查鏡像源是否切換成功:

    npm config get registry

    3.4.4 nrm 工具安裝及安裝出錯(cuò)的處理

    為了更方便的切換下包的鏡像源,我們可以安裝 nrm 這個(gè)小工具,利用 nrm 提供的終端命令,可以快速查看和切換下包的鏡像源。

    1)通過 npm 包管理器,將 nrm 安裝為全局可用的工具

    npm i nrm -g

    如果出現(xiàn)安裝錯(cuò)誤,類似“nrm : 無法加載文件 C:\Users\xxx\AppData\Roaming\npm\nrm.ps1。未對(duì)文件進(jìn)行數(shù)字簽名。無法在當(dāng)前系統(tǒng)上運(yùn)行該腳本。有關(guān)運(yùn)行腳本和設(shè)置執(zhí)行策略的詳細(xì)信息”
    解決辦法:
    1、win鍵 + s 搜索 powershell 并以管理員身份運(yùn)行;
    2、powershell 中運(yùn)行 set-ExecutionPolicy RemoteSigned命令 => 重新安裝 nrm 即可。


    2)查看所有可用的鏡像源

    nrm ls

    3)將下包的鏡像源切換為 taobao 鏡像

    nrm use taobao

    3.5 包的分類

    使用 npm 包管理工具下載的包,共分為兩大類,分別是:

    • 項(xiàng)目包
    • 全局包

    3.5.1 項(xiàng)目包

    那些被安裝到項(xiàng)目node_modules 目錄中的包,都是項(xiàng)目包


    項(xiàng)目包又分為兩類,分別是:

    • 開發(fā)依賴包 (被記錄到 devDependencies 節(jié)點(diǎn)中的包,只在開發(fā)期間會(huì)用到);
    • 核心依賴包 (被記錄到 dependencies 節(jié)點(diǎn)中的包,在開發(fā)期間和項(xiàng)目上線之后都會(huì)用到)
    npm i 包名 -D // 開發(fā)依賴包(會(huì)被記錄到 devDependencies節(jié)點(diǎn)下) npm i 包名 // 核心依賴包(會(huì)被記錄到 dependencies 節(jié)點(diǎn)下)

    3.5.2 全局包

    在執(zhí)行 npm install 命令時(shí),如果提供了 g 參數(shù),則會(huì)把包安裝為全局包

    全局包會(huì)被安裝到 C:\Users\用戶目錄\AppData\Roaming\npm\node_modules 目錄下。


    🔔 注意

    • 只有工具性質(zhì)的包,才有全局安裝的必要性。因?yàn)樗鼈兲峁┝撕糜玫慕K端命令。
    • 判斷某個(gè)包是否需要全局安裝使用,參考官方提供的使用說明 即可。

    3.5.3 md文檔轉(zhuǎn)html工具 i5ting_toc

    i5ting_toc 是一個(gè)可以把 md 文檔轉(zhuǎn)為 html 頁面的小工具,使用步驟如下:

    1)將 i5ting_toc 安裝為全局包

    npm install -g i5ting_toc

    🔔 命令中的-g也可放在i5ting_toc之后,位置不影響命令執(zhí)行結(jié)果。


    2)調(diào)用 i5ting_toc,輕松實(shí)現(xiàn) md 轉(zhuǎn) html 的功能

    i5ting_toc -f 要轉(zhuǎn)換的md文件路徑 -o

    3.6 規(guī)范的包結(jié)構(gòu)

    在清楚了包的概念、如何下載以及使用包之后,接下來,我們深入了解一下
    包的內(nèi)部結(jié)構(gòu) 。

    一個(gè)規(guī)范的包,它的組成結(jié)構(gòu),必須符合以下 3 點(diǎn)要求:

  • 包必須以 單獨(dú)的目錄 而存在;
  • 包的頂級(jí)目錄下要必須包含 package.json 這個(gè)包管理配置文件
  • package.json 中必須包含 nameversionmain 這三個(gè)屬性,分別代表 包的名字版本號(hào)包的入口

  • 🔔 注意: 以上3 點(diǎn)要求是一個(gè)規(guī)范的包結(jié)構(gòu)必須遵守的格式,關(guān)于更多的約束,可以參考如下網(wǎng)址:

    https://classic.yarnpkg.com/zh-Hans/docs/package-json

    3.7 開發(fā)屬于自己的包


    3.7.1 功能需求

  • 格式化日期;
  • 轉(zhuǎn)義 HTML 中的 特殊字符;
  • 還原 HTML 中的 特殊字符。
  • // 導(dǎo)入自己的包 const bk = require('../bk-tools')

    1)功能1:格式化日期

    const dt = bk.dateFormat(new Date()) console.log(dt) // 輸出 2020-09-27 14:58

    2)功能2:轉(zhuǎn)義 HTML 中的特殊字符

    const htmlStr='<h1 style="color:red;">你好!&copy;<span>小黃!</span></h1>' const str = bk.htmlEscape(htmlStr) // &lt;h1 style=&quot;color:red;&quot;&gt;你好!&amp;copy;&lt;span&gt;小黃!&lt;span&gt;&lt;/h1&gt; console.log(str)

    3)功能3:還原 HTML 中的特殊字符

    const rawHTML = bk.htmlUnEscape(str) // 輸出 <h1 style="color:red">你好!&copy;<span>小黃!</span></h1> console.log(rawHTML)

    3.7.2 初始化包的基本結(jié)構(gòu)

  • 新建 bk-tools 文件夾,作為包的根目錄

  • 在 bk-tools 文件夾中,新建如下 3 個(gè)文件:

    – package.json (包管理配置文件)
    – index.js (包的入口文件)
    – README.md (包的說明文檔)

  • 3.7.3 初始化 package.json

    {"name": "bk-tools","version": "1.0.0","main": "index.js","description": "提供了格式化時(shí)間,HTMLEscape 等相關(guān)功能","keywords": ["bk", "dateFormat", "escape"],"license": "ISC" }

    在這個(gè) json對(duì)象中,包含 6 個(gè)屬性,其各自的作用介紹如下:

  • name:包的名稱,不允許重復(fù)。命名前,建議先去 npm官網(wǎng) 檢索該名稱是否已存在。
  • version:包的版本號(hào)。默認(rèn)從1.0.0開始;
  • main:指定包的入口文件(即外部使用require()導(dǎo)入包時(shí),實(shí)際導(dǎo)入的是main屬性所指向的那個(gè) js 文件);
  • description:包的描述信息,比例包的基本功能;
  • keywords:搜索關(guān)鍵字;
  • license:包所遵循的開源許可協(xié)議。npm 推薦使用“ISC”開源許可協(xié)議。
  • 可不可以不選擇 License ?
    沒有 License 的內(nèi)容是默認(rèn)會(huì)被版權(quán)保護(hù)。所以如果你想要的是讓大家都放心使用,就需要選擇一個(gè)合適的 License ,只有這樣才能賦予任何人使用,分享和修改這個(gè)軟件的權(quán)力。



    Github 官方專門制作了一個(gè)網(wǎng)站 https://choosealicense.com/ 幫助大家選擇合適的開源許可。

    關(guān)于更多 license 許可協(xié)議相關(guān)的內(nèi)容,可參考以下鏈接的文章:

    https://www.cnblogs.com/Wayou/p/how_to_choose_a_license.html
    https://zhuanlan.zhihu.com/p/144054495
    http://www.ruanyifeng.com/blog/2011/05/how_to_choose_free_software_licenses.html

    3.7.4 在 index.js 中定義格式化時(shí)間的方法

    1)定義格式化時(shí)間的方法:

    // 定義格式化時(shí)間的函數(shù) function dateFormat(dateStr) {const dt = new Date(dateStr)const y = dt.getFullYear();const m = padZero(dt.getMonth() + 1);const d = padZero(dt.getDate());const hh = padZero(dt.getHours());const mm = padZero(dt.getMinutes());const ss = padZero(dt.getSeconds());return `${y}-${m}-${d} ${hh}:${mm}:${ss}` }

    2)定義補(bǔ)零的方法:

    // 定義一個(gè)補(bǔ)零的函數(shù) function padZero(n) {return n > 9 ? n : '0' + n }

    3)向外暴露成員:

    module.exports = {dateFormat }

    3.7.5 在 index.js 中定義轉(zhuǎn)義 HTML 的方法

    // 定義轉(zhuǎn)義 HTML 字符的函數(shù) function htmlEscape(htmlstr) {return htmlstr.replace(/<|>|"|&/g, (match) => {switch (match) {case '<':return '&lt;'case '>':return '&gt;'case '"':return '&quot;'case '&':return '&amp;'}}) }

    參數(shù)match:匹配成功的字符 - 當(dāng)匹配成功后,需要將對(duì)應(yīng)的符號(hào)替換成實(shí)體字符。

    關(guān)于實(shí)體字符對(duì)照表,請(qǐng)參閱 https://www.w3school.com.cn/html/html_entities.asp

    3.7.6 在 index.js 中定義還原 HTML 的方法

    function htmlUnEscape(str) {return str.replace(/&lt;|&gt;|&quot;|&amp;/g,(match)=>{switch(match) {case '&lt;':return '<'case '&gt;':return '>'case '&quot;':return '"'case '&amp;':return '&'}}) }

    3.7.7 將不同的功能進(jìn)行模塊化拆分

  • 將格式化時(shí)間的功能,拆分到 src --> dateFormat.js 中;
  • 將處理 HTML 字符串的功能,拆分到 src --> htmlEscape.js 中;
  • 在 index.js 中,導(dǎo)入兩個(gè)模塊,得到需要向外共享的方法;
  • 在 index.js 中,使用 module.exports 把對(duì)應(yīng)的方法共享出去
  • 1)在項(xiàng)目根目錄bk-tools下新建 src 文件夾,再在里面新建 兩個(gè)空白 文件 dateFormat.js、htmlEscape.js,并將 index.js 中各功能代碼剪切到 對(duì)應(yīng)空白 js 文件中去。

    2)在index.js 文件中,導(dǎo)入 dateFormat.js和htmlEscape.js模塊,并添加暴露成員。

    const date = require('./src/dateFormat') const escape = require('./src/htmlEscape')// 向外暴露需要的成員 module.exports = {...date,...escape }

    解釋: 將...date、...escape這兩個(gè)對(duì)象掛載到 module.exports對(duì)象中,...展開運(yùn)算符,是ES6的寫法,表示把對(duì)象的所有屬性展開,交給 module.exports 對(duì)象保存。

    3.7.8 編寫包的說明文檔

    包根目錄中的 README.md 文件,是 包的使用說明文檔 。通過它,我們可以事先把包的使用說明,以 markdown 的格式寫出來,方便用戶參考。

    README 文件中具體寫什么內(nèi)容,沒有強(qiáng)制性的要求;只要能夠清晰地把包的作用、用法、注意事項(xiàng)等描述清楚即可。

    我們所創(chuàng)建的這個(gè)包的 README.md 文檔中,會(huì)包含以下 6 項(xiàng)內(nèi)容:

    • 安裝方式;
    • 導(dǎo)入方式;
    • 格式化時(shí)間;
    • 轉(zhuǎn)義 HTML 中的特殊字符;
    • 還原 HTML 中的特殊字符;
    • 開源協(xié)議


    3.8 發(fā)布包

    3.8.1.注冊(cè) npm 賬號(hào)

  • 訪問 https://www.npmjs.com/ 網(wǎng)站,點(diǎn)擊 sign up 按鈕,進(jìn)入注冊(cè)用戶界面;
  • 填寫賬號(hào)相關(guān)的信息: Full Name 、 Public Email 、 Username 、 Password;
  • 點(diǎn)擊 Create an Account 按鈕,注冊(cè)賬號(hào);
  • 登錄郵箱, 點(diǎn)擊驗(yàn)證鏈接 ,進(jìn)行賬號(hào)的驗(yàn)證。

  • 3.8.2 登錄npm帳號(hào)

    npm 賬號(hào)注冊(cè)完成后,可以在終端中執(zhí)行 npm login 命令,依次輸入用戶名、密碼、郵箱后,即可登錄成功。

    Password 處輸入密碼時(shí),終端上不會(huì)顯示你正在鍵入的內(nèi)容。完整輸入密碼后,再輸入注冊(cè)郵箱即可。


    ?? 注意:

    在運(yùn)行 npm login 命令之前,必須先把 下包的服務(wù)器 地址切換為 npm 的官方服務(wù)器 。否則會(huì)導(dǎo)致發(fā)布包失敗!


    3.8.3 把包發(fā)布到 npm 上

    將終端切換到包的根目錄之后,運(yùn)行 npm publish 命令,即可將包發(fā)布到 npm 上(注意: 包名不能雷同 ,發(fā)布前,到 npm 官網(wǎng)進(jìn)行查重操作)。

    PS F:\HTML\MyCase\bk-tools> npm publish


    接下來,就可以登錄到 npm官網(wǎng)自己的賬號(hào)來檢查有沒有發(fā)布上去這個(gè)包


    點(diǎn)開 packages ,就能看到自己發(fā)布的包了。

    3.8.4 刪除已發(fā)布的包

    npm unpublish 包名 --force


    刪除成功!(如需再次發(fā)布,需要等 24 小時(shí)之后才可以發(fā)布)


    🔔 注意:

  • npm unpublish 命令只能刪除 72 小時(shí)以內(nèi) 發(fā)布的包;
  • npm unpublish 刪除的包,在 24 小時(shí)內(nèi) 不允許重復(fù)發(fā)布;
  • 發(fā)布包的時(shí)候要慎重, 盡量不要往 npm 上發(fā)布沒有意義的包

  • 4. 模塊加載機(jī)制

    4.1 優(yōu)先從緩存中加載

    模塊在第一次加載后會(huì)被緩存。 這也意味著多次調(diào)用 require() 不會(huì)導(dǎo)致模塊的代碼被執(zhí)行多次。

    注意: 不論是內(nèi)置模塊、用戶自定義模塊、還是第三方模塊,它們都會(huì)優(yōu)先從緩存中加載,從而提高模塊的 加載效率

    4.2 內(nèi)置模塊的加載機(jī)制

    內(nèi)置模塊是由Node.js 官方提供的模塊, 內(nèi)置模塊的加載優(yōu)先級(jí)最高

    例如,require(‘fs’) 始終返回內(nèi)置的 fs 模塊,即使在 node_modules 目錄下有名字相同的包也叫做 fs 。


    4.3自定義模塊的加載機(jī)制

    使用 require() 加載自定義模塊時(shí),必須指定以./…/ 開頭的 路徑標(biāo)識(shí)符 。在加載自定義模塊時(shí),如果沒有指定 ./ 或 …/這樣的路徑標(biāo)識(shí)符,則 node 會(huì)把它當(dāng)作 內(nèi)置模塊.第三方模塊 進(jìn)行加載。

    同時(shí),在使用require() 導(dǎo)入自定義模塊時(shí),如果省略了文件的擴(kuò)展名,則 Node.js 會(huì)按順序分別嘗試加載以下的文件:

  • 按照 確切的文件名 進(jìn)行加載;
  • 補(bǔ)全 js 擴(kuò)展名進(jìn)行加載;
  • 補(bǔ)全 .json 擴(kuò)展名進(jìn)行加載;
  • 補(bǔ)全 .node 擴(kuò)展名進(jìn)行加載;
  • 加載失敗,終端報(bào)錯(cuò)。

  • 4.4 第三方模塊的加載機(jī)制

    如果傳遞給 require() 的模塊標(biāo)識(shí)符不是一個(gè)內(nèi)置模塊,也沒有以 ‘./’ 或 ‘…/’ 開頭,則 Node.js 會(huì)從當(dāng)前模塊的父目錄開始,嘗試從 node_modules 文件夾中加載第三方模塊。

    如果沒有找到對(duì)應(yīng)的第三方模塊, 則移動(dòng)到再上一 層父目錄中,進(jìn)行加載, 直到文件系統(tǒng)的根目錄。

    例如,假設(shè)在C:\Users\fore-end\project\foo.js文件里調(diào)用了 require(‘tools’) ,則 Node.js 會(huì)按以下順序查找:

  • C: \Users\fore-end\project\node_modules\tools;
  • C:\Users\fore-end\node_modules\tools;
  • C:\Users\node_modules\tools;
  • C:\node_modules\tools

  • 4.5 目錄作為模塊

    當(dāng)把目錄作為模塊標(biāo)識(shí)符,傳遞給 require() 進(jìn)行加載的時(shí)候,有三種加載方式:

  • 在被加載的目錄下查找一個(gè)叫做 package.json 的文件,并尋找 main 屬性,作為 require() 加載的入口;
  • 如果目錄里沒有 package.json 文件,或者 main 入口不存在或無法解析,則 Node.js 將會(huì)試圖加載目錄下的 index.js 文件 ;
  • 如果以上兩步都失敗了,則 Node.js 會(huì)在終端打印錯(cuò)誤消息,報(bào)告模塊的缺失: Error: Cannot find module 'xxx'



  • <<<   第二部分(完)



    上一篇:Node.js 入門詳解 (一)

    下一篇:Node.js 入門詳解 (三)

    總結(jié)

    以上是生活随笔為你收集整理的Node.js 从门详解 (二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。