前端自动化构建工具--Plop

举报
楚楚冻人玥玥仙女 发表于 2021/11/19 01:34:10 2021/11/19
【摘要】 前端自动化构建工具 ---- Plop 前言:周末在家学习了一些前端自动化构建工具,Generator、Plop、Grunt、Gulp,我还以为目前用不到这些工具,没想到周一一上班看到这...

前端自动化构建工具 ---- Plop

前言:周末在家学习了一些前端自动化构建工具,Generator、Plop、Grunt、Gulp,我还以为目前用不到这些工具,没想到周一一上班看到这周任务是要开发N个新模块,我就感觉我该求助于某个自动化工具了😂😂

我要开发的每个模块的结构骨架都非常相似,就可以使用Plop来实现自动化了,Plop旨在根据模板文件自动化创建组件,而不是一个完整的大型应用,这是非常符合我的预期的😄😄😄,接下来我就来介绍一下Plop如果帮助我们在开发过程中提高工作效率。

一、安装plop

在项目的根目录下面使用yarn命令安装plop:yarn add plop

可以在Plop代码仓库看到Plop源代码以及详细说明文档:https://github.com/plopjs/plop

二、编写plop的入口文件:plopfile.js

在项目根目录下创建一个文件:plopfile.js。在后面的命令行交互中,我们可以通过prompts获取用户输入的一些信息,如下面的name变量就会由用户输入获得,默认值是MyComponent。我们在指定模板文件生成新文件的时候,可以通过花括号形式的插值表达式传入用户输入的值,如{{name}}.js,那生成的文件名就是用户输入的字符串名字。

plopfile.js:

// Plop 入口文件,需要导入一个函数
// 此函数接受一个plop对象,用户创建生成器任务

module.exports = plop => {
  plop.setGenerator('component', { // component 就是接下来的yarn plop命令后面带来指令名称
    description: 'create a component',
    prompts: [
      {
        type: 'input',
        name: 'name',
        message: 'component name',
        default: 'MyComponent'
      }
    ],
    actions: [
      {
        type: 'add', // 代表添加文件
        path: 'src/components/{{name}}/{{name}}.js', // 要生成的文件路径
        templateFile: 'plop-templates/component.hbs' // 文件模板
      },
      {
        type: 'add', // 代表添加文件
        path: 'src/components/{{name}}/{{name}}.css',
        templateFile: 'plop-templates/component.css.hbs'
      },
    ]
  })
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

三、创建模板文件

在项目根目录下创建一个文件夹plop-templates放模板文件,然后创建两个文件,模板中的需要替换的变量用双层花括号的插值表达式传入,如下面的{{name}},其中name来自于命令交互模式用户输入的值。

  • plop-templates/component.css.hbs

    import React from 'react';
    import ReactDOM from 'react-dom';
    import CoursePackage from './{{name}}';
    
    it('renders without crashing', () => {
      const div = documents.createElement('div');
      ReactDOM.render(<{{name}}/>, div);
      ReactDOM.unmountComponentAtNode(div)
    })
    
        
       
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • plop-templates/component.hbs

    import React from 'react';
    
    export default () => (
      <div className="{{name}}">
        <h1>{{name}} Component</h1>
      </div>
    )
    
        
       
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

可能有的同学会有疑问为什么模板文件的扩展名是hbs,是因为plop的模板文件中的插值语法采用的是handlebars语法,所以为了vscode解析语法高亮,所以扩展名最好用hbs,但如果用别的扩展名也没有问题,是没有影响的。

四、执行plop命令进行自动化任务

执行自动化命令:yarn plop component
命令行会等待你输入一个component name,我输入了一个Body
在这里插入图片描述
按下回车,此时就会生成对应的文件了:
在这里插入图片描述
其中所有的{{name}}都被替换成了我输入的Body

此时就大功告成了

五、今日战绩(值得纪念)

1. 我的plopfile.js文件

// Plop 入口文件,需要导入一个函数
// 此函数接受一个plop对象,用户创建生成器任务

module.exports = plop => {

  plop.setGenerator('component', {
    description: 'create a component',
    prompts: [
      {
        type: 'input',
        name: 'moduleName',
        message: 'module name',
        default: 'BusinessSkills'
      },
      {
        type: 'input',
        name: 'menuName',
        message: 'menu name',
        default: 'CoursewareLibrary'
      },
      {
        type: 'input',
        name: 'componentName',
        message: 'component name',
        default: 'componentName'
      },
    ],
    actions: [
      {
        type: 'add',
        path: 'src/pages/ningbo-zhanwu/{{moduleName}}/{{menuName}}/{{componentName}}/index.jsx',
        templateFile: 'plop-templates/Component/index.jsx'
      },
      {
        type: 'add',
        path: 'public/testdata/{{componentName}}.json',
        templateFile: 'plop-templates/component.json'
      },
      {
        type: 'add',
        path: 'src/pages/ningbo-zhanwu/{{moduleName}}/{{menuName}}/{{componentName}}/locales/zh-CN.js',
        templateFile: 'plop-templates/Component/locales/zh-CN.js'
      },
      {
        type: 'add',
        path: 'src/pages/ningbo-zhanwu/{{moduleName}}/{{menuName}}/{{componentName}}/components/PopWindow/index.jsx',
        templateFile: 'plop-templates/Component/components/PopWindow/index.jsx'
      },
      {
        type: 'add',
        path: 'src/pages/ningbo-zhanwu/{{moduleName}}/{{menuName}}/{{componentName}}/components/PopWindow/Detail.jsx',
        templateFile: 'plop-templates/Component/components/PopWindow/Detail.jsx'
      },
      {
        type: 'add',
        path: 'src/pages/ningbo-zhanwu/{{moduleName}}/{{menuName}}/{{componentName}}/components/PopWindow/model.js',
        templateFile: 'plop-templates/Component/components/PopWindow/model.js'
      },
      {
        type: 'add',
        path: 'src/pages/ningbo-zhanwu/{{moduleName}}/{{menuName}}/{{componentName}}/components/PopWindow/services.js',
        templateFile: 'plop-templates/Component/components/PopWindow/services.js'
      },
      {
        type: 'add',
        path: 'src/pages/ningbo-zhanwu/{{moduleName}}/{{menuName}}/{{componentName}}/components/{{componentName}}Grid/index.jsx',
        templateFile: 'plop-templates/Component/components/componentNameGrid/index.jsx'
      },
      {
        type: 'add',
        path: 'src/pages/ningbo-zhanwu/{{moduleName}}/{{menuName}}/{{componentName}}/components/{{componentName}}Grid/model.js',
        templateFile: 'plop-templates/Component/components/componentNameGrid/model.js'
      },
      {
        type: 'add',
        path: 'src/pages/ningbo-zhanwu/{{moduleName}}/{{menuName}}/{{componentName}}/components/{{componentName}}Grid/services.js',
        templateFile: 'plop-templates/Component/components/componentNameGrid/services.js'
      },
    ]
  })
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81

2. 模板文件

在这里插入图片描述

此处有坑!!!就是我的模板文件要生成jsx文件,所以里面有{{}}的jsx语法,而这个是不能让plop解析的,也就是说模板文件中的有些{{}}要原样输出,这里我花了好长时间查资料都差不到怎么解决😭😭😭,最终是去handlebars的网站上查的语法才查到了解决方法,就是在花括号前面加一个反斜杠进行转义,使{{}}原样输出,如上图中的箭头指向的地方,写成\{{ }}就行了。
handlebars的语法地址:https://handlebarsjs.com/guide/expressions.html#escaping-handlebars-expressions

3. 执行plop命令自动化生成组件

yarn plop component
在这里插入图片描述

大功告成✌️✌️✌️ 第一次在实际开发过程中使用这种前端自动化构建工具,体验了一番新的开发方式,效率也大大提高了,开森😆😆😆

文章来源: blog.csdn.net,作者:爱玲姐姐,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/jal517486222/article/details/106476795

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。