Gulp:插件编写入门

简介:

之前挖了个坑,准备写篇gulp插件编写入门的科普文,之后迟迟没有动笔,因为不知道该肿么讲清楚Stream这货,毕竟,gulp插件的实现不像grunt插件的实现那么直观。

好吧,于是决定单刀直入了。文中插件示例可在这里找到:https://github.com/chyingp/gulp-preprocess

写在前面

我们来看看下面的gruntfile,里面用到了笔者刚写的一个gulp插件gulp-preprocess。好吧,npm publish的时候才发现几个月前就被抢注了。为什么星期天晚上在 http://npmjs.org/package/ 上没有搜到 TAT

这个插件基于preprocess这个插件,插件使用方法请自行脑补。本文就讲解下如何实现 gulp-preprocess 这个插件

var gulp = require('gulp'),
    preprocess = require('gulp-preprocess'); gulp.task('default', function() { gulp.src('src/index.html') .pipe(preprocess({USERNAME:'程序猿小卡'})) .pipe(gulp.dest('dest/')); }); 

进入实战

关键代码

我们来看下最关键的几行代码。可以看到,上文的 preprocess() 的作用就是返回一个定制的 Object Stream ,这是实现gulp的流式操作必需的,其他gulp插件也大同小异。

gulp-preprocess/index.js

module.exports = function (options) {
    return through.obj(function (file, enc, cb) { // 主体实现忽略若干行 }); }; 

接着,看下具体实现。实际上代码很短

引入依赖

首先,引入插件的依赖项。其中:

  • gutil:按照gulp的统一规范打印错误日志
  • through2:Node Stream的简单封装,目的是让链式流操作更加简单
  • preprocess:文本预处理器,主要就是文本替换啦
'use strict';
var gutil = require('gulp-util');
var through = require('through2'); var pp = require('preprocess'); 

核心逻辑

其次,定义gulp-preprocess的主体代码。没错,就是下面这么短的代码。代码结构也比较清晰,下面还是简单做下分解介绍。

module.exports = function (options) {
    return through.obj(function (file, enc, cb) { if (file.isNull()) { this.push(file); return cb(); } if (file.isStream()) { this.emit('error', new gutil.PluginError(PLUGIN_NAME, 'Streaming not supported')); return cb(); } var content = pp.preprocess(file.contents.toString(), options || {}); file.contents = new Buffer(content); this.push(file); cb(); }); }; 

核心代码分解

还是直接上代码,在关键位置加上注释。对 through2 不熟悉的童鞋可以参考这里

module.exports = function (options) {
    return through.obj(function (file, enc, cb) { // 如果文件为空,不做任何操作,转入下一个操作,即下一个 .pipe() if (file.isNull()) { this.push(file); return cb(); } // 插件不支持对 Stream 对直接操作,跑出异常 if (file.isStream()) { this.emit('error', new gutil.PluginError(PLUGIN_NAME, 'Streaming not supported')); return cb(); } // 将文件内容转成字符串,并调用 preprocess 组件进行预处理 // 然后将处理后的字符串,再转成Buffer形式 var content = pp.preprocess(file.contents.toString(), options || {}); file.contents = new Buffer(content); // 下面这两句基本是标配啦,可以参考下 through2 的API this.push(file); cb(); }); }; 

写在后面

要把gulp插件内部实现的原理讲透不是件容易的事情,因为实现还是比较复杂的,首先需要对Buffer、Stream 有一定的了解,包括如何通过Node暴露的API对Stream进行定制化。可以参考笔者的另一篇随笔《gulp.src()内部实现探究》,虽然也只是讲了很小的一部分。


相关文章
|
7月前
|
前端开发
vscode编写前端提升效率的三个必不可缺的插件以及使用方法
vscode编写前端提升效率的三个必不可缺的插件以及使用方法
|
3月前
|
IDE 开发工具 C语言
QT案例IDE编写 -- 代码编写
QT案例IDE编写 -- 代码编写
25 0
|
10月前
|
存储 JSON 监控
01-Httprunner-简介、安装及基本使用
01-Httprunner-简介、安装及基本使用
|
Java 测试技术 数据库连接
python接口自动化(二十一)--unittest简介(详解)
前边的随笔主要介绍的requests模块的有关知识个内容,接下来看一下python的单元测试框架unittest。熟悉 或者了解java 的小伙伴应该都清楚常见的单元测试框架 Junit 和 TestNG,这个招聘的需求上也是经常见到的。
198 1
python接口自动化(二十一)--unittest简介(详解)
|
开发框架 分布式计算 Java
聊聊后端Web开发框架(Python)的简单使用
聊聊后端Web开发框架(Python)的简单使用
|
开发框架 分布式计算 Java
聊聊后端Web开发框架(Python)的简单使用
- 页面渲染:客户端渲染页面(SPA)、服务端渲染页面(模板技术) - 数据库连接技术:数据库连接池、数据访问 - 服务管理:接口、路由、权限 - 异步任务调度:异步、同步、回调 - Python:Flask - Java:Spark Java - Python:Django - Java:Spring 全家桶 ## Flask Flask 是一个使用 Python 编写的轻量级 Web
|
缓存 JavaScript 前端开发
9012教你如何使用gulp4开发项目脚手架
本文将会介绍如何使用gulp4来搭建项目脚手架,如果您还在使用gulp3或更老的版本,您也以通过本文的一些思想将之前的项目进行完善,更新。如果gulp不是你们团队的重点,也可以移步我的另一篇文章
226 0
|
关系型数据库 数据库 PostgreSQL
如何使用代码生成插件easycode
如何使用代码生成插件easycode
153 0
如何使用代码生成插件easycode
|
JavaScript 前端开发 API
小程序框架wepy文档
wepy官网:https://tencent.github.io/wepy/index.html 项目创建与使用 安装wepy 以下安装都通过npm安装 安装wepy命令行工具: npm install wepy-cli -g 在开发目录生成开发DEMO: wepy new myproject 开.
4718 0
|
安全 索引
【WePY小程序框架实战一】-创建项目
最近两个小程序项目使用了微信自己出的框架wepy开发,开发完的感受就是比原生小程序顺溜很多。我就从安装到一些重点和整个项目把wepy使用整理下 全局安装WePY命令行工具 npm install wepy-cli -g 创建项目 wepy init standard mywepy 选择->回车...
1475 0