文档章节

gulp 插件收集代码中的注册功能

BryanYang
 BryanYang
发布于 2017/05/17 17:06
字数 375
阅读 39
收藏 0

需求:

js 代码中会用以下代码注册功能:

 when('car.name', { title: '车主姓名', dataIndex: 'buyerName', width: 150 }),
 when('car.phone', { title: '车主联系电话', dataIndex: 'buyerPhone', width: 150 }),
 when('car.chepai', { title: '车牌号', dataIndex: 'etPlateNumber', width: 150 }),
 when('car.mendian', { title: '门店', dataIndex: 'consignee', width: 150 }),

然后我需要在gulp build的时候,采集代码中注入的这些key ,并生成一个对象。写了gulp插件 bee.js 来做这件事情:

/**
 * 采集代码中的功能点。
 * 因为是静态采集的方式,有很多问题,比如注释中的代码也会被采集。
 * 但是一种思路。
 */

const through = require('through2');
const chalk = require('chalk');
const path = require('path');
const pkg = require(path.join(process.cwd(), 'package.json'));
const fs = require('fs');
const _ = require('lodash');


function bee() {
  let latestFile;
  let latestMod;
  const petals = {};

  function bufferContents(file, encoding, callback) {
    if (file.isNull()) {
      throw 'NO Files,Please Check Files!';
    }

    if (file.isStream()) {
      this.emit('error', new Error('bee: Streaming not supported'));
      callback();
      return;
    }

    if (!latestMod || file.stat && file.stat.mtime > latestMod) {
      latestFile = file;
      latestMod = file.stat && file.stat.mtime;
    }

    if (file.isBuffer()) {
      const myRe = /when\('([\w|\.]+)/gm;
        // 拿到单个文件buffer
      const content = file.contents.toString('utf-8');
      const flowers = content.match(myRe);
      if (flowers) {
        const ps = flowers.map(petal => petal.replace("when('", ''));
        ps.forEach((p) => {
          if (!petals[p]) {
            petals[p] = 1;
          } else {
            petals[p] += 1;
          }
        });
      }
    }

    callback();
  }

  function endStream(cb) {
    if (!latestFile) {
      cb();
      return;
    }

    chalk.blue('采集到以下功能点:');
    console.log('采集到以下功能点:');
    console.log(Object.keys(petals));
    const features = {};
    Object.keys(petals).forEach((_path) => {
      _.set(features, _path, false);
    });
    pkg.features = features;
    fs.writeFile(path.join(process.cwd(), 'package.json'), JSON.stringify(pkg, null, 4), (err) => {
      if (err) return console.error(err);
      console.log('更新package.json 成功!');
    });
  }

  return through.obj(bufferContents, endStream);
}

module.exports = bee;

bee 插件收集完成后,会输出到package.json中,下面就是运行后的结果:

 "features": {
        "baseInfo": {
            "id": false,
            "name": false
        },
        "car": {
            "name": false,
            "phone": false,
            "chepai": false,
            "mendian": false
        },
        "car4": false
    }
}

 

© 著作权归作者所有

BryanYang
粉丝 16
博文 165
码字总数 52036
作品 0
石景山
程序员
私信 提问
加载中

评论(0)

[译]幕后的gulp:构建一个基于流的任务自动化工具

幕后的gulp:构建一个基于流的任务自动化工具 前端开发人员现在正在使用多种工具把日常操作自动化。三个最流行的解决方案是Grunt,Gulp和Webpack。每个工具都建立在不同的理念,但是它们共享...

暗夜在火星
2016/10/16
112
0
【转】有关 Grunt - 自动化构建工具的奇技淫巧

原文:https://segmentfault.com/a/1190000005029360?utmsource=tuicool&utmmedium=referral 之所以想写有关前端自动化工具的文章出于以下几个原因: 自动化构建工具对于前端开发的重要性:高...

iNiL0119
2016/11/04
192
0
gulp 使用初解

gulp gulp是基于Node.js的前端自动化构建工具,主要用于代码打包。目前主流的前端打包工具,grunt,gulp,webpack。grunt现在似乎慢慢被gulp取代,而我使用gulp也是冲着大家说的配置简单去的...

天风霁月
2016/03/02
3.1K
14
gulp常用插件大全

编译 gulp-sass - 通过 libsass将Sass编译成 CSS gulp-ruby-sass - 通过 Ruby Sass将Sass编译成CSS gulp-compass - 通过 Ruby Sass和CompassSass编译成CSS gulp-less - Less编译成 CSS. gul......

bug_killer
2017/12/22
0
0
gulp的4个API 让你成为gulp专家

gulp 本身能做的事情非常少,主要是通过插件来提供各种功能,gulp本身只提供了4个非常简洁的API, 掌握这4个API你就基本掌握了gulp的全部。 一、gulp.task gulp 是基于task的方式来运行 定义 ...

JamesView
2018/04/19
20
0

没有更多内容

加载失败,请刷新页面

加载更多

类和对象

创建对象的几种方式: 1:new创建对象。会增加对象之间的耦合度。不推荐使用。 2:使用反射机制创建对象。Class类的newInstance方法,或者使用Constructor类的newInstance方法。 3:使用对象...

学啥子算法
昨天
59
0
你真的会创建一个线程吗?

在文章开始之前先看一个问题,下图几种创建线程方式分别是什么,它们之间的区别和联系是什么? 如果可以轻松回答,那么本文对你来说过于基础,不用往下看啦,如果还有所迷惑,那就和Nauyus一...

JAVA一方
昨天
58
0
【已解决】SQL SERVER2008 连接不了本地数据引擎

问题:【已解决】SQL SERVER2008 连接不了本地数据引擎 不知道你有没有遇到过这种情况,当装完 sql server2008之后,然后用 *SQL Server身份验证* 或者 *window身份验证* 访问本地数据库的时...

wanguanrong
昨天
63
0
StringTokenizer类

StringTokenizer类:根据自定义字符为分界符进行拆分,并将结果进行封装提供对应方法进行遍历取值,StringTokenizer方法不区分标识符、数和带引号的字符串,它也不识别并跳过注释;该方法用途...

lianbang_W
昨天
33
0
自媒体爆文抓取工具有哪些?分享3款爆文工具!

做自媒体运营每天都要持续的创作内容进行输出,这是非常头疼的,不是每一天都会有灵感,有时候就算看再多的素材也没法激发灵感。这时候就需要借助一些同领域做得比较的内容做参考。那么快速地...

易撰自媒体工具
昨天
62
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部