Vue组件库出现$listeners is readonly等错误的原因及预防方法
根本原因是因为组件库的package.json中dependencies包含了vue包,然后导致最后打包出来的组件库也包含vue包然后和引用这个组件库的项目中的vue发生冲突。举个例子,project1是vue组件库,package.json中dependencies包含了"vue":“2.6.1”project1打包出了"project1":“0.0.1” 这个组件包。
本文主要是面向写组件库的人士,而不是组件库的使用人士。
出现原因
根本原因是因为组件库的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)