如何開發(fā)一個npm包并發(fā)布

一、初始化項(xiàng)目

npm create vite

選擇模板:

  1. 開發(fā)方法庫:選擇第一個Vanilla模板就可以了
  2. 開發(fā)組件庫:如果想開發(fā)基于vue的組件庫可直接選擇Vue模板


二酝惧、封裝方法或組件并添加打包配置

2.1 封裝方法庫

  1. 在根目錄下新建src文件夾崩瓤,并新建一個js文件寫入想要封裝的方法:


  2. 在main.js中引入引入封裝方法的js文件攻泼,并導(dǎo)出封裝的方法:


  3. 配置package.json
{
  "name": "my-function-lib", // 包名寇窑,命名前可以先去npm官網(wǎng)中查看是否已有這個包名凤藏,如果已經(jīng)有的話就發(fā)布不了
  "private": false, // 是否為私有包惋增,false則表示公開包
  "version": "0.0.1", // 版本號叠殷,之后如果要更新,必須加大才能發(fā)布
  "type": "module",  // 指定項(xiàng)目的模塊類型為模塊
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "preview": "vite preview"
  },
   // 指定發(fā)布的文件夾
  "files": [
    "dist"
  ],
  "main": "dist/my-function-lib.cjs", // 指定項(xiàng)目的主入口文件(CommonJS)
  "module": "dist/my-function-lib.js", // 指定項(xiàng)目的模塊入口文件(ES Module)
  "devDependencies": {
    "vite": "^5.4.8"
  }
}
  1. 創(chuàng)建vite.config.js诈皿,并加入配置
import { defineConfig } from 'vite'

export default defineConfig({
  build: {
    outDir: 'dist', // 構(gòu)建輸出目錄設(shè)置為'dist'
    target: 'es2020', // 構(gòu)建目標(biāo)設(shè)置為'es2020'
    lib: {
      entry: 'main.js', // 設(shè)置庫的入口文件
      formats: ['es', 'cjs'], // 定義導(dǎo)出格式 包含 'es' 模塊格式林束,適用于 ES6 及以上版本,包含 'cjs' 模塊格式稽亏,適用于 CommonJS 規(guī)范
      name: ''
    },
  },
})

2.2 封裝組件庫

  1. 在src文件夾新建package文件夾壶冒,并創(chuàng)建.vue文件寫入想要封裝的代碼:


  2. 在package新建js文件,引入封裝的組件

import MyButton from './my-button/index.vue' // 導(dǎo)入自定義的Vue組件
import './index.css' // 導(dǎo)入CSS樣式文件截歉,為應(yīng)用添加全局樣式

// 定義一個安裝函數(shù)胖腾,用于將BtnTab組件注冊到Vue應(yīng)用中
const install = (app) => {
   // 將BtnTab組件注冊為全局組件,使得在應(yīng)用的任何地方都可以使用這個組件
  app.component('MyButton', MyButton)
}

// 默認(rèn)導(dǎo)出一個對象怎披,包含install方法胸嘁,允許外部通過'default'關(guān)鍵字導(dǎo)入并安裝BtnTab組件
export default {
  install,
}
// 單獨(dú)導(dǎo)出BtnTab組件,允許外部按需導(dǎo)入
export { BtnTab }
  1. 配置vite.config.js
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

export default defineConfig({
  plugins: [vue()],
  build: {
    outDir: 'dist',
    lib: {
      entry: 'src/package/index.js', // 入口文件路徑
      name: 'my-components-package', // 組件庫的名稱
      fileName: 'my-components-package', // 打包后的文件名
    },
    rollupOptions: {
      // 處理不想打包的依賴
      external: ['vue'],
      output: {
        globals: {
          vue: 'Vue',
        },
      },
    },
  },
})

  1. 運(yùn)行npm run build命令打包
  2. 配置package.json
{
  "name": "my-components-package",
  "private": false,
  "version": "0.0.1",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "preview": "vite preview"
  },
  // 指定包含的文件或文件夾
  "files": [
    "dist"
  ],
  "main": "dist/my-components-package.umd.cjs",
  "module": "dist/my-components-package.js",
  "exports": {
    ".": {
      "import": "./dist/my-components-package.js",  // import導(dǎo)入模塊時的入口文件
      "require": "./dist/my-components-package.umd.cjs" // require方式引入模塊時的入口文件
    }
  },
  "dependencies": {
    "vue": "^3.4.37"
  },
  "devDependencies": {
    "@vitejs/plugin-vue": "^5.1.2",
    "vite": "^5.4.1"
  }
}
  1. 編寫README.md文件凉逛。

三性宏、發(fā)布到npm

3.1 登錄npm

在終端輸入npm login ,在登錄前一定要將npm源設(shè)置為官方源,否則登錄會報(bào)錯

// 官方鏡像源
npm config set registry https://registry.npmjs.org/
// 淘寶鏡像源
npm config set registry https://registry.npmmirror.com/

檢查當(dāng)前npm源:

npm config get registry

3.2 發(fā)布包

在終端輸入npm publish (這個命令也需要npm源為官方源)
發(fā)布成功后登錄npm官網(wǎng)状飞,在自己的賬號上packages中就能看到自己發(fā)布的包了毫胜。

要點(diǎn)

main和module字段的意義

1. main:
main字段指定了包的入口點(diǎn)书斜,即其他程序要引用該包時使用的主文件。
傳統(tǒng)上酵使,main字段指向一個CommonJS模塊(使用require()引入)荐吉。
大多數(shù)Node.js應(yīng)用和傳統(tǒng)瀏覽器環(huán)境使用main字段引入包。
2. module:
module字段指定了一個ES6模塊(使用import/export語法)作為包的入口點(diǎn)口渔。
現(xiàn)代瀏覽器和一些Javascript打包工具(如Webpack样屠、Rollup)能夠識別并使用module字段來加載ES6模塊。
使用ES6模塊語法可以獲得更好的靜態(tài)分析和tree-shaking性能缺脉。
總的來說:
main是為了支持CommonJS模塊的傳統(tǒng)方式痪欲,module則是為了支持ES6模塊的現(xiàn)代方式
當(dāng)包同時提供CommonJS和ES6模塊時,通常會同時設(shè)置main和module字段攻礼。這樣可以讓應(yīng)用根據(jù)自身的打包工具和模塊系統(tǒng)來選擇合適的入口點(diǎn)业踢。

總結(jié)

npm 包其實(shí)就是一個組件或者方法或文件,使用npm的發(fā)布命令publish礁扮,其實(shí)本質(zhì)上就是把這些上傳到npm倉庫進(jìn)行統(tǒng)一化管理知举,當(dāng)你在開發(fā)項(xiàng)目的過程中,你可以根據(jù)自己的需求把相應(yīng)的包拉取到你的項(xiàng)目中進(jìn)行使用太伊;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末雇锡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子倦畅,更是在濱河造成了極大的恐慌遮糖,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叠赐,死亡現(xiàn)場離奇詭異欲账,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)芭概,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門赛不,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人罢洲,你說我怎么就攤上這事踢故。” “怎么了惹苗?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵殿较,是天一觀的道長。 經(jīng)常有香客問我桩蓉,道長淋纲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任院究,我火速辦了婚禮洽瞬,結(jié)果婚禮上本涕,老公的妹妹穿的比我還像新娘。我一直安慰自己伙窃,他們只是感情好菩颖,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著为障,像睡著了一般晦闰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鳍怨,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天鹅髓,我揣著相機(jī)與錄音,去河邊找鬼京景。 笑死,一個胖子當(dāng)著我的面吹牛骗奖,可吹牛的內(nèi)容都是我干的确徙。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼执桌,長吁一口氣:“原來是場噩夢啊……” “哼鄙皇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起仰挣,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤伴逸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后膘壶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體错蝴,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年颓芭,在試婚紗的時候發(fā)現(xiàn)自己被綠了顷锰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡亡问,死狀恐怖官紫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情州藕,我是刑警寧澤束世,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站床玻,受9級特大地震影響毁涉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜笨枯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一薪丁、第九天 我趴在偏房一處隱蔽的房頂上張望遇西。 院中可真熱鬧,春花似錦严嗜、人聲如沸粱檀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽茄蚯。三九已至,卻和暖如春睦优,著一層夾襖步出監(jiān)牢的瞬間渗常,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工汗盘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留皱碘,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓隐孽,卻偏偏與公主長得像癌椿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子菱阵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容