我的编程空间,编程开发者的网络收藏夹
学习永远不晚

tdesignvue初始化组件源码解析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

tdesignvue初始化组件源码解析

前言

Tdesign-vue 是一由腾讯开源的 Vue.js 组件库。我们知道,这些大型的组件库业务覆盖面很广,基本都包含了很多组件,很多组件包含了一些通用性代码,如果每开发一个组件,都去把这些通用性代码复制出来,无疑是非常繁琐的,那么作者在开发这些组件时是如何做的呢?

学习目标:

  • 新增组件: npm run init [组件名]
  • 删除组件:npm run init [组件名] del

资源:

源码地址:tdesign-vue/index.js

源码

找到用于初始化组件的源码,如图:

脚本的入口

function init() {
  const [component, isDeleted] = process.argv.slice(2);
  if (!component) {
    console.error('[组件名]必填 - Please enter new component name');
    process.exit(1);
  }
  const indexPath = path.resolve(cwdPath, 'class="lazy" data-src/index.ts');
  const toBeCreatedFiles = config.getToBeCreatedFiles(component);
  if (isDeleted === 'del') {
    deleteComponent(toBeCreatedFiles, component);
    deleteComponentFromIndex(component, indexPath);
  } else {
    addComponent(toBeCreatedFiles, component);
    insertComponentToIndex(component, indexPath);
  }
}

函数接受两个参数: Component 和 isDelete。

  • component 参数是要创建或删除的组件的名称
  • isDelete 参数是一个标志,指示是否应该创建或删除该组件。

函数首先检查是否提供了组件参数。如果未提供,则向控制台输出一条错误消息,函数退出。否则,函数将继续执行。

之后,该函数获取需要创建或删除的文件列表,以便添加或删除组件。然后检查 isDelete 参数的值,以确定是否应该创建或删除组件。如果 isDelete 等于 del,则函数调用 deleteComponent 函数来删除组件,然后调用 deleteComponentFromIndex 函数来从项目的索引文件中删除组件。如果 isDelete 不等于 del,则函数调用 addComponent 函数创建组件,然后调用 insertComponentToIndex 函数将组件添加到项目的索引文件中。

创建目录

function addComponent(toBeCreatedFiles, component) {
  // At first, we need to create directories for components.
  Object.keys(toBeCreatedFiles).forEach((dir) => {
    const _d = path.resolve(cwdPath, dir);
    fs.mkdir(_d, { recursive: true }, (err) => {
      if (err) {
        utils.log(err, 'error');
        return;
      }
      console.log(`${_d} directory has been created successfully!`);
      // Then, we create files for components.
      const contents = toBeCreatedFiles[dir];
      contents.files.forEach((item) => {
        if (typeof item === 'object') {
          if (item.template) {
            outputFileWithTemplate(item, component, contents.desc, _d);
          }
        } else {
          const _f = path.resolve(_d, item);
          createFile(_f, '', contents.desc);
        }
      });
    });
  });
}

该函数接受两个参数: toBeCreatedFilescomponent

  • toBeCreatedFiles 参数是一个对象,它包含为了添加组件而需要创建的目录和文件的列表
  • component 参数是要创建的组件的名称。

函数首先迭代 toBeCreatedFiles 对象的键,这些键表示需要创建的目录。对于每个目录,该函数使用 fs.mkdir 函数创建目录。如果目录已经存在,则函数将错误消息记录到控制台。

创建目录后,函数将遍历需要为组件创建的文件列表。如果文件是包含模板属性的对象,则函数调用 outputFileWithTemplate 函数以使用模板创建文件。如果文件不是具有模板属性的对象,则函数调用 createFile 函数创建空文件。

内容写入

function insertComponentToIndex(component, indexPath) {
  const upper = getFirstLetterUpper(component);
  // last import line pattern
  const importPattern = /import.*?;(?=\n\n)/;
  // components pattern
  const cmpPattern = /(?<=const components = {\n)[.|\s|\S]*?(?=};\n)/g;
  const importPath = getImportStr(upper, component);
  const desc = '> insert component into index.ts';
  let data = fs.readFileSync(indexPath).toString();
  if (data.match(new RegExp(importPath))) {
    utils.log(`there is already ${component} in /class="lazy" data-src/index.ts`, 'notice');
    return;
  }
  // insert component at last import and component lines.
  data = data.replace(importPattern, (a) => `${a}\n${importPath}`).replace(cmpPattern, (a) => `${a}  ${upper},\n`);
  fs.writeFile(indexPath, data, (err) => {
    if (err) {
      utils.log(err, 'error');
    } else {
      utils.log(`${desc}\n${component} has been inserted into /class="lazy" data-src/index.ts`, 'success');
    }
  });
}

这个函数接受两个参数: componentindexPath

  • component 参数是要插入的组件的名称
  • indexPath 参数是项目索引文件的路径。

该函数首先定义两个正则表达式: importPatterncmpPattern

  • importPattern 正则表达式用于匹配索引文件中的最后一个 import 语句
  • cmpPattern 正则表达式用于匹配索引文件中的组件列表。

接下来,函数使用 getImportStr 函数,使用变量(组件名称的大写版本)为新组件生成导入语句。

然后,该函数使用 fs.readFileSync 函数读取索引文件的内容,并在文件中搜索 importPatterncmpPattern 正则表达式。如果文件中已经存在新组件的 import 语句,则函数将消息记录到控制台并返回。否则,该函数将最后一个 import 语句替换为新 import 语句,并将组件列表替换为包含新组件的新组件列表。最后,函数使用 fs.writeFile 函数将修改后的索引文件内容写回文件。

删除目录

function deleteComponent(toBeCreatedFiles, component) {
  const snapShotFiles = getSnapshotFiles(component);
  const files = Object.assign(toBeCreatedFiles, snapShotFiles);
  Object.keys(files).forEach((dir) => {
    const item = files[dir];
    if (item.deleteFiles && item.deleteFiles.length) {
      item.deleteFiles.forEach((f) => {
        fs.existsSync(f) && fs.unlinkSync(f);
      });
    } else {
      utils.deleteFolderRecursive(dir);
    }
  });
  utils.log('All radio files have been removed.', 'success');
}

该函数接受两个参数: toBeCreatedFiles 和 Component。

  • toBeCreatedFiles 参数是一个包含与组件关联的目录和文件列表的对象
  • component参数是要删除的组件的名称。

该函数首先调用 getSnapshoFiles 函数以获取与组件关联的快照文件列表。然后,它使用 Object.sign 函数将该列表与 toBeCreatedFiles 对象合并。

接下来,函数迭代合并对象的键,这些键表示需要删除的目录和文件。对于每个键,该函数检查是否设置了关联值的 deleteFiles 属性。如果是,函数将遍历文件列表并使用 fs.unlinkSync 函数删除它们。如果未设置 deleteFiles 属性,该函数将调用 deleteFolderRecursive 函数以删除整个目录及其所有内容。

删除导入语句

function deleteComponentFromIndex(component, indexPath) {
  const upper = getFirstLetterUpper(component);
  const importStr = `${getImportStr(upper, component)}\n`;
  let data = fs.readFileSync(indexPath).toString();
  data = data.replace(new RegExp(importStr), () => '').replace(new RegExp(`  ${upper},\n`), '');
  fs.writeFile(indexPath, data, (err) => {
    if (err) {
      utils.log(err, 'error');
    } else {
      utils.log(`${component} has been removed from /class="lazy" data-src/index.ts`, 'success');
    }
  });
}

该函数接受两个参数: component 和 indexPath。

  • component参数是要删除的组件的名称
  • indexPath 参数是项目索引文件的路径。

该函数首先使用 getImportStr 函数,使用变量(组件名称的大写版本)为组件生成 import 语句。然后,它使用 fs.readFileSync 函数读取索引文件的内容,并在文件中搜索 import 语句和组件名。

如果找到 import 语句或组件名称,函数将使用 String.place 函数将其替换为空字符串。最后,函数使用 fs.writeFile 函数将修改后的索引文件内容写回文件。如果在此过程中发生错误,该函数将一条错误消息记录到控制台。否则,它将记录一条成功消息,指示组件已从索引文件中删除。

总结

通过本次章节的学习,学习到了动态修改文件内容以及根据模板生成组件文件的方式。

以上就是tdesign vue初始化组件源码解析的详细内容,更多关于tdesign vue初始化组件的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

tdesignvue初始化组件源码解析

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

下载Word文档

猜你喜欢

tdesignvue初始化组件源码解析

这篇文章主要为大家介绍了tdesignvue初始化组件源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-12-21

SharedPreference初始化源码分析

本篇内容介绍了“SharedPreference初始化源码分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!初始化sp 内部将数据放到 xm
2023-07-05

Vue3源码分析组件挂载初始化props与slots

这篇文章主要为大家介绍了Vue3源码分析组件挂载初始化props与slots实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-11-13

spring初始化源码代码浅析

Spring框架被广泛应用于我们的日常工作中,但是很长时间以来我们都是只会使用,不懂它的作用原理,下面这篇文章主要给大家介绍了关于spring初始化源码的相关资料,需要的朋友可以参考下
2023-05-18

initoutputstream初始化输出流源码分析

这篇文章主要为大家介绍了initoutputstream初始化输出流源码分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-11-13

iOS组件化源码分析

这篇“iOS组件化源码分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“iOS组件化源码分析”文章吧。一、iOS 组件化常用
2023-07-05

分析Linux内核调度器源码之初始化

目录一、导语二、调度器的基本概念2.1、运行队列(rq)2.2、调度类(sched_class)2.3、调度域(sched_domain)2.4、调度组(sched_group)2.5、根域(root_domain)2.6、组调度(grou
2022-06-03

NCCL深度学习之初始化及ncclUniqueId的产生源码解析

这篇文章主要为大家介绍了NCCL源码解析之初始化及ncclUniqueId的产生详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-16

Spring源码解析容器初始化构造的方法是什么

这篇“Spring源码解析容器初始化构造的方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spring源码解析容器初
2023-07-02

element如何初始化组件功能详解

ElementUI是一套基于Vue的桌面端组件库,封装好了很多常用的UI组件,下面这篇文章主要给大家介绍了关于element如何初始化组件功能的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
2022-12-21

python深度学习tensorflow参数初始化initializer源码分析

本篇内容介绍了“python深度学习tensorflow参数初始化initializer源码分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成
2023-07-06

ultraedit无法初始化ftp组件怎么解决

这篇文章主要介绍了ultraedit无法初始化ftp组件怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇ultraedit无法初始化ftp组件怎么解决文章都会有所收获,下面我们一起来看看吧。ultraed
2023-07-01

Android Jetpack 组件LiveData源码解析

这篇文章主要为大家介绍了Android Jetpack 组件LiveData源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-03-10

Android Jetpack组件Lifecycle源码解析

这篇文章主要为大家介绍了Android Jetpack组件Lifecycle源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-03-13

spring初始化源码之关键类和扩展接口详解

Spring就是一个大工厂,可以将所有对象的创建和依赖关系的维护交给Spring管理,下面这篇文章主要给大家介绍了关于spring初始化源码之关键类和扩展接口的相关资料,需要的朋友可以参考下
2023-05-18

编程热搜

目录