如何开发一个npm包并发布

一、初始化项目

npm create vite

选择模板:

  1. 开发方法库:选择第一个Vanilla模板就可以了
  2. 开发组件库:如果想开发基于vue的组件库可直接选择Vue模板


二、封装方法或组件并添加打包配置

2.1 封装方法库

  1. 在根目录下新建src文件夹,并新建一个js文件写入想要封装的方法:


  2. 在main.js中引入引入封装方法的js文件,并导出封装的方法:


  3. 配置package.json
{
  "name": "my-function-lib", // 包名,命名前可以先去npm官网中查看是否已有这个包名,如果已经有的话就发布不了
  "private": false, // 是否为私有包,false则表示公开包
  "version": "0.0.1", // 版本号,之后如果要更新,必须加大才能发布
  "type": "module",  // 指定项目的模块类型为模块
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "preview": "vite preview"
  },
   // 指定发布的文件夹
  "files": [
    "dist"
  ],
  "main": "dist/my-function-lib.cjs", // 指定项目的主入口文件(CommonJS)
  "module": "dist/my-function-lib.js", // 指定项目的模块入口文件(ES Module)
  "devDependencies": {
    "vite": "^5.4.8"
  }
}
  1. 创建vite.config.js,并加入配置
import { defineConfig } from 'vite'

export default defineConfig({
  build: {
    outDir: 'dist', // 构建输出目录设置为'dist'
    target: 'es2020', // 构建目标设置为'es2020'
    lib: {
      entry: 'main.js', // 设置库的入口文件
      formats: ['es', 'cjs'], // 定义导出格式 包含 'es' 模块格式,适用于 ES6 及以上版本,包含 'cjs' 模块格式,适用于 CommonJS 规范
      name: ''
    },
  },
})

2.2 封装组件库

  1. 在src文件夹新建package文件夹,并创建.vue文件写入想要封装的代码:


  2. 在package新建js文件,引入封装的组件

import MyButton from './my-button/index.vue' // 导入自定义的Vue组件
import './index.css' // 导入CSS样式文件,为应用添加全局样式

// 定义一个安装函数,用于将BtnTab组件注册到Vue应用中
const install = (app) => {
   // 将BtnTab组件注册为全局组件,使得在应用的任何地方都可以使用这个组件
  app.component('MyButton', MyButton)
}

// 默认导出一个对象,包含install方法,允许外部通过'default'关键字导入并安装BtnTab组件
export default {
  install,
}
// 单独导出BtnTab组件,允许外部按需导入
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. 运行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导入模块时的入口文件
      "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文件。

三、发布到npm

3.1 登录npm

在终端输入npm login ,在登录前一定要将npm源设置为官方源,否则登录会报错

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

检查当前npm源:

npm config get registry

3.2 发布包

在终端输入npm publish (这个命令也需要npm源为官方源)
发布成功后登录npm官网,在自己的账号上packages中就能看到自己发布的包了。

要点

main和module字段的意义

1. main:
main字段指定了包的入口点,即其他程序要引用该包时使用的主文件。
传统上,main字段指向一个CommonJS模块(使用require()引入)。
大多数Node.js应用和传统浏览器环境使用main字段引入包。
2. module:
module字段指定了一个ES6模块(使用import/export语法)作为包的入口点。
现代浏览器和一些Javascript打包工具(如Webpack、Rollup)能够识别并使用module字段来加载ES6模块。
使用ES6模块语法可以获得更好的静态分析和tree-shaking性能。
总的来说:
main是为了支持CommonJS模块的传统方式,module则是为了支持ES6模块的现代方式
当包同时提供CommonJS和ES6模块时,通常会同时设置main和module字段。这样可以让应用根据自身的打包工具和模块系统来选择合适的入口点。

总结

npm 包其实就是一个组件或者方法或文件,使用npm的发布命令publish,其实本质上就是把这些上传到npm仓库进行统一化管理,当你在开发项目的过程中,你可以根据自己的需求把相应的包拉取到你的项目中进行使用;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容