grunt插件制做

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

一个从无到有的项目,因此咱们须要用yeoman来初始化项目。上yeoman官网的generator收纳页搜索gruntpluginnode

安装这个generator:jquery

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

生成项目代码git

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

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

 

 

 

 

 

 

 

 

 

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

下载字符画json

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

     

 

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的配置内容。grunt

'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 来安装这个模块进行使用。

相关文章
相关标签/搜索