vue 判断两对象是否一致_你的.vue文件就已经是你的文档了

f38fe120c5c98ed959ca7344254e28e4.png

更新:文档地址:http://vuese.org

昨天发布了vuese1.0,这是我的一个新的开源项目,用来解析Vue SFC并生成markdown文档,如下:

HcySunYang/vuese​github.com
4ad831e4a21583c96ababdd9b2b4b2e4.png

这篇文章不会介绍如何使用,至于如何使用大家可以查看 readme,这里我们主要说一说实现的思路。

一、动机

你或者你的团队也许会有一套自己的组件库(或者是单纯的一个组件),通常当你开发完一个组件之后,你需要手动的编写markdown文档,从而让其他人了解组件是如何使用的。这里的问题在于:假若组件不停的在更新,你就必须要不停的手动维护对应的文档,使其与组件的功能保持一致。实际上这个过程是有些恶心 的,那么有什么更好的办法吗?基于此我才开发了 vuese 。

二、想法

我们知道一个 vue 组件所暴露的接口无非是 propseventsslots(或scopedSlots) 以及部分 methods。那我们可不可以实现一个工具帮助我们分析一个vue组件并提取这些信息呢?然后自动生成文档,这样无论组件如何改动我们都不需要手动维护文档了,只需要使用该工具重新生成即可。

三、基本思路

对于一个 vue 组件,如果我们抛开 style 和自定义块,那么它由两部分组成,即:模板 和 script 块。甚至如果使用 render 函数代替模板的话,那么就只剩一下一个 script 了。

对于 props,methods 它们只能在 scirpt 块内定义,如:

props: {name: String
}
methods: {clear () {/*...*/}
}

而对于 slots 则既可以在 script 块内定义,也可以在模板中定义,如:

<!-- 在模板中定义 -->
<div><slot name="header" />
</div>
// 在 script 块内定义了 slots
render (h) {return h('div', this.$slots.header)
}

以上两种写法是等价的,所以在提取 slots 信息时即需要考虑模板中的slots,也要兼容 script 块内的 slots。

而且在函数式组件中,以下内容都应该作为 slots 处理:

// ctx.slots()
render (h, ctx) {return h('div', ctx.slots().xxx)
}// ctx.children
render (h, ctx) {return h('div', ctx.children)
}

这也是我们在提取slots信息时需要考虑在内的。

同样的,对于 events 而言也是既可以出现在模板中,又可以出现在 script 块中,如下:

<!-- 模板中的 events -->
<div @click="$emit('onclear')"></div>
// 定义在 script 中的事件
methods: {someMethod () {this.$meit('onclear')}
}

所以在提取 events 信息时也需要即考虑模板又考虑 script 块。

对于模板我们默认是 html 语法,对于 script 块我们默认为 js。我们要做的第一件事儿就是将 html 和 js 单独提取出来并单独分析,好在巨人的肩膀厚实,已经有了 @vue/component-compiler-utils 模块和 vue-template-compiler 模块。其中我们使用 @vue/component-compiler-utils 模块解析 vue SFC 并分别得到 html(模板) 和 JavaScript(script块) 的源码。对于 html 源码我们可以再次使用 vue-template-compiler 模块将其解析为模板对应的 AST,然后通过编写一个 traverse 函数对其进行分析,读取slots相关的内容。

而对于 JavaScript 源码的处理,我选择了使用 babel7,写过 babel 插件的同学或许已经猜到了实现的思路。我们将源码交由 @babel/travers 模块处理,然后通过编写一些 helper 函数来辅助我们判断出哪些是要真正处理的内容即可,如下源码段所示:

const mainTraveres = {ObjectProperty(path: any) {// Processing nameif (isVueOption(path, 'name')) {if (onName) onName(path.node.value.value)}// Processing propsif (isVueOption(path, 'props')) {// 一些逻辑}// more...}
}

其中 isVueOption 函数是我们自己编写的 helper 函数,来辅助我们判断一个对象的属性是否是 Vue 选项对象中的特定属性,如果是我们就进一步处理就可以了,对于 js 的处理基本都是这个思路,更多内容大家可以查看源码:https://github.com/HcySunYang/vuese/blob/master/src/parser/parseJavascript.ts

四、生成目标

经过上一步的处理,我们可以编写出一个 parser 模块,解析并组装出我们需要的内容,有了需要的内容之后,我们就可以根据这些信息编写一个 Render 模块,本质就是一个代码生成的过程,至于生成的内容是什么这取决于你想要的目标,vuese 内置的 Render 会根据这些信息为你生成 markdown 文件,或者生成一个集成 docute 的文档。但实际上只要你脑洞够大你可以生成任何东西,试想一下,如果我们的 parser 模块编写的更加完善,对一个 vue 组件的分析足够细致,这样我们就能拿到一个 vue 组件全部的信息,然后在代码生成阶段将其生成一个 ts compatible 的组件,这不就实现了一个将非js编写的vue组件转换为ts兼容的vue组件的插件了吗?(备注:后来一哥们儿提供了一个更好的办法来实现这件事儿,为了避免尴尬,我只能说这也是一个思路嘛......)

回到 vuese 内置的 Render 模块,Render 的结果就是markdown资源,本质就是一个字符串拼接的过程,具体可以查看源码 https://github.com/HcySunYang/vuese/blob/master/src/render/index.ts ,并不复杂。

实际上 vuese 提供了很多有用的信息和文档中没有体现出来的功能,这多会在后续逐渐补充。举个例子,使用 vuese 生成的markdown文件大致如下:

2bfa54fa87768456b120240f11c43076.png

你可能已经注意到了,在上面的 markdown 文件中包含了很多诸如:

<!-- @vuese:CompName:props:start -->

<!-- @vuese:CompName:props:end -->

之类的注释,它的作用是告诉 vuese 在生成文档时要将生成的 markdown 代码放置在什么位置,如果一个组件还没有对应的markdown文档,则新生成之,否则会在已有的文档基础上更新。这么做的目的是出于真正使用场景的考虑,因为一个组件的文档不可能仅仅包含上图中展示的内容,它还可能包含开发者自己编写的demo,和其他描述内容。这样我们生成文档的时候就不会覆盖掉开发者自己编写的内容,而是将生成的内容插入到指定的位置。

五、规划

目前 vuese 已经实现的特性如下:

5c2392ee33fb503cb3c0afb305ddde74.png

规划中要实现的特性如下:

a2bc27d96e2e0185e0e93e9f48d431ad.png

另外目前还不支持插件系统,这也在未来的规划当初。并且在我们团队内部已经将其应用在内部的组件库的文档维护,也计划关注 vue3.0 并兼容之。最后 vuese 刚刚发布有诸多不足之处,但是随着后续的更新迭代,它会变得越来越好,也欢迎感兴趣的同学共建。

其他规划:模板支持 pug、插件系统、还有啥??????

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/527472.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

centos7 oracle_Centos7主机名变成bogon的原因及解决方法

问题描述虚拟机在设置完静态IP后&#xff0c;莫名其妙地主机名就变成了bogon&#xff0c;并且问题会稳定复现&#xff0c;就是说每次重启都会。如下图所示&#xff1a;看着不顺眼不说&#xff0c;听说可能还会影响某些服务&#xff0c;如可能导致oracle安装过程网络配置出错等问…

get 参数太长怎么办_新买的手表表带太长了该怎么办?表带调节操作方法get你~...

表表哥点击☝上方蓝字关注我们表带是手表的重要组成部分&#xff0c;同时表带决定着手表佩带的舒适性&#xff0c;方便性&#xff0c;对手表的安全也有关系。现在表带的材质也很多&#xff0c;最常见的就是不锈钢的和真皮的。买过手表的人应该都知道&#xff0c;只有是专门定制…

python pandas合并多个excel_python pandas合并多个excel(xls和xlsx)文件(弹窗选择文件夹和保存文件)...

# python pandas合并多个excel(xls和xlsx)文件&#xff08;弹窗选择文件夹和保存文件&#xff09; import tkinter as tk from tkinter import filedialog import os import pandas as pd import glob root tk.Tk() root.withdraw() # 选择文件夹位置 filelocation os.path.n…

elasticsearch初次查询超时_ElasticSearch的工作流程

1.ElasticSearch的工作流程​ 1.启动过程​ 当ElasticSearch节点启动时&#xff0c;使用发现(discovery)模块来发现集群中的其他节点(配置文件的集群名称)并连接.ElasticSearch会发送广播&#xff0c;以找到相同集群名称其他节点。​ 集群选举一个节点为主节点。该节点负责分发…

modbus slave如何使用_【干货】如何进行PLC远程监控?只需三个步骤,马上帮你解决问题!...

工厂里的工程师小威最近真的很头痛&#xff0c;公司客户的一台或多台设备分布在不同的地区或国外&#xff0c;如果要对其PLC、HMI等自控产品进行远程控制、调试和维护。除了问题&#xff0c;经常要千里迢迢奔赴国外进行维护。最近有事特殊时期&#xff0c;国外疫情比较乱套&…

智能卡门禁管理系统_出入口门禁控制系统与消防火灾报警系统怎么联动?

门禁系统作为一个控制进出的设备&#xff0c;在发生火灾时如何快速打开所有防火逃生门时&#xff0c;是需要弱电单位对门禁系统要行动考虑&#xff0c;否则容易出现隐患&#xff0c;万一出现火灾&#xff0c;因为门禁是常闭门造成人员无法快速逃生那是肯定要负一定的责任的。如…

两表格合并_六个高效办公Excel小技巧,让你提前下班两小时!

每天下午一点&#xff0c;PPT技能进步一点大家中午好呀&#xff01;大家好这是我们的抖音号PPT模板抖音搜索“PPT1080”就可以啦更多福利等你来拿&#xff01;小编发现抖音里无奇不有有关于Excel的小知识点也很多今天就带大家盘点一下抖音里最火爆的6个Excel小技巧点滴积累可以…

mybatis获取表名_mybatis plus 的动态表名的配置详解

mybatis plus简介详见mybatis plus的官网业务要求业务上要求存储数据的时候根据某个字段动态的选择数据要存储的表.如根据code字段: code->[1001,1002]来进行选择存储的表:经过下面的配置实现动态表名如 --> table1_1001,table_1002的效果.以此动态生成表名的效果.具体实…

python能做数据库开发吗_5分钟快速入门,用Python做SQLite数据库开发,附代码适合初学...

1. 它是内置的,不需要安装,节省很多麻烦。2. 使用方便,不需要复杂的连接配置,打开本地文件一样简单。3.方便转移。数据库是一个文件。复制、传输和删除可以很容易地处理。4所示。轻量级的性能比大多数其他数据库应用程序。5. 完整的SQL语言支持类似于其他SQL数据库。学习后,很容…

卷的作用_还在盲目的制作蛋糕卷吗?先来搞懂这几种蛋糕卷面糊~

柔软湿润的蛋糕卷制作简单&#xff0c;可以随意搭配各种柔滑的馅料使得蛋糕卷的口味变化多端。不分男女老少&#xff0c;任谁都能恣意品尝&#xff0c;只要随手一切&#xff0c;你一块我一块地与人一同享用&#xff0c;其乐融融。蛋糕卷の基础材料要做好蛋糕卷首先要认识基本材…

spring elasticsearch 按条件删除_实战:项目数据源转为Elasticsearch

原本项目是基于MYSQL的&#xff0c;现因需求将其转换为MYSQLElasticsearch&#xff0c;MYSQL的ORM使用的是Spring Data Jpa&#xff0c;Mybatis的转换与其类似&#xff0c;有人看再更先看原项目原项目的DAO层Repository public interface UserRepository extends JpaRepository…

android接口类命名规范_超全面的UI基础设计规范来啦,还不收藏 ~

写在前面的话 很多刚入行的UI设计师开始接触移动端UI设计的时候&#xff0c;对于基础的界面尺寸规范可能会有一定的模糊认知&#xff0c;导致做出来的界面往往会感觉不是那么和谐&#xff0c;却也不知道怎么去完善和改进。对于大多数的刚入行者来说&#xff0c;如果不是有天赋…

mysql按升序创建索引_MySQL 降序索引

MySQL 降序索引简介&#xff1a;在本教程中&#xff0c;您将了解MySQL降序索引以及如何利用它来提高查询性能。MySQL降序索引简介降序索引是以降序存储键值的索引。在MySQL 8.0之前&#xff0c;您可以DESC在索引定义中指定。但是&#xff0c;MySQL忽略了它。与此同时&#xff0…

python开源项目新手_10大Python开源项目推荐(Github平均star2135)

翻译 | suisui出品 | AI科技大本营(公众号ID&#xff1a;rgznai100)继续假日充电系列~本文是 Mybridge 挑选的 10 个 Python 开源项目&#xff0c;Github 平均star 2135&#xff0c;希望你能够喜欢~~▌Rank 1&#xff1a;Requests-HTML v0.9(7385 stars on Github&#xff0c;来…

layer中嵌套的页面如何操作父页面_vue中8种组件通信方式,值得收藏

有不少网友提出组件之间通信方式还有很多, 这篇文章便是专门总结组件之间通信的vue是数据驱动视图更新的框架, 所以对于vue来说组件间的数据通信非常重要&#xff0c;那么组件之间如何进行数据通信的呢&#xff1f; 首先我们需要知道在vue中组件之间存在什么样的关系, 才更容易…

镜头视场角计算工具_再谈远心镜头的设计及其独特的性能

1.远心镜头的设计与对比镜头可以分为非远心和远心&#xff1b;远心镜头也可以分为物方远心、像方远心和双远心。相关概念的简单说明&#xff1a;孔径光阑在物空间的像称为入射光瞳。同样&#xff0c;孔径光阑被其后面的光学零件成在像空间的像&#xff0c;称为出射光瞳。入射光…

收到一个机器人txt微盘_经阁-第一章 吞了个机器人-爱阅小说网

第一章 吞了个机器人莫金无奈的感叹着自己的命运&#xff0c;八岁之前他乞讨为生&#xff0c;之后遇到好心人收养&#xff0c;没想到五年后他又要开始无父无母的生活了。只是这下他身后还有个拖油瓶的妹妹。义父、义母穷苦了一辈子&#xff0c;临了也没给莫金留下丁点儿值钱的东…

高斯核函数python代码_单类SVM:SVDD

话接上文(SVM的简单推导)&#xff0c;这篇文章我们来看单类SVM&#xff1a;SVDD。可能大家会觉得很奇怪&#xff0c;我们为什么需要单分类呢&#xff1f;有篇博客举了一个很有意思的例子。花果山上的老猴子&#xff0c;一生阅猴无数&#xff0c;但是从来没有见过其它的物种。有…

collector list 多个分组_【S01E07】groupby方法、GroupBy对象、groupby方法的分组键

Hadley Wickham&#xff08;许多热门R语言包的作者&#xff09;创造了一个用于表示分组运算的术语"split-apply-combine"&#xff08;拆分-应用-合并&#xff09;&#xff0c;这个词很好的描述了整个过程。分组运算的第一个阶段&#xff0c;pandas对象&#xff08;无…

清理垃圾代码bat_来买个小内存u盘么咯?盘内带电脑垃圾清理.bat那种丨heibai.org...

在某宝个别店铺购买了小内存u盘到货后插入电脑&#xff0c;发现自带了一个名为电脑垃圾清理的小程序。对就是这货怀揣着这家店真好&#xff0c;还带了垃圾清理软件的想法&#xff0c;我试着运行了软件.但是好像没有卵用.正好小表弟好像对这个比较了解&#xff0c;我去问问他咋回…