最近試着發佈了一兩個NPM包,一個是mapbox 的一些插件類,另外一個是vudio,一個音頻可視化的庫。簡單記錄下NPM 包管理的一些操做,主要是發佈包的一些概念和注意點node
首先,咱們得有一個有package.json
文件的文件夾,其中有幾個關鍵字段須要注意。git
NPM包name
和version
是必須的,version 得是符合semversion 規範的,也就是 major.minor.patch 三個數字組成,大版本小版本和patch。好比每次 npm publish
以前能夠經過npm version minor
去自動增長一個小版本數字,會自動修改package.json
中的 version
值。也就是說最好不要手動改 package.json文件中的version 字段。github
好比vudio 的版本號原本是 2.0.3, 腳本自動增長版本號後,再經過 npm version 查看當前的版本信息npm
npm version minor
npm version
> { vudio: '2.0.4',
npm: '5.5.1',
...
}
npm publish
複製代碼
以個人vudio 包package文件爲例json
// package.json of my NPM package Vudio
{
"name": "vudio",
"version": "2.0.4",
"description": "visualization audio using AudioContext and Canvas",
"main": "umd/vudio.js", // 若是是esModule 或者node.js的包,把入口文件填這裏
"browser": "umd/vudio.js", // 若是這個包針對瀏覽器環境,那填這裏
"files": [
"umd",
"*"
]
}
複製代碼
這幾個字段比較有用,main
字段標識了你 npm 包的入口,好比別人安裝了個人包, 在 nodejs 程序中 require 我導出的模塊對象,實際上就會去packge.json
中查找 main 字段,到底指的是哪一個js 文件瀏覽器
var Vudio = require('vudio')
// 實際上等效於
var Vudio = require('vudio/umd/vudio.js')
複製代碼
經過require
或者import
引入NPM包時,是讀取 main 字段來獲取入口文件地址。這主要針對符合common.js和esModule 模塊規範的第三方NPM 包。若是你要發佈的NPM 包只能在 browser 環境下運行,好比要依賴 window,DOM這類瀏覽器環境下的要素。那能夠直接給 browser 字段指定你的 umd 文件地址,也就是通用模塊定義文件。bash
這種導出模塊的典型特徵就是適配各類運行環境,無論是瀏覽器仍是nodejs環境,均可以順利導出模塊,優雅適配網站
// 典型的umd 模塊導出
(function(factory){
if (typeof exports === 'object') { // 支持Common.js
module.exports = factory();
} else if (typeof define === 'function' && define.amd) { // 支持AMD
define(factory);
} else {
window.Vudio = factory(); // 瀏覽器環境
}
})(function() {
/// 你的功能
function Vudio(){
//// .....
}
return Vudio
})
複製代碼
這樣 npm publish 以後就能夠在npm倉庫裏查到你的包了。有個問題就是publish 以前得 npm login
下,另外要確保你的 package name 是全網惟一,否則會提示 403,沒有權限提交。ui
除了把NPM包發佈給 官方倉庫,還能夠順手提交給 unpkg.com/ 這樣的 CDN 網站,其實是Cloudflare 提供的CDN 服務。 主要作到兩點:spa
umd
(or dist
) 文件夾到 .gitignore
文件中,也就是說在git repo 裏面忽略這個用於發佈包的文件夾umd
文件夾地址添加到package.json
的 files array 字段中files字段指的是,你要把哪些文件、文件夾包含在NPM包裏面。這樣你 npm publish
的時候只會把這部分文件(一般是必要的,無我的數據的)打包 tgz 提交給npm 倉庫。
配置完成後,npm publish 以後就能夠在unpkg CDN 上查到本身的包了. 通常地址是 unpkg.com/:package@:version/:file
參考文檔: