Vue组件库出现$listeners is readonly等错误的原因及预防方法

本文主要是面向写组件库的人士,而不是组件库的使用人士。

出现原因

根本原因是因为组件库的package.json中
dependencies包含了vue包,然后导致最后打包出来的组件库也包含vue包
然后和引用这个组件库的项目中的vue发生冲突。

举个例子,project1是vue组件库,package.json中dependencies包含了"vue":“2.6.1”
project1打包出了"project1":“0.0.1” 这个组件包
然后project2是项目代码,package.json中dependencies包含了"vue":“2.6.1"和"project1”:“0.0.1”
这样,在使用project1的组件时就会出现readonly错误

预防方法

这给我们写组件库一个启示,千万不要在package.json中dependencies包含了"vue"包

特殊场合

但有两种情况,你会在组件库中不自觉用到Vue对象
1.利用Vue的templateCompile,即模板编译器
2.利用Vue.component进行全局组件注册
首先第一点很简单,参考一下其他开源Vue库的实现,例如elementUI
在这里插入图片描述
在这里插入图片描述

发现引用了@vue/component-compiler-utils包和vue-template-compiler,然后查看用法
在这里插入图片描述在这里插入图片描述
这样就实现了不引入vue包的情况下,使用模板编译功能

2.如果是需要全局注册的情况就比较麻烦了,
例如组件库包含某个函数,需要全局注册组件

import Vue from "vue";
function test(name,component){
	Vue.component(name,component)
}

一般是像上面这么写的因此就不得不引入vue包。

我这的解决方法比较差,但也可以解决这个问题,如果各位看官有更好的方法求指导
我是这么处理的

import config from "./config.js"
function test(name,component){
	config.Vue.component(name,component)
}

config.js

export default {};

即,通过config.js这个空对象,
然后在引入组件包时,需要先对config.js对象进行vue注入
以下时引用包project1的时候添加config.js

import Vue from 'vue';
import {config}from 'project1';
config.Vue=Vue;

然后main.js

import './config.js';
import project1 from "project1";

当然,不清楚有没有Vue.component单独使用的vue的util库,如果有的话求推荐

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值