iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >Vue组件文档怎么生成工具库
  • 707
分享到

Vue组件文档怎么生成工具库

2023-06-20 21:06:25 707人浏览 安东尼
摘要

这篇文章主要讲解了“Vue组件文档怎么生成工具库”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue组件文档怎么生成工具库”吧!目录解析.vue 文件提取文档信息提取组件名称、描述、prop

这篇文章主要讲解了“Vue组件文档怎么生成工具库”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue组件文档怎么生成工具库”吧!

目录
  • 解析.vue 文件

  • 提取文档信息

  • 提取组件名称、描述、props、methods、model

  • 提取描述

  • 提取 methods

  • 提取 props

  • 提取 model

  • 提取组件Events

  • 提取组件Slots

  • 结语

程序员最讨厌的两件事情,第一种是写文档,另一种是别人没有写文档。有没有直接根据vue组件生成文档的呢?当然是有的的。但第三方使用起来不一定能和现有项目结合使用,往往需要额外的注释用来标记提取信息。使用第三方的一些比较常见问题

  • 文档提取信息不全面,可能有些信息你需要提取但是它又不支持。这种情况下就只能修改三方的插件源码了。

  • 需要额为的注释信息来标记,例如 vuese 需要给方法 打 @vuese、@arg 等标记来提供方法信息。

俗话说自己动手丰衣足食,打造自己的vue文档生成工具与自己项目结合使用。一个组件文档大致需要提供 组件名称和描述(name)、组件属性(props)、组件方法(methods)、组件事件(event)、插槽(slot) 这几个部分,以及还需要这个几个部分的注释组成生成描述信息。接下来一步步实现对着几个部分的提取实现。

解析.vue 文件

一般一个.vue文件分三个部分 template、script、style、style部分的内容我们不需要,我们需要分别提取出 template 和 script 内容。Vue官方开发了 Vue-template-compiler 库专门用于Vue解析,我们可以直接使用它来解析提取.vue文件, Vue-template-compiler 提供了一个 parseComponent 方法可以对原始的Vue文件进行处理。

const compiler = require('vue-template-compiler')const result = compiler.parseComponent(vueStr, [options])// parseComponent 返回  template、script、style内容,export interface SFCDescriptor {  template: SFCBlock | undefined;  script: SFCBlock | undefined;  styles: SFCBlock[];  customBlocks: SFCBlock[];}

拿到各个部分文本后,还需要将它转成ast(抽象语法树),template 部分内容可以直接使用 Vue-template-compiler 提供的 compile 方法直接生成ast, script部分需要借助其他的生成ast了,这里使用 babel 的模块来处理 js 文本。

const compiler = require('vue-template-compiler')//vueStr .vue 文件内容const vue = compiler.parseComponent(vueStr)//生成html部分的 ast let template = compiler.compile(vue.template.content, {    preserveWhitespace: false,    comments: true // 生成注释信息})

使用 @babel/parser(Babel解析器,是Babel中使用的javascript解析器)来处理js 文本内容。

const parse = require('@babel/parser');//生成js部分的 astlet jsAst = parse.parse(vue.script.content, {    allowImportExportEverywhere: true })

提取文档信息

通过上一步的文件解析工作,我们成功获取到了Vue的模板ast和script中的js的ast,下一步我们就可以从中获取我们想要的信息了。这里需要使用到 @babel/traverse 这个工具,用来遍历 js ast 的节点工具。可以在这里查看 ast 的生成内容,方便查看各种节点信息。

const traverse = require('@babel/traverse');traverse.default(jsAst, {  enter(path){ // 开始  },  // 支持自定义节点 比如当节点类型 为 ExportDefaultDeclaration 时掉这个方法  ExportDefaultDeclaration(){  }})

提取组件名称、描述、props、methods、model

export default 生成的对应节点类型是 ExportDefaultDeclaration,declaration 属性就是对应的组件的 options 了,遍历 declaration 的属性可以获取到 name、props、methods、model 等节点信息。

Vue组件文档怎么生成工具库

示例

let componentInfo = {}traverse.default(jsAst, {  ExportDefaultDeclaration(path){    path.node.declaration.properties.forEach(item => {        switch (item.key.name) {            case 'props':                componentInfo.props = extractProps(item) // 提取 props                break;            case 'methods':                componentInfo.methods = extractMethods(item)  // 提取 methods                break            case 'name':                componentInfo.name = item.value.value // 获取组件名称                break            case 'model':                componentInfo.model = extractModel(item)  // 提取 model                break            default:                break;        }    });  }})

提取描述

js中注释分为单行和多行两种,生成ast也会生成不同类型的,可以看下面例子。

// 单行备注export default {}// 结尾注释

可以看到会 CommentBlock、 CommentLine 两种类型的节点,还有头部的会放在 leadinGComments 里,底部的注释在 trailingComments 里。

Vue组件文档怎么生成工具库

一般会把组件描述注释放在 export default 上面,简单提取注释信息

// ExportDefaultDeclaration 插入如下代码 if (path.node.leadingComments) {    componentInfo.desc = path.node.leadingComments.map(item => {        if (item.type === 'CommentLine') {            return item.value.trim()        } else {            return item.value.split('\n').map(item => item.replace(/[\s\*]/g, '')).filter(Boolean)        }    }).toString()}

提取 methods

因为 methods 中的注释需要额外描述 出参、入参等信息需要额外处理,jsdoc注释规范使用还是比较大众的,这里根据需要自己定义提取规则,还需要提取 async 用来标识是否是异步函数。

提取 props

props 的提取需要区分下面几种情况,default 和 validator 还是提取还是有点麻烦的,validator 校验还可以通过注释简单描述来提取,但是 default 就不好处理了。

{    propA: Number, // 只有类型    propB: [String, Number], // 只有类型但是支持多种    propC: {       type: String,      required: true    },    propD: {      type: Number,      default: 100 // 带有默认值     },    propE: {      type: Object,      default () { // 默认值 需要函数返回        return { message: 'hello' }      }    },    propF: {      default: function () { // 默认值 需要函数返回 和上面的 default 的 ast 节点类型是不同的        return { message: 'hello' }      }      validator: function (value) { // 校验        return ['success', 'warning', 'danger'].indexOf(value) !== -1      }    }}

我这里对 default 处理是借助 @babel/generator 将 default 转换代码, 通过eval转成函数调用返回会默认值。types 是 @babel/types 模块,用来判断节点类型的。

// 获取Props默认值function getDefaultVal (node) {    if (types.isRegExpLiteral(node) || types.isBooleanLiteral(node) || types.isNumericLiteral(node) || types.isStringLiteral(node)) {        return node.value    } else if (types.isFunctionExpression(node) || types.isArrowFunctionExpression(node) || types.isObjectMethod(node)) {        try {            let code = generate.default(types.isObjectMethod(node) ? node.body : node).code            let fun = eval(**0,${types.isObjectMethod(node) ? 'function ()' : ''} $[code]**)            return JSON.stringify(fun())        } catch (error) {        }    }}

提取 model

这个比较简单,直接获取就可以了。

提取组件Events

组件的事件没法直接获取到对应节点,只能通过 $emit 方法来定位事件位置,在 traverse 中可以使用 MemberExpress(复杂类型节点),然后通过节点上的属性名是否是 $emit 判断是否是事件。

Vue组件文档怎么生成工具库

可以看到事件名称在 MemberExpress 父级上的 arguments 里,而备注则在更上一层的里。

const extractEvents = (path) => {    // 第一个元素是事件名称    const eventName = path.parent.arguments[0];     let comments = path.parentPath.parent.leadingComments    return {        name: eventName.value,        desc: comments ? comments.map(item => item.value.trim()).toString() : '——'    }}MemberExpression (path) {    // 判断是不是event    if (path.node.property.name === '$emit') {        let event = extractEvents(path)        !componentInfo.events && (componentInfo.events = {});        if (componentInfo.events[event.name]) {            componentInfo.events[event.name].desc = event.desc ? event.desc : componentInfo.events[event.name].desc        } else {            componentInfo.events[event.name] = event        }    }}

在成功获取到Events后,那么结合Events、Props、Model,就可以进一步的判断属性是否支持 .sync 和 v-model。

提取组件Slots

首先需要写一个对Vue模板的ast遍历的函数,Vue-template-compiler 没有提供类似于 @babel/traverse 用来 遍历 ast 的。

简单实现个遍历模板抽象树函数

const traverserTemplateAst = (ast, visitor = {}) => {    function traverseArray (array, parent) {        array.forEach(child => {            traverseNode(child, parent);        });    }    function traverseNode (node, parent) {        visitor.enter && visitor.enter(node, parent);        visitor[node.tag] && visitor[node.tag](node, parent);        node.children && traverseArray(node.children, node);        visitor.exit && visitor.exit(node, parent);    }    traverseNode(ast, null);}

Vue模板的ast的结构还是比较清晰的,没有js ast 那么多的类型,只需要区分不同tag就可以了。注释会单独一个节点,所以在查找 slot 节点时候,还需要去找它上一个相邻节点,判断是否是注释。

Vue组件文档怎么生成工具库

traverserTemplateAst(template.ast, {    slot (node, parent) {        !componentInfo.slots && (componentInfo.slots = {})        // 获取节点位置        let index = parent.children.findIndex(item => item === node)        let desc = '无描述', name = '-';        if (index > 0) {            let tag = parent.children[index - 1]            // isComment 判断是否是 注释            if (tag.isComment) {                desc = tag.text.trim()            }        }        if (node.slotName) name = node.attrsMap.name        componentInfo.slots[name] = {            name,            desc        }    }})

结语

到这里简单的实现了自动化生成vue组件信息了,当然还有几种情况还没有考虑进去,例如事件$emit 在 template 中,slot 在 render 函数中时候的情,不过提取这部分实现也是大同小异的了。可以在这里查看 本文源码。

感谢各位的阅读,以上就是“Vue组件文档怎么生成工具库”的内容了,经过本文的学习后,相信大家对Vue组件文档怎么生成工具库这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: Vue组件文档怎么生成工具库

本文链接: https://www.lsjlt.com/news/300149.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Vue组件文档怎么生成工具库
    这篇文章主要讲解了“Vue组件文档怎么生成工具库”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue组件文档怎么生成工具库”吧!目录解析.vue 文件提取文档信息提取组件名称、描述、prop...
    99+
    2023-06-20
  • Vue组件文档生成工具库的方法
    目录解析.vue 文件 提取文档信息 提取组件名称、描述、props、methods、model 提取描述 提取 methods 提取 props 提取 model 提取组件Even...
    99+
    2024-04-02
  • vue组件文档生成备注详解
    目录vue组件文档生成备注内容实现Vuese自动生成vue组件文档安装Vuese在根目录下新增配置文件 .vueserc在package.json新增脚本,并启动vue组件文档生成备...
    99+
    2024-04-02
  • 解析如何自动化生成vue组件文档
    目录一、现状二、社区解决方案2.1、业务梳理三、技术方案3.1、Vue文件解析3.2、信息提取3.2.1、可直接获取的信息3.2.2、需要约定的信息四、总结五、展望一、现状 Vue框...
    99+
    2024-04-02
  • 如何使用工具生成 Golang 函数文档?
    命令 godoc -markdown=index.md 可生成 go 函数文档,通过打开生成的文件 index.md 查看文档。具体步骤为:1. 保存 go 文件;2. 运行命令 god...
    99+
    2024-05-06
    自动化 golang
  • React组件文档化工具有哪些
    这篇文章主要介绍了React组件文档化工具有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。如果没有人能够理解并找到如何使用我们的组件,那它们有什么用呢?React鼓励我们...
    99+
    2023-06-14
  • SpringBoot的API文档生成工具SpringDoc使用详解
    目录前言SpringDoc简介使用集成从SpringFox迁移结合SpringSecurity使用测试常用配置总结参考资料前言 之前在SpringBoot项目中一直使用的是Spri...
    99+
    2024-04-02
  • 如何使用 GoDoc 工具生成 Golang 函数文档?
    godoc 工具可以通过以下步骤生成 golang 函数文档:为函数编写包含函数签名和描述的注释。运行 godoc 命令(godoc -http=:6060)生成文档。在浏览器中访问生成...
    99+
    2024-04-18
    函数文档 godoc golang
  • Golang怎么生成Excel文档
    这篇文章主要介绍Golang怎么生成Excel文档,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!关于 Excelize 库Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 E...
    99+
    2023-06-15
  • Sphinx怎么生成python文档
    本篇内容主要讲解“Sphinx怎么生成python文档”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Sphinx怎么生成python文档”吧!前言Sphinx是一款支持多种编程语言的文档生成工具...
    99+
    2023-06-29
  • php怎么生成word文档
    可以使用PHP库PHPWord来生成和操作Word文档。以下是一个简单的示例: 首先,你需要安装PHPWord库。可以通过Comp...
    99+
    2024-03-15
    php
  • golang组件swagger生成接口文档的方法
    这篇文章主要介绍“golang组件swagger生成接口文档的方法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“golang组件swagger生成接口文档的方法”文章能帮助大家解决问题。swagge...
    99+
    2023-06-30
  • Golang函数的注释和文档生成的方法和工具
    作为一种高效、可靠、易于学习和使用的编程语言,Golang(以下简称Go)越来越受到开发者们的青睐。在使用Go编写代码时,经常需要编写注释、生成文档,而这些都是非常重要的程序开发流程中的一部分。因此,我们需要了解Golang函数的注释和文档...
    99+
    2023-05-17
    Golang 函数注释 文档生成工具
  • golang组件swagger生成接口文档实践示例
    目录swagger介绍gin-swagger实战第一步:添加注释第二步:生成接口文档数据第三步:引入gin-swagger渲染文档数据swagger介绍 Swagger本质上是一种用...
    99+
    2024-04-02
  • html文档怎么组成的
    这篇文章主要介绍了html文档怎么组成的,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。html文档由标记、头部和主体三部分组成。html文件是可以被多种网页浏览器读取、产生网...
    99+
    2023-06-06
  • 使用java怎么自动生成数据库文档
    今天就跟大家聊聊有关使用java怎么自动生成数据库文档,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、引入pom.xml依赖<dependencies> &n...
    99+
    2023-06-15
  • 怎么用flask生成swagger文档
    这篇文章主要讲解了“怎么用flask生成swagger文档”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用flask生成swagger文档”吧!flas...
    99+
    2024-04-02
  • 怎么通过yarn自动生成vue组件
    这篇文章主要介绍“怎么通过yarn自动生成vue组件”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么通过yarn自动生成vue组件”文章能帮助大家解决问题。实践步骤安装一下chalk,这个插件能让...
    99+
    2023-07-04
  • MDK(keil)工具:如何使用MDK生成bin文件
    要使用MDK(Keil)工具生成bin文件,您可以按照以下步骤进行操作:1. 打开Keil MDK开发环境,选择或创建您的工程文件。...
    99+
    2023-09-20
    MDK
  • 一个在线ER模型设计工具:支持数据库设计、生成、反向工程、优化和文档生成等操作
    ER模型介绍 ER模型,即实体关系模型,是数据库建模的一种重要方法。它可以帮助开发人员更好地理解数据库结构,并确定数据库的概念模型。在本文中,我们将详细介绍ER模型设计的基本概念和过程。 首先,我们需要了解ER模型中的两个基本概念:实体...
    99+
    2023-09-02
    数据库 mysql 在线ER模型制作 Powered by 金山文档
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作