如何開(kāi)發(fā)一個(gè)npm包并發(fā)布

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

npm create vite

選擇模板:

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


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

2.1 封裝方法庫(kù)

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


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


  3. 配置package.json
{
  "name": "my-function-lib", // 包名,命名前可以先去npm官網(wǎng)中查看是否已有這個(gè)包名,如果已經(jīng)有的話就發(fā)布不了
  "private": false, // 是否為私有包,false則表示公開(kāi)包
  "version": "0.0.1", // 版本號(hào),之后如果要更新,必須加大才能發(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è)置庫(kù)的入口文件
      formats: ['es', 'cjs'], // 定義導(dǎo)出格式 包含 'es' 模塊格式,適用于 ES6 及以上版本,包含 'cjs' 模塊格式,適用于 CommonJS 規(guī)范
      name: ''
    },
  },
})

2.2 封裝組件庫(kù)

  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)用添加全局樣式

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

// 默認(rèn)導(dǎo)出一個(gè)對(duì)象,包含install方法,允許外部通過(guò)'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', // 組件庫(kù)的名稱
      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)入模塊時(shí)的入口文件
      "require": "./dist/my-components-package.umd.cjs" // require方式引入模塊時(shí)的入口文件
    }
  },
  "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è)置為官方源,否則登錄會(huì)報(bào)錯(cuò)

// 官方鏡像源
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 (這個(gè)命令也需要npm源為官方源)
發(fā)布成功后登錄npm官網(wǎng),在自己的賬號(hào)上packages中就能看到自己發(fā)布的包了。

要點(diǎn)

main和module字段的意義

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

總結(jié)

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容