grunt插件制作

插件内容:在文件的顶部加入字符画。

一个从无到有的项目,所以我们需要用yeoman来初始化项目。上yeoman官网的generator收纳页搜索gruntplugin

安装这个generator:

npm install -g generator-gruntplugin //generator的命名规则:genetator-generator的名字

生成项目代码

yo gruntplugin grunt-buddha //yo generator的名字 项目的名字

然后cmd会出现项目的配置信息,自定义输入,生成package.json。生成的项目目录如图:

插件代码存放在tasks的文件夹中,tasks文件名不能更改。

下载字符画

在网上找几幅字符画保存到tesks下的assert目录中,这里我找了一个绵阳和马。

   

gruntplugin生成的核心工作代码

‘use strict‘;//使用es5严格模式

module.exports = function (grunt) { //"warp"函数

  //grunt.registerMultiTask:允许为一个插件配置多个target,‘buddha_Liu‘:插件的名字,‘The best Grunt plugin ever.‘:插件的描述,fn:插件核心的功能
  grunt.registerMultiTask(‘buddha_Liu‘, ‘The best Grunt plugin ever.‘, function () {

    //设置插件属性的默认值,如果插件定义了punctuation则覆盖,有点想jquery的extend方法。    //这里的this是指在gruntfile中配置的配置属性。
    var options = this.options({
      punctuation: ‘.‘,
      separator: ‘, ‘
    });

    // gruntfile配置中的file文件格式,不论以什么形式写,都将转换成文件数组形式的格式,eg:  // files:[  //    {  //      src:[‘src/aa.js‘,‘src/bb.js‘],  //      dest:[‘src/aa.min.js‘,‘src/bb.min.js‘]       //    }  //   ]
    //这里的this.files是包含src,dest的object键值对数组。  //forEach是ECMASCript6新的语法,遍历数组回调的形参中有三个参数分别是(value,index,arr)
    this.files.forEach(function (file) {
      // 连接指定文件    //参数和foreach相似。    //filter也是必需ECMASCript6新的语法。回调函数一个接受最多三个参数的函数。 对于数组中的每个元素,filter 方法都会调用 callbackfn 函数一次    //filter的返回值是一个包含回调函数为其返回 true 的所有值的新数组。 如果回调函数为 array1 的所有元素返回 false,则新数组的长度为 0。              //不论配置里面的src是什么,这里的file.src会被转换成数组的形式    var src = file.src.filter(function (filepath) {
    // 用grunt提供的api查看这个文件是否存在
        if (!grunt.file.exists(filepath)) {      //不会中断grunt Task
          grunt.log.warn(‘Source file "‘ + filepath + ‘" not found.‘);
          return false;
        } else {
          return true;
        }
      }).map(function (filepath) {
    //filter也是必需ECMASCript6新的语法,参数和forEach相似,操作数组中的每个元素,返回一个新的数组
        return grunt.file.read(filepath);
      }).join(grunt.util.normalizelf(options.separator)); //grunt.util.normalizelf是grunt的API的一个方法,用来跨系统转换换行符

    src += options.punctuation; // 加上结尾符号
   //这里的file.dest会是一个字符串的值,不会像file.src那样是个arr   //写入到目标文件中
      grunt.file.write(file.dest, src);

      // 在控制台给一个提示信息。
      grunt.log.writeln(‘File "‘ + file.dest + ‘" created.‘);
    });  });

};

 改造代码,实现我们的在文件顶部加入字符化功能

第一步:设计gruntfile.js的配置内容。

‘use strict‘;

module.exports = function
  require(‘load-grunt-tasks‘)(grunt);

  grunt.initConfig({
//
    buddha_Liu: {    //因为我们是在原有文件的基础上,添加字符画,所以我们这里只需要一个src就可以了    //插件的配置参数    options:{      who:‘sheep‘,  //需要连接哪个字符画,这里有horse和sheep两个选项      comentSymbol:"//"  字符画前面的注释符号    },
      dist:{      src:[‘test/fixtures/*.js‘] //需要连接字符画的文件    }
    }
  });

//
  grunt.loadTasks(‘tasks‘);

  grunt.registerTask(‘test‘, [ ‘buddha_Liu‘, ]);

};

第二步:改造Tasks目录下的插件js文件

‘use strict‘;//使用严格模式

var path = require("path");//加载nodeJS中对路径操作的path模块

module.exports = function (grunt) {

  grunt.registerMultiTask(‘buddha_Liu‘, ‘The best Grunt plugin ever.‘, function () {

    // 替换插件默认项
    var options = this.options({
        who:‘sheep‘, //sheep,horse
        commentSymbol:"//"
    });
    //字符画路径地图
    var commentTextMap={
       "horse":"assert/horse.txt",
       "sheep":"assert/sheep.txt"
    }
    //正则匹配表达式,不能多次添加相同字符画到一个文件中
    // var  testRegexMap = {
    //   "sheep":/_.-----..,-‘   (`"--^ /,
    //    "horse":/(   |   y;- -,-""‘"-.\   \/   /
    // }
      //这里的__dirname是nodeJS环境中的全局变量用来表示当前运行代码所在的目录  //用来找到字符画的路径
    var commentFilePath=path.join(__dirname,commentTextMap[options.who]);
      //读取字符画的内容
    var commentFileText=grunt.file.read(commentFilePath);
     //拿到字符画的每一行内容,这里的
  var lineComment = commentFileText.split(grunt.util.normalizelf("\r\n"));
   //给每一行内容加上注释符号
    lineComment = lineComment.map(function(x){
       return options.commentSymbol+x;
    })
  //组成一个新的文件
    commentFileText=lineComment.join(grunt.util.normalizelf("\r\n"));

    // 遍历gruntfile配置的src文件列表
    this.files.forEach(function (file) {

       file.src.filter(function (filepath) {
        // Warn on and remove invalid source files (if nonull was set).
        if (!grunt.file.exists(filepath)) {
          grunt.log.warn(‘Source file "‘ + filepath + ‘" not found.‘);
          return false;
        } else {
          return true;
        }
      }).map(function (filepath) {
        // 读取源文件的内容,在连接上字符画的内容
         var originContent = grunt.file.read(filepath),
               newFileContent = commentFileText + grunt.util.normalizelf("\r\n") + originContent;
                //不能重复添加相同字符画到一个文件中
                // if(testRegexMap[options.who].test(originContent)){
                //   return;
                // }         //将连接好后的文件,重写写入目标文件,完成目标
               grunt.file.write(filepath,newFileContent)
      })

      // 打印消息,提示任务完成.
      grunt.log.writeln(‘File "‘ + file.dest + ‘" created.‘);
    });
  });

};

至此,完成grunt插件的制作,然后可以通过git上传到github中,然后在发布成npm模块,下次使用,可以直接用npm install 来安装这个模块进行使用。

时间: 2024-10-11 03:44:44

grunt插件制作的相关文章

前端自动化工具 grunt 插件的简单使用(一)

Grunt 的简介: Grunt 是一套前端自动化工具,是一个基于 node.js 的命令行工具,它一般用于: 1.压缩文件: 2.合并文件: 3.简单的语法检测: 4.监听文件变动: 5.less 编译: PS:Grunt 官网 (https://gruntjs.com/).Grunt  就像是一个工具箱,拥有非常丰富的任务插件,可以帮助开发人员实现各种各样目标任务的构建.在Grunt工具箱中,按目标任务类型我们可以分为: 1.编译文档型:比如编译 LESS.Sass.Stylus.Coffe

JS图片上传预览插件制作(兼容到IE6)

其实,图片预览功能非常地常见.很意外,之前遇到上传图片的时候都不需要预览,也一直没有去实现过.现在手上的项目又需要有图片预览功能,所以就动手做了一个小插件.在此分享一下思路. 一.实现图片预览的一些方法. 了解了一下,其实方法都是大同小异的.大概有以下几种方式: ①订阅input[type=file]元素的onchange事件. 一旦选择的路径被改变就把图片上传至服务器,然后就返回图片在服务器端的地址,并且赋值到img元素上. 缺点:工作量大,有些上传并不是用户最终需要上传的图片,但是这种方式会

xcode插件制作

Xcode  插件制作入门 对于 Xcode 5,本文有些地方显得过时了.Xcode 5 现在已经全面转向了 ARC,因此在插件初始化设置方面其实有所改变.另外由于一大批优秀插件的带动(可以参看文章底部链接),很多大神们逐渐加入了插件开发的行列,因此,一个简单的 Template 就显得很必要了.在 Github 上的这个 repo 里,包含了一个 Xcode 5 的插件的 Template 工程,省去了每次从头开始建立插件工程的麻烦,大家可以直接下载使用. 另外值得一提的是,在 Xcode 5

unity 编辑器和插件制作(五)

接着前面的继续前行,默默的fighting. 前面讲了,怎么使用摄像机发射线到物体,来触发事件.今天我们 来讲述下怎么去实现一个label. 这个就相对比较简单了,其实我们可以直接使用unity自带得textmesh来实现一个字体,但大多数时候,需要改一些设置,字体大小,材质等等 一些得问题所以我们,最好还是自己写一个脚本来实现一些简单的操作,方便简洁嘛.其实很简单 ,下面我们就开始来实现这些方法. 代码 : using UnityEngine; using System.Collections

JQuery插件制作具有动态效果的网页

JQuery插件 制作具有动态效果的网页   前  言 JQuery 今天我给大家介绍一个运用JQuery插件制作的动态网页--iphone 5C 宣传页面.这个网页中运用到了fullpage.js和move.js两个插件. 动态效果           1导入插件 在这个页面中需要用到三款插件,分别是jquery-3.1.1.js(JQuery 3.1.1版本).jquery.fullPage.js(附带jquery.fullPage.css)和 move.js 动画插件. 导入顺序也如上所示

jQuery拖拽插件制作拖拽排序特效

基于jQuery拖拽插件制作拖拽排序特效是一款非常实用的鼠标拖拽布局插件.效果图如下: 在线预览   源码下载 实现的代码. html代码: <h1>水平拖拽</h1> <div class="demo"> <div class="item item1"><span>1</span></div> <div class="item item2"><

jQuery插件制作方法详解

jQuery插件制作方法详解 jquery插件给我的感觉清一色的清洁,简单.如Jtip,要使用它的功能,只需要在你的元素的class上加 上Jtip,并引入jtip.js及其样式即可以了.其他事情插件全包.我喜欢jquery的一个重要原因是发现她已经有了很多很好,很精彩的插件.写一 个自己的jQuery插件是非常容易的,如果你按照下面的原则来做,可以让其他人也容易地结合使用你的插件. jquery插件给我的感觉清一色的清洁,简单.如Jtip,要使用它的功能,只需要在你的元素的class上加上Jt

【超酷超实用】CSS3可滑动跳转的分页插件制作教程

原文:[超酷超实用]CSS3可滑动跳转的分页插件制作教程 今天我要向大家分享一款很特别的CSS3分页插件,这款分页插件不仅可以点击分页按钮来实现分页,而且可以滑动滑杆来实现任意页面的跳转,看看都非常酷,很适合一些个性化的个人网站使用,当然,这款分页插件也适合ajax翻页,效果都挺不错的.先来看看效果图: 怎么样,还挺酷的吧. 当然你也可以在这里查看插件的DEMO演示. 接下来我们来分享一下源码的实现思路,这里用到了jQuery UI框架,这么酷的滑杆是靠它实现的,不然,写的累死.. 首先是HTM

Xcode7 插件制作入门

概述 我们平时也使用了很多的xcode插件,虽然官方对于插件制作没有提供任何支持,但是加载三方的插件,默认还是被允许的.第三方的插件,需要存放在 ~/Library/Application Support/Developer/Shared/Xcode/Plug-ins文件夹中,后缀名必须是.xcplugin (不过其实际上是一种bundle).所以我们创建一个插件工程,直接创建bundle工程即可,然后通过修改后缀名为.xcplugin,将其放到~/Library/Application Sup