【vscode插件开发】第2篇:插件模板代码如何生成的?

1,320 阅读4分钟

「这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战

背景

最近一直在探讨学习,vscode插件在效能提升上的应用场景。并且在团队(40+前端团队)输出了一些正向的实战应用型的小产品,帮助团队成员减少重复性的工作,能够更专注于代码质量以及业务,并且得到了广大组员的认可。趁着最近火热,输出些文章记录下,大体章节如下(后续会增加):

  1. 创建一个Hello World应用
  2. 插件模板代码如何生成的?
  3. 插件机制以及vscode插件能力边界
  4. vscode树结构详解
  5. vscode虚拟文档详解
  6. vscode配置监听以及如何实现自定义监听?
  7. 实战:vscode插件提效:代码片段生成器
  8. 实战:vscode插件提效:根据swagger api生成接口typescript声明
  9. 实战:vscode插件提效:根据swagger api生成接口请求模板service
  10. vscode构建和发布

正文

在上篇文章,我们运行了命名行脚本:npm install -g yo generator-code,并通过执行yo code生成了插件的模板代码。

那这一步都执行了什么事情呢?

1. 查看包源码

要看模板代码是否如何生成的,首先我们得先了解yogenerator-code都是什么?那么第一步,我们要到npm管理的全局安装包路径看看下载下来的代码是什么。那如何快速查看安装路径呢?

npm root -g

执行如上脚本,会在终端打印出目录,我的mac默认安装地址是:/usr/local/lib/node_modules,进入当前目录就可以查看所有的全局安装包了。当然,查看全局安装包也可以通过命名行:

npm ls -g

npm全局包目录.jpg

如上化红框便是vscode插件所需要的3个核心包,这里vsce包后续发布构建章节的时候再说明。本章节,只看yogenerator-code两个包。

2. yo包能力

查看一个包是干什么的,具备什么能力,通过package.json文件大体能得知五六。

yo-pkg.jpg 如上,我们得知这个包是可执行脚本文件。

其实关于这个包,不用多说,它是大命名顶顶的: yeoman,一个通用型脚手架,用于生成项目模板代码。执行yo code,实际上是通过yeoman能力在本地创建了模板代码,这份模板代码来源于generator-code

3. generator-code包

这个包的源码目录结构如下: generator-code.jpg 大体介绍下app/目录下的文件:

  1. index.js 这个生成器的入口文件
  2. prompts.js 用于向用户展示交互问题,并收集交互数据
  3. env.js 获取vscode版本和插件依赖
  4. templates 模板文件目录

这个包知道它是干什么,能干什么即可,向查看具体源码可自行去查看业务代码。

下面我们看看如何自定义一个yeoman的生成器。

4. 自定义generator包

  1. 创建以generator-为开头的npm包(npm init)
  2. 安装yeoman-generator依赖
  3. 按照规范创建目录结构,默认执行app目录下的generator
// 目录1:
generator-demo/
  generator/
     app/
        index.js
     router
        index.js
  package.json
   
// 目录2:
generator-demo/
    app
        index.js
    router
        index.js
    package.json

使用目录2的package.json需要进行配置:

// package.json要进行声明
{
   files: ['app', 'router']
}
  1. 自定义包app/index.js中实现生成器

定义匿名类并对yeoman提供的Generator基类进行实现

const Generator = require('yeoman-generator');
module.exports = class extends Generator{
    initianlizing(){
        //初始化,比如:检查状态,获取配置等
    }
    prompting(){
        //向用户展示交互问题,并收集交互数据
    }
    configuring(){
        //编辑/配置项目文件(一般是以'.'开头的配置文件,例如.editorconfig)
    }
    default(){
        //未匹配任何生命周期方法的非私有方法均在此环节*自动*执行
    }
    writing(){
        //输出预置的模板文件
    }
    conflicts(){
        //处理冲突(内部调用,一般不用处理)
    }
    install(){
        //进行依赖的安装(支持多种工具:npm,bower,yarn)
    }
    end(){
        //结束动作,执行清除操作,如(清屏)等
    }
}
  1. 本地调试:yo ** ,需要进行npm link将包创建软链接到全局环境,可以让npm进行检索到执行

总结

通过本篇文章,我们能知道yogenerate-code具备什么能力,都能干什么,插件生成模板代码是怎么回事,以及如何去自定义模板生成器。