vue封装组件库并上传到npm

本文详细介绍了如何将Vue项目的重复组件封装成独立的组件库,并发布到npm,以便于在多个项目中复用。通过创建新项目、调整目录结构、编写组件和安装方法、配置webpack、更新package.json以及执行发布命令,实现了一次编写,到处使用的高效开发模式。

最近公司的几个项目中,经常会出现重复的组件,一开始还好,但是项目多起来以后,每一次改动,都要在不同项目中更改一次,很麻烦也容易出错,所以自己就花时间研究了一下封装组件库上传到npm。这样每次只需要改这个组件库,然后在不同的项目中,通过npm uppdate xxx即可。下面是具体的步骤

1.创建一个项目

vue create mylib

2.把项目中现有的src包名改成example,然后新增两个目录,一个是packages,用于存放组件,一个是src, 用于写index.js文件。项目结构。

在这里插入图片描述

3.packages的里面新建一个colortext文件,在里面新建一个index.js,在同级再建一个src文件,里面写ColorText.vue。具体层级如下:

在这里插入图片描述

4.ColorText.vue
<!-- color-button.vue -->
<template>
	<span :style="{'color': color}">{{text}}</span>
</template>

<script>
	export default {
		name: 'ColorText',
		props: {
			color: {
				type: String,
				default: '#999999'
			},
			text: {
				type: String,
				default: ''
			}
		},

	}
</script>

<style>

</style>

5.colortext的index.js
// 导入组件,组件必须声明 name
import ColorText from './src/ColorText.vue'

// 为组件提供 install 安装方法,供按需引入
ColorText.install = function (Vue) {
  Vue.component(ColorText.name, ColorText)
}

// 默认导出组件
export default ColorText
6.根目录下src文件里的index.js
//第三方库
import Vue from 'vue'
import Element from 'element-ui'
import VueAwesomeSwiper from 'vue-awesome-swiper'
import 'swiper/css/swiper.css'
import 'element-ui/lib/theme-chalk/index.css';
//自己的组件
import xxx from '../packages/xxx/index.js'
import xxx from '../packages/xxx/index.js'
import xxx from '../packages/xxx/index.js'
import xxx from '../packages/xxx/index.js'
import ColorText from '../packages/colortext/index.js'

// 存储组件列表
const components = [
	ColorText,
	xxx,
	xxx,
	xxx,
	xxx
]
Vue.use(Element)
Vue.use(VueAwesomeSwiper)
/* 
  定义install 方法,接收Vue作为参数,如果使用use注册插件,则所有的组件都将被注册
*/
const install = function(Vue) {
	// 判断是否安装
	if (install.installed) {
		return
	}
	// 遍历所有组件
	components.map(item => {
		Vue.component(item.name, item)
	})

}
// 判断是否引入文件
if (typeof window !== 'undefined' && window.Vue) {
	install(window.Vue)
}
export default {
	install,
	...components
};

7. vueconfig.js
module.exports = {
  // 修改 src 目录 为 examples 目录
  pages: {
    index: {
      // page 的入口
      entry: 'examples/main.js',   // 把src 修改为examples
      // 模板来源
      template: 'public/index.html',
      // 在 dist/index.html 的输出
      filename: 'index.html'
    }
  },
  // 扩展 webpack 配置,使 packages 加入编译
  /* chainWebpack 是一个函数,会接收一个基于 webpack-chain 的 ChainableConfig 实例。允许对内部的 webpack 配置进行更细粒度的修改。 */
  chainWebpack: config => {
    config.module
      .rule('js')
      .include
        .add(__dirname + 'packages')  // 注意这里需要绝对路径,所有要拼接__dirname
        .end()
      .use('babel')
        .loader('babel-loader')
        .tap(options => {
          // 修改它的选项...
          return options
        })
  }
}

8.package.json
{
	"name": "xxx",
	"version": "1.1.3",
	"description": "this is my lib",
	"main": "lib/xxx.umd.min.js",
	"private": false,
	"scripts": {
		"lib": "vue-cli-service build --target lib --name xxx --dest lib src/index.js",
		"serve": "vue-cli-service serve",
		"build": "vue-cli-service build",
		"lint": "vue-cli-service lint"
	},
	"dependencies": {
		"axios": "^0.21.1",
		"core-js": "^3.6.5",
		"element-ui": "^2.15.5",
		"swiper": "^5.4.5",
		"vue": "^2.6.11",
		"vue-awesome-swiper": "^4.1.1",
		"vue-router": "^3.2.0"
		
	},
	"devDependencies": {
		"@vue/cli-plugin-babel": "~4.5.0",
		"@vue/cli-plugin-eslint": "~4.5.0",
		"@vue/cli-plugin-router": "~4.5.0",
		"@vue/cli-plugin-vuex": "~4.5.0",
		"@vue/cli-service": "~4.5.0",
		"babel-eslint": "^10.1.0",
		"eslint": "^6.7.2",
		"eslint-plugin-vue": "^6.2.2",
		"vue-template-compiler": "^2.6.11"
	},
	"eslintConfig": {
		"root": true,
		"env": {
			"node": true
		},
		"extends": [
			"plugin:vue/essential",
			"eslint:recommended"
		],
		"parserOptions": {
			"parser": "babel-eslint"
		},
		"rules": {}
	},
	"browserslist": [
		"> 1%",
		"last 2 versions",
		"not dead"
	]
}

只需要把xxx换成你组件的名称就可以了。我的组件中也用到了一些第三方库比如axios,element-ui等,不是必须的,也可以不引入。

9.依次执行npm run lib,npm publish即可(如果没注册登录需要先注册登录npm login)。
### 封装和发布 Vue 组件库npm #### 准备工作 为了确保组件库能够顺利运行,建议先在本地环境中进行全面测试。完成开发后,执行构建命令 `npm run build` 来编译项目,这将会创建一个名为 `dist` 的目录用于存放打包后的文件[^1]。 接着通过 `npm pack` 命令生成 `.tgz` 文件来进行本地包的验证,确认一切正常后再继续后续操作。 #### 创建入口文件 对于整个组件库而言,通常会在根目录下建立一个统一的入口文件(如 `index.js`),该文件负责批量导入各个独立组件,提供一种简便的方式来让使用者一次性加载所有组件: ```javascript // packages/index.js import OakButton from '../packages/oak-button/index.vue'; const components = [ OakButton, ]; components.forEach(component => { component.install = Vue => { Vue.component(component.name, component); }; }); export default { install(Vue) { components.forEach(component => { Vue.use(component); }); }, }; ``` 此部分代码实现了对多个自定义组件的一键式安装功能[^3]。 #### 发布流程 当所有的准备工作完成后,就可以准备向 NPM 注册推送自己的组件库了。在此之前,请务必确保已经拥有有效的 NPM 账号以及完成了必要的身份认证步骤。 使用如下命令正式提交版本更新: ```bash npm publish ``` 一旦成功上传,开发者便可以在官方平台上找到对应的资源链接[^2]。 #### 安装与应用实例 其他开发者可以通过简单的指令快速集成已发布的 UI 库: ```bash npm i junsen-ui ``` 或者针对国内网络环境优化过的镜像源进行下载: ```bash npm --registry=https://registry.npmmirror.com install junsen-ui ``` 如果遇到任何潜在的问题,尝试清除缓存可能有所帮助: ```bash npm cache clean --force ``` 随后按照需求选择全局或局部的方式引入特定组件: - **全局方式** ```javascript import junsenUI from 'junsen-ui'; Vue.use(junsenUI); ``` - **按需方式** ```javascript import { Jbutton, Jform, JformItem } from 'junsen-ui'; // 单个文件内注册... export default { name: 'ExampleComponent', components: { Jbutton, Jform, JformItem, } }; // 或者在 main.js 中集中管理依赖关系... import { Jbutton, Jform, JformItem } from 'junsen-ui'; Vue.component('Jbutton', Jbutton); Vue.component('Jform', Jform); Vue.component('JformItem', JformItem); ``` 这样既提高了灵活性又减少了不必要的体积开销。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值