(一)创建npm账号
- 在npm官网(www.npmjs.com/ )注册并创建npm账号
(二)创建npm包
首先说明一下,该文章是基于vite和ts发布的一个npm包,发包的核心是package.json
- 新建一个空文件夹,在该文件夹中创建一个项目:
npm create vite ly-card - 进入自己的项目:
cd ly-card - 在项目中的components文件夹中,新建自己将要封装并抛出的组件,我们可以起名叫Card.vue
<template>
<div>
<div :list="props.list" v-for="item in props.list" @click="itemClick(item.name)">{{item.name}}</div>
</div>
</template>
<script setup lang="ts">
const props = defineProps(['list']) // 接收传入的变量
const emit = defineEmits(["itemClick"]) // 声明触发的事件
const itemClick = ( e: string) => {
emit('itemClick', e)
}
</script>
- 根目录新建index.ts文件
import { App } from "vue"
import Card from './src/components/Card.vue' // 引入我们写的组件
export default {
install(app: App){
app.component('card', Card) // 这里的name名很重要,他是未来标签名,供我们消费时使用,类似于我们使用Element-UI中的<el-button></el-button>
}
}
- 配置vite.config.ts文件
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import {resolve} from 'path'
export default defineConfig({
plugins: [vue()],
build:{
outDir:'dist',
lib: { // 设置打包出来的文件
entry: resolve(__dirname, './index.ts'), // 组件编译时的入口文件
name: 'card', // 项目名
fileName: 'card' // build打包后生成的dist文件夹中的文件名
formats:['es']
},
rollupOptions:{ // 打包时的配置
external:["vue"], // 打包过程中不会对这些外部模块进行打包,而是从外部直接加载
output:{ // 构建时的输出配置
globals:{
vue:"Vue"
}
}
}
}
})
- 配置package.json文件:(这里是发包的核心,主要关注private,version,main,files属性)
{
"name": "ly-card", // 发布后的包名 (也就是我们日常npm上搜索的项目名)
"private": false, // 是否私有 (设置false,如果设置成true是不允许npm发布的)
"version": "0.0.6", // 版本号 (每次npm发布都要修改,否则会报错,发布失败)
"description": "版本描述",
"main": "dist/card.js", // 主入口文件
"files": [ // 需要上传到npm的文件(一般是dist目录下的文件,也可根据需要配置)
"dist/*"
],
"keywords": ["",""], // 在npm上可搜索的关键字
"author": "weitiantian",
"type": "module",
"repository": { // 仓库
"type": "git",
"url": ""
},
"scripts": {
"dev": "vite",
"build": "vue-tsc && vite build",
"preview": "vite preview"
},
"dependencies": {
"vue": "^3.3.4"
},
"devDependencies": {
"@vitejs/plugin-vue": "^4.2.3",
"typescript": "^5.0.2",
"vite": "^4.4.5",
"vue-tsc": "^1.8.5"
}
}
- 打build包:执行命令:
npm run build,这时候会在项目中生成一个dist文件夹
当然,我们也可以对将要发布的包进行配置:
- cd dist // 进入dist文件夹
- npm init -y // 生成package.json文件
- 在package.json文件中进行如下配置
{
"name": "ly-card", // 包名
"version": "0.0.6", // 包版本
"description": "",
"main": "card.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
(三)发布npm包
- 登录npm:执行命令
npm login,这时候会提示你输入邮箱和密码,按照步骤操作即可 - 发布npm包: 执行命令
npm publish,下图代表发布成功:
发包注意事项:
- 发布前保证npm上没有跟你相同的包名,否则无法发布。
- 同一个包名,每次发布的版本号不可重复。
(四)下载消费npm包
- 下载:
npm install ly-card - 全局注册:
import App from './App.vue'
import LyCard from 'ly-card'
const app = createApp(App)
app.use(LyCard)
- 使用组件:
<template>
<Card/>
</template>
好了,到此为止,这就是发布并消费npm包的全部过程。
mindmap
下面说一说我在发布包的过中遇到的几个坑:
情况一
原因:当前项目的包名,与npm上已有包名重复
解决方式:将package.json中的name名重新修改,重新发布
为了避免在发包时才发现问题,所以我们在发包前可以先检查一下npm上是否有相同的包名,在浏览器中输入www.npmjs.com/ly-card 进行检查:
- 若有内容,说明这个包名在npm上已存在,我们就得换个包名了
- 若出现下图这种情况,说明npm上没有该包,那么我们就可以放心发布了
情况二
原因:当前要发布的npm包版本号,之前已经用过了,不可以重复发布
解决办法:修改package.json中的version值
mindmap
另外,发布npm包常用的命令也总结一下:
-
发布npm包:
npm publish -
更新npm包:(更新成功会输出版本号,版本号自动加一,此更新只针对本地)
npm version ptch(补丁号,修复bug,小变动,如 v1.0.0->v1.0.1)npm version minor(次版本号,增加新功能,如 v1.0.0->v1.1.0)npm version major(主版本号,不兼容的修改,如 v1.0.0->v2.0.0)
-
删除npm包:
npm unpublish 包名(撤销已发布的版本) -
删除指定npm包:
npm unpublish 包名@1.0.2(删除成功会输出删除的本地版本号,对应服务器也会删除)