写点什么

【告别复制粘贴】动态模板生成小技巧

  • 2021-07-31
  • 本文字数:3914 字

    阅读完需:约 13 分钟

【告别复制粘贴】动态模板生成小技巧

前言


在日常开发中,我们需要不停的新建页面和组件。以 Vue 项目为例,我们在新建一个页面的时候,需要经历一遍又一遍重复的过程:


1、先新建一个文件夹

2、然后新建一个 .vue 文件,写上 <template>、<script>、<style>

3、如果页面涉及多个组件,还要新建 component 文件夹,并重复以上两个步骤

4、最后才是我们的业务代码


假设新建一个页面,并复制粘贴模板代码需要 1 分钟的时间,一个项目如果有 60 个页面,就得花费 1 个小时写这种重复性高、无聊且枯燥的代码。这显然不是我们想看到的,下面给大家分享几个提效小技巧。


基于 Vscode 的 Snippets 自定义代码块


通过 Vscode 的 Snippets 我们可以自定义 Snippets,从而实现快捷生成代码片段。


  • 打开 Vscode,依次点击文件——首选项——用户代码片段

Snippets 语法


prefix: 代码片段名字,即输入此名字就可以调用代码片段body: 这个是代码段的主体.需要编写的代码放在这里    $1: 生成代码后光标的初始位置$2: 生成代码后光标的第二个位置,按 tab 键可进行快速切换,还可以有 $3,$4,$5.....${1,字符}: 生成代码后光标的初始位置(其中 1 表示光标开始的序号,字符表示生成代码后光标会直接选中字符)description: 代码段描述,输入名字后编辑器显示的提示信息tab键制表符:\t换行: \r 或者\n
复制代码


以 vue.json 为例:


{ "Print to console": {  "prefix":"vue",  "body": [   "<template>",   "\t<div>test</div>",   "</template>",   "<script>",   "export default{",    "\tmounted(){$1},",    "\tcomponents: {},",    "\tdata() {",    "\t\treturn {",    "\t\t};",    "\t},",    "}",   "</script>",   "<style lang='less'>",   "</style>"  ],  "description": "vue-template" }}
复制代码


效果展示如下:



基于 plop 自定义基础的文件模板


plop 的介绍可以看 plop 官网https://plopjs.com/documentation/),plop 功能主要是基于 inquirer (https://github.com/SBoudrias/Inquirer.js/) 和 handlebars (https://github.com/handlebars-lang/handlebars.js)


简单的说,plop 这个轻量的脚手架就是通过提前配置好要生成的页面模板,并且在命令行中接受指定的参数,从而生成我们需要的模板。


  • 在项目中安装 plop

npm install --save-dev plop


  • 项目根目录下新建 plopfile.js

module.exports = function(plop){  plop.setGenerator('test',{ // 这里的 test 是一个自己设定的名字,在执行命令行的时候会用到      description: 'generate a test', // 这里是对这个plop的功能描述      prompts: [        {          type: 'input', // 问题的类型          name: 'name', // 问题对应得到答案的变量名,可以在actions中使用该变量          message: 'view name please', // 在命令行中的问题          default: 'test' // 问题的默认答案        }      ],      actions: data => {          const name = '{{name}}';          const actions = [          {              type: 'add', // 操作类型,这里是添加文件              path: `src/views/${name}/index.vue`, // 模板生成的路径              templateFile: 'plop-templates/view/index.hbs', // 模板的路径              data: {                name: name              }          }        ];        return actions;      }    });}
复制代码
  • 在根目录下创建 plop-templates 文件夹,并在 plop-templates/view 里新建一个 index.hbs

<template>  <div /></template>
<script>  export default {    name: '{{ properCase name }}',    props: {},    data() {      return {}    },    created() { },    mounted() { },    methods: {}  }</script>
<style lang="less">
</style>
复制代码
  • 新增脚本

package.json中新增

"script":{    ...,    "new":"plop"}
复制代码
  • 运行 npm run new

至此,一个简单的固定模板就自动生成好了。


plop 进阶


此时我们已经可以生成固定的模板了,那么问题来了,有些文件夹下面需要 .less 文件,有些则不需要,此时我们又该如何动态配置呢?


话不多说,直接看例子吧!


// plopfile.js 文件module.exports = function(plop){  plop.setGenerator('test',{      description: 'generate a test',      prompts: [        {          type: 'input',          name: 'name',          message: '请输入文件夹名称',        },        {          type: 'input',          name: 'less',          message: '需要less文件吗?(y/n)',        }      ],      actions: data => {        const name = '{{name}}';        let actions = [];        if (data.name) {          actions.push({            type: 'add',            path: `src/${name}/index.vue`, // 文件生成后所在的位置            templateFile: 'plop-templates/view/index.hbs', // 模板路径            data: {              name: name            }          });        }        if (data.less === 'y') {          actions.push({            type: 'add',            path: `src/${name}/index.less`, // 文件生成后所在的位置            templateFile: 'plop-templates/index.less', // 模板路径          })        }        return actions;      }    });  }
复制代码


此时我们已经可以动态配置文件的个数,那么问题又来了,在一个页面中有时需要导航条,有时不需要导航条,这种情况该如何解决呢?


// plopfile.js 文件module.exports = function(plop){  plop.setGenerator('test',{      description: 'generate a test',      prompts: [        {          type: 'input',          name: 'pageName',          message: '请输入文件夹名称',        },        {          type: 'input',          name: 'less',          message: '需要less文件吗?(y/n)',        },{          type: 'confirm',          name: 'hasNavbar',          message: '需要页面导航栏吗?(y/n)',          default: this.hasNavbar        }      ],      actions: data => {        const { pageName, less, hasNavbar } = data;        const name = '{{pageName}}';        let actions = [];        if (pageName) {          actions.push({            type: 'add',            path: `src/${name}/index.vue`,            templateFile: 'plop-templates/view/index.hbs',            data: {              name: name,              hasNavbar: hasNavbar, // 是否有操作按钮            }          });        }        if (less === 'y') {          actions.push({            type: 'add',            path: `src/${name}/index.less`,            templateFile: 'plop-templates/index.less',          })        }        return actions;      }    });  }
复制代码


// hbs 文件<template>  <div>    {{#if hasNavbar}}      <div>导航栏</div>    {{/if}}  </div></template>
<script>  export default {    name: '{{ properCase name }}',    props: {},    data() {      return {}    },    created() { },    mounted() { },    methods: {}  }</script>
<style lang="less">
</style>
复制代码


效果展示如下:



总结


本文主要给大家介绍了几种简单的新建文件模板的小技巧,每天一个提效小技巧,准点下班不是梦!若有其他更好的方法,欢迎大家在留言区评论。



头图:Unsplash

作者:Healer

原文:https://mp.weixin.qq.com/s/Yd7WNO8Ix8CaOM2APoeUgg

原文:【告别复制粘贴】动态模板生成小技巧

来源:政采云前端团队 - 微信公众号 [ID:Zoo-Team]

转载:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2021-07-31 15:001341

评论

发布
暂无评论
发现更多内容

MyBatis resultMap元素的用途是什么呢?

@下一站

技术 mybatis java; 11月月更

RocketMQ 的消费者类型详解与最佳实践

阿里巴巴云原生

阿里云 RocketMQ 云原生

Kotlin用高阶函数处理集合数据

子不语Any

android kotlin 11月月更

ModelWhale 教学实训模块,更流畅的作业编写及提交体验|ModelWhale 版本更新

ModelWhale

人工智能 机器学习 数据分析 编程建模 教学实训

构建基于 Ingress 的全链路灰度能力

阿里巴巴云原生

阿里云 微服务 云原生w

一言不合就重构

捉虫大师

架构 微服务 服务发现 健康检查 11月月更

企业想要高效运营,还需要选择瓴羊Quick BI软件

流量猫猫头

大数据

MegEngine Inference 卷积优化之 Im2col 和 winograd 优化

MegEngineBot

深度学习框架 卷积 MegEngine

springboot整合canal

@下一站

Java 程序开发 spring-boot 11月月更

Spring MVC 和 Struts 的区别是什么?

千锋IT教育

SpringBoot:四种读取properties文件的方式

@下一站

程序设计 软件开发 springboot 11月月更

精彩回顾 | 云原生系统软件的产业应用

BoCloud博云

云原生

10 个杀手级的 Python 自动化脚

千锋IT教育

SAP MM 使用两个STO实现免关税跨国公司间转储

SAP虾客

Python操作Numpy模块

度假的小鱼

Numpy 11月月更 Python操作Numpy模块库

Python基础库-正则表达式库

度假的小鱼

正则 11月月更 Python正则表达式库

2022年中国在线视频用户观看行为洞察

易观分析

视频 报告 用户

Kotlin中Regex正则表达式(上)

子不语Any

android kotlin 11月月更

图计算的黄金时代 知识图谱背后的数据价值

Neo4j 图无处不在

neo4j 图数据库 知识图谱 图计算 图技术

火爆全球的“饺子皮”3D手办原来是这样做的!关键时刻少不了远程控制软件!

RayLink远程工具

远程控制软件 远程办公软件 远控软件 远程桌面连接 RayLink

Kotlin使用 lateinit 的一些考虑

子不语Any

android kotlin 11月月更

一文深度解读边缘计算产业发展前景

阿里云CloudImagine

阿里云 边缘计算

关于不法分子冒用我司名义虚假招聘的严正声明

嘉为蓝鲸

Lattice - 面向高可扩展的业务框架

原力在线

架构 中台 插件 lattice 业务平台分离

重磅 | 九科信息与达梦完成产品兼容性认证,携手共建信创生态

九科Ninetech

新课程发布 | 如何用 7 分钟击破 Serverless 落地难点?

阿里巴巴云原生

阿里云 Serverless 云原生

Python 操作pdf(pdfplumber读取PDF写入Exce)

度假的小鱼

11月月更 Python 操作pdf文件 pdfplumber

SpringMVC常用注解

@下一站

软件开发 程序 Java‘’ 11月月更

10月&11月书单

图灵社区

书单推荐

aPaaS是什么(aPaaS与iPaaS的区别)

优秀

aPaaS ipaas

pringBoot的全局异常处理汇总

@下一站

程序设计 软件开发 springboot 11月月更

【告别复制粘贴】动态模板生成小技巧_文化 & 方法_政采云前端团队_InfoQ精选文章