溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么理解Node.js中的包與NPM

發(fā)布時(shí)間:2021-11-01 10:06:16 來源:億速云 閱讀:169 作者:iii 欄目:web開發(fā)

這篇文章主要介紹“怎么理解Node.js中的包與NPM”,在日常操作中,相信很多人在怎么理解Node.js中的包與NPM問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么理解Node.js中的包與NPM”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

怎么理解Node.js中的包與NPM

摘要:包與NPM Node組織了自身的核心模塊,也使得第三方文件模塊可以有序的編寫和使用。

包與NPM

Node組織了自身的核心模塊,也使得第三方文件模塊可以有序的編寫和使用。

但是在第三方模塊中,模塊與模塊之間仍然是散列在各地的,相互之間不能直接引用

所以在模塊外,包和NPM是將模塊聯(lián)系起來的機(jī)制。

  • 包組織模塊示意圖

怎么理解Node.js中的包與NPM

CommonJS 的包規(guī)范定義其實(shí)也很簡單,由包結(jié)構(gòu)和包描述文件兩部分組成。

包結(jié)構(gòu)

用于組織包中的各種文件,是一個(gè)存檔文件,即一個(gè)目錄直接打包為.zip或tar.gz格式的文件。

符合規(guī)范的包目錄:

  • package.json: 包描述文件

  • bin: 用于存放可執(zhí)行二進(jìn)制文件的目錄

  • lib: 用于存放JavaScript代碼的目錄

  • doc: 用于存放文檔的目錄

  • test: 用于存放單元測試用例的代碼

package.json包描述文件

NPM所有行為都與包描述文件的字段息息相關(guān)

一些字段:

  • name: 包名。 規(guī)范定義需要用小寫的字母和數(shù)字組成,不允許出現(xiàn)空格。 包名必須是唯一的,以免對外公布時(shí)產(chǎn)生重名沖突

  • description: 包簡介

  • version: 版本號(hào),關(guān)于其介紹在《Node.js學(xué)習(xí)(一)——簡介》也有提及

  • keywords: 關(guān)鍵字?jǐn)?shù)組, NPM中主要用來作分類搜索。

  • maintainers: 包維護(hù)者列表。 每個(gè)維護(hù)者由name、email和web這3個(gè)屬性組成。 NPM通過這個(gè)屬性進(jìn)行權(quán)限認(rèn)證。

格式:

"maintainers":[{ "name":"kongchengji", "email":"111@.com", "web":"[http:](https://blog.csdn.net/qq_36171287)" }]
  • contributors: 貢獻(xiàn)者列表,格式與維護(hù)者列表相同

  • bugs: 一個(gè)可以反饋bug的網(wǎng)頁地址或郵件地址

  • licenses: 當(dāng)前包所使用的許可證列表,表示包在哪些許可證下使用

格式:

 "licenses":[{ "type": "GPLv2", "url":"" }]
 // 或者
 "license": "ISC"
  • repositories: 托管源代碼的位置列表,表明可以通過哪些方式和地址訪問包源代碼。

格式:

"repository": {
"type": "git",
"url": "git+https://github.com/kongchengji/UiSelfMade.git"
},
  • dependencies: 使用當(dāng)前包所需要依賴的包列表。 這個(gè)屬性非常重要

  • homepage: 當(dāng)前包的網(wǎng)站地址

  • os: 操作系統(tǒng)支持列表, 如果列表為空,則不對操作系統(tǒng)做任何假設(shè)

  • cpi: CPU架構(gòu)支持列表

  • engine:支持的JavaScript引擎列表

  • directories:包目錄說明

  • implements: 實(shí)施規(guī)范的列表。 標(biāo)志當(dāng)前包實(shí)現(xiàn)了CommonJS哪些規(guī)范

  • scripts: 腳本說明對象。 主要用于被包管理器用來安裝、編譯、測試和卸載包

格式:

"scripts": {
        "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
        "start": "npm run dev",
        "lint": "eslint --ext .js,.vue src",
        "build": "node build/build.js"
    },

NPM與包規(guī)范區(qū)別在于多了四個(gè)字段:

  • author: 包作者 :ok_man:

  • bin: 一些包作者希望包可以作為命令行工具使用。

  • main: 模塊引入包時(shí),會(huì)有限檢查這個(gè)字段,并將其作為包中其余模塊的入口模塊。 如果不存在,require會(huì)查找包目錄下的index.js、index.node、index.json作為默認(rèn)入口

  • devDependencies: 一些模塊只在開發(fā)時(shí)需要依賴。

devDependencies:開發(fā)環(huán)境使用dependencies:生產(chǎn)環(huán)境使用

前后端共用模塊

JavaScript在Node出現(xiàn)后,有一項(xiàng)優(yōu)勢 --> 一些模塊可以在前后端實(shí)現(xiàn)共用。

但是前后端上始終還是有一些差別的 :sweat_drops:

前后端模塊側(cè)重點(diǎn)

前后端JavaScript分別擱置在HTPP的兩端,扮演的角色并不同。

瀏覽器端的JavaScript需要經(jīng)歷從同一個(gè)服務(wù)器端分發(fā)到多個(gè)客戶端執(zhí)行,瓶頸是帶寬,從網(wǎng)絡(luò)加載代碼服務(wù)器端的JavaScript是相同代碼需要多次執(zhí)行,瓶頸是CPU和內(nèi)存等資源,從磁盤中加載

在前端JavaScript中,主要還是應(yīng)用AMD規(guī)范。

CommonJS并不完全適用于前端JavaScript,比如Node的模塊引入基本是同步的,但是前端引入如果使用同步引入,UI在初始化過程中需要花費(fèi)很多時(shí)間等待腳本加載完成。

AMD規(guī)范

AMD規(guī)范是CommonJS規(guī)范的一個(gè)延伸,全稱:Asynchronous Module Definition。

是異步模塊定義

模塊定義:define(id?,dependencies?, factory);

id 是模塊的名字,它是可選的參數(shù)。

dependencies 指定了所要依賴的模塊列表,它是一個(gè)數(shù)組,也是可選的參數(shù)

AMD需要在聲明模塊時(shí)指定所有的依賴,通過形參傳遞依賴到模塊內(nèi)容中:

define(['./a', './b'], function (dep1, dep2) {
    a.doSomethimg()
    b.doSomething()
});

CMD規(guī)范

與AMD規(guī)范相對的還有CMD規(guī)范,全稱:CommonModule Definition。

是公共模塊定義

這是由國內(nèi)的玉伯(也是一位大佬)提出的

模塊定義:define(factory)

CMD支持動(dòng)態(tài)引入:

define(function(require, exports, module) {
    var a=require('./a')
    a.doSomethimg()
    var b=require('./b')
    b.doSomething()
})

在需要依賴模塊時(shí),隨時(shí)調(diào)用require()引入即可

  • CMD 推崇依賴就近; AMD 推崇依賴前置

  • CMD 是延遲執(zhí)行; AMD 是提前執(zhí)行

  • CMD性能好,因?yàn)橹挥杏脩粜枰臅r(shí)候才執(zhí)行; AMD用戶體驗(yàn)好,因?yàn)闆]有延遲,依賴模塊提前執(zhí)行了

AMD和CMD最大的區(qū)別是對依賴模塊的執(zhí)行時(shí)機(jī)處理不同

兼容多種模塊規(guī)范

創(chuàng)建一個(gè)hello方法,讓hello方法能在不同運(yùn)行環(huán)境中運(yùn)行,兼容Node、AMD、CMD和常見瀏覽器

  • 匿名函數(shù)前加一個(gè);是個(gè)好習(xí)慣 name是方法名,definition是方法體

  • 通過typeof檢測環(huán)境是否為AMD或CMD還是Node環(huán)境

  • 可以將模塊執(zhí)行結(jié)果掛載在window變量中,這樣可以直接調(diào)用

怎么理解Node.js中的包與NPM

到此,關(guān)于“怎么理解Node.js中的包與NPM”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI