Vue组件库出现$listeners is readonly等错误的原因及预防方法
创始人
2024-05-30 23:11:38
0

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

出现原因

根本原因是因为组件库的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库,如果有的话求推荐

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...