作爲一個前端,每個人應該對npm install這個命令應該非常熟悉了,尤其是對這個命令執行過程中命令窗口瘋狂輸出肯定印象深刻。我發現有的同學對安裝包輕車熟路,但對包從哪裏來的以及如何發佈一個npm並不是很瞭解,基於此,在團隊內部做了一次分享,將分享過程整理如下,希望對每一個想發佈自己的包但又不知從何開始的同學有所幫助。
由於發佈包涉及到發佈、安裝、更新、刪除/廢棄等階段,寫在一篇文章中篇幅過長,決定拆開做成一個系列。今天第一篇首先介紹一下npm相關的一些知識。
npm(node package
manager)
- 是一個輔助前端開發的包管理工具
-
包括:
- 網站:找包、註冊用戶
- 命令行:程序員與npm交互的主要形式
- 倉庫:最大的JavaScript軟件庫
- 管理對象:包(package)
-
管理方式:
- 增(發佈:npm publish;安裝:npm i)
- 刪(廢棄:npm deprecate;卸載:npm rm)
- 改(更新:npm up)
- 查(搜索:npm s)
npm中涉及到的主體主要有兩個:package和module,定義如下:
- package:
含有package.json描述文件
並發佈到npm倉庫
的文件或者文件夾 - module:
在node_modules中
,可以被Node.js的require()方法加載
的任何文件或文件夾
可以這樣理解:一個JavaScript軟件,從本地發佈到npm倉庫時是package,從npm倉庫下載到本地時就變成了module
另外,基於以上,可以看出package和module的關係:
- module不一定是package(比如node內置模塊),package一定是module
- 含package.json文件的module一定是package
除了以上概念外,再分別看下兩個主體中的細節部分:
package(包)
主要有兩個重要的屬性:
1.Scope(作用域,範圍)
一旦註冊個人或者團體賬戶,就獲得了與個人或者團體名相匹配的scope,可以用這個scope作爲包的命名空間,例如@yuyy、@58。
分類:
- unscoped:例如babel
-
scoped
- user: 例如@yuyy/babel
- org:@babel/parser
作用:爲你自己發佈的包提供命名空間,防止與他人的包名衝突
2.Accessibility(可訪問性)
屬性值有:
- private:私有,僅作者本人或團隊成員可見
- public:公有,所有人可見
此屬性和github創建倉庫時設定訪問性的策略一致:公有,所有人可見,免費;私有,僅自己可見,收費。
以上兩個屬性之間的關係如下:
需要說明的幾點:
- 個人賬戶(User)可以創建和管理Unscoped的package;團隊賬戶(Org)相互只能管理Scoped的package
- Unscoped總是public
- Private的package總是Scoped
-
Scoped的package默認Private,但需要付費
,可以通過命令行改變其屬性
module(模塊)
下載到本地的module主要是用於在node環境被引用,爲了能被Node.js的require()方法加載,module必須是下列情況之一:
- 包含package.json,且package.json中有main字段的文件夾
- 含有index.js的文件夾
- JavaScript文件
以上都是一些npm相關的知識,在下一篇《npm發佈包教程(二):發佈包》中,我們開始演示發佈npm包的實際操作過程。