Grunt项目搭建

首先介绍一篇比较棒的文章:
http://www.cnblogs.com/wangfupeng1988/p/4561993.html
之后,我有必要改改自己的文章啦 /(ㄒoㄒ)/~~

安装


安装时可能需要使用sudo(针对OSX、*nix、BSD等系统中)权限或者作为管理员(对于Windows环境)来执行以下命令。
Grunt.js 0.4之后,其不再使用全局方式安装整个Grunt.js,而是在全局安装Grunt.js Client,然后在当前项目中安装Grunt,来避免未来不同项目对Grunt不同版本的依赖关系。
如果安装了之前的版本,可以使用npm的命令来删除掉原来的Grunt.js。

 npm uninstall -g grunt

然后安装:Grunt.js Client:

 npm install -g grunt-cli

注意,安装grunt-cli并不等于安装了 Grunt!Grunt CLI的任务很简单:调用与Gruntfile在同一目录中 Grunt。这样带来的好处是,允许你在同一个系统上同时安装多个版本的 Grunt。

这样就能让多个版本的 Grunt 同时安装在同一台机器上。

package.json


{
 "name": "my-project",
 "version": "0.1.0",
 "devDependencies": {
      "grunt": "~0.4.1"  //或者“*”
       "grunt-contrib-less": "*",
       "grunt-contrib-watch": "*"
 }
}

package.json是项目的配置文件,有一些项目的依赖信息,以及作者、版本等信息。我们先写一个简单的package.json。

  • name属性,表示该项的名字。
  • version属性,则是该项目的版本号。
  • devDependencies属性,则包含该项目的依赖,目前我们的依赖只有grunt,以及版本为0.4.1。

在终端大概包含该package.json的目录,输入命令:

 npm install

会发现,该目录此时多了一个node_modules文件夹,里面有个grunt文件夹,这个就是我们安装在项目的Grunt.js。(表示只用less和watch)

写Gruntfile.js


module.exports = function(grunt) {

// 给grunt添加些设置
grunt.initConfig({
  less: {
    options: {
        paths: ['less'],
        compress: false,   //是否压缩
        yuicompress: false, //是否压缩
        optimization: 2
    },
    compile: {
        expand: true,
        cwd: 'less',
        src: ['**/*.less'],   //路径
        dest: 'css/',  //编译导出路径
        ext: '.css'   //扩展名
    }
  },  
  watch: {
    less: {
        files: ['less/*.less'],
        tasks: ['less']
    }
  }
 });

// 载入 "uglify" 插件任务
grunt.loadNpmTasks('grunt-contrib-less');
grunt.loadNpmTasks('grunt-contrib-watch');

// 定义默认需要执行的任务
grunt.registerTask('default', ['less', 'watch']);
};

拿一份现有的 Grunt 项目练手


假定Grunt CLI已经正确安装,并且已经有一份配置好package.json和 Gruntfile文件的项目了,接下来就很容易拿Grunt练手了:

  • 将命令行的当前目录转到项目的根目录下。
  • 执行npm install命令安装项目依赖的库。
  • 执行 grunt命令。

OK,就是这么简单。还可以通过grunt --help命令列出所有已安装的Grunt任务(task),但是一般更建议去查看项目的文档以获取帮助信息。

package.json

 {
   "family": "dq",
   "name": "dq-demo-static",
   "version": "0.0.1",
   "private": true,
   "devDependencies": {
       "grunt": "*",
       "grunt-cmd-combo": "~1.0.0",
       "grunt-contrib-less": "~0.9.0",
       "grunt-contrib-uglify": "~0.2.2",
       "grunt-contrib-watch": "*"
    }
 }

Gruntfile.js

解释:

module.exports = function(grunt){
// 构建配置任务
grunt.initConfig({
    //读取package.json的内容,形成个json数据
       pkg: grunt.file.readJSON('package.json'),

    // 复制
    copy: {
        // 指定子任务,调用可以是grunt copy(执行copy里面的全部任务),grunt copy:build(执行copy里面的build任务)
        build: {
            cwd: 'js',      //指向的目录是相对的,全称Change Working Directory更改工作目录
            src: ['**'],    //指向源文件,**是一个通配符,用来匹配Grunt任何文件
            dest: 'images', //用来输出结果任务
            expand: true    //expand参数为true来启用动态扩展,涉及到多个文件处理需要开启
        },
        // 注:如果src: [ '**', '!**/*.styl' ],表示除去.styl文件,!在文件路径的开始处可以防止Grunt的匹配模式
    },

    // 清除
    clean: {
        build: {
            src: ['css/**/*.*']
        },
    },

    less: {
        dynamic_mappings: {
            files: [{
                expand: true,     // Enable dynamic expansion.
                cwd: 'build/less',      // Src matches are relative to this path.
                src: ['**/*.less', '!**/header.less', '!**/sidebar.less', '!**/footer.less', '!**/reset.less', '!**/layout.less', '!**/nprogress.less', '!**/post.less', '!**/single.less'], // Actual pattern(s) to match.
                dest: 'css',   // Destination path prefix.
                ext: '.css',   // Dest filepaths will have this extension.
            }],
        },
    },

    // CSS压缩
    cssmin: {
          build: {
              expand: true,
            cwd: 'css/',
            src: ['*.css', '!*.min.css'],
            dest: 'css/',
            ext: '.css'
          }
    },

    // 压缩js
    uglify: {
        // 基本压缩(用于不常修改的文件)
          build: {
           files: [{
              expand: true,
              cwd: 'build/js',
              src: ['*.js', '!**/component.js', '!**/jquery.js', '!**/html5.js'],
              dest: 'js/'
          }],
          },
          // public(常修改维护的文件)
          publicJs: {
          files: {
            'js/public.js': ['build/js/public.js']
          }
          },
          // 组件压缩(组件级别,一般仅压缩一次)
          component: {
            options: {
                  mangle: false  // false表示关闭短命名方式压缩。如果文件要共享到另一个项目中,会带来问题,因为名称已改变
            },
            files: {
                  'js/component.js': [ 'build/js/component/piano_storage.js']
            },
        },
    },

    // JS语法检查
    jshint: {
        all: ['js/*.js'],
    },

    // 监听(监测到文件改变时执行对应任务)
    watch: {
          stylesheets: {
            files: 'build/less/*.less',
            tasks: [ 'stylesheets' ]
          },
          publicJs: {
            files: 'build/js/public.js',
            tasks: [ 'uglify:publicJs' ],
          },
          scripts: {
              files: ['build/js/*.js', '!build/js/**/public.js' ],
            tasks: [ 'uglify:build' ],
          },
          componentJS: {
              files: ['build/js/component/*.js'],
            tasks: [ 'uglify:component' ],
          }
    },

// initConfig结尾
});

// 加载任务-分开加载
grunt.loadNpmTasks("grunt-contrib-copy");
grunt.loadNpmTasks("grunt-contrib-less");
grunt.loadNpmTasks("grunt-contrib-jshint");
grunt.loadNpmTasks("grunt-contrib-uglify");
grunt.loadNpmTasks("grunt-contrib-watch");
grunt.loadNpmTasks("grunt-contrib-clean");
grunt.loadNpmTasks("grunt-contrib-cssmin");

// 把grunt-contrib插件全部一次性加载
// grunt.loadNpmTasks('grunt-contrib');

// grunt.event.on('watch', function(action, filepath) {
//       grunt.config(['uglify', 'build'], filepath);
// });
grunt.event.on('watch', function(action, filepath) {
  grunt.config(['jshint', 'all'], filepath);
});

// 自定义任务
// 作用:将以上众多子任务和在一起,便于手工运行或定义watch的任务

// 处理CSS
grunt.registerTask(
      'stylesheets', 
      'Compiles the stylesheets.', 
      // [ 'less' ]
      [ 'less', 'cssmin' ]
);
// 处理JS
grunt.registerTask(
      'scripts', 
      'Compiles the JavaScript files.', 
      [ 'uglify:publicJs' ]
);
// 处理public
grunt.registerTask(
      'publicJs', 
      'Compiles the JavaScript files.', 
      [ 'uglify:publicJs' ]
);
// componentJS
grunt.registerTask(
      'componentJS', 
      'Compiles the JavaScript files.', 
      [ 'uglify:componentJS' ]
);

// 创建工程
grunt.registerTask(
      'build',    //任务名称
      'Compiles all of the assets and copies the files to the build directory.',   //任务描述
      [ 'clean', 'copy', 'stylesheets', 'scripts', 'jade' ]    //将要运行的任务数组,按顺序执行
);

// 默认工程
grunt.registerTask(
      'default', 
      'Watches the project for changes, automatically builds them and runs a server.', 
      [ 'build', 'connect', 'watch' ]
);
// default任务运行build创建一个初始的build,然后它开始连接服务器,最后它会运行watch,监测文件变化和重新构建。
// 因为watch一直在运行,所以服务器一直在运行。在你的控制台上运行grunt,然后到http://localhost:4000查看你的项目。

//modules结尾 
};

使用:

module.exports = function(grunt) {
grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    combo : {
        build: {
            files: [{
                expand: true,
                cwd: 'script-ss/',
                src: ['./page/*.js'],
                dest: './script-min/',
                ext: '.js'
            }]
        }
    },
    uglify: {  
        build: {  
            files: [{
                expand: true,
                cwd: 'script-min',
                src: ['**/*.js'],
                dest: 'script-min'
            }
            , {
                expand: true,
                cwd: 'script-ss',
                src: ['**/*.js'],
                dest: 'script-min'
            }]
        }  
    },  
    less: {
        options: {
            paths: ['less'],
            compress: true,
            yuicompress: true,
            optimization: 2
        },
        compile: {
            expand: true,
            cwd: 'less',
            src: ['**/*.less'],  
            dest: 'css/',
            ext: '.css'
        }
    },  
    watch: {
        less: {
            files: ['less/**/*.less'],
            tasks: ['less'],
            options: {
                nospawn: true
            }
        },
        combo: {
            files: ['script-ss/**/*.js'],
            tasks: ['combo'],
            options: {
                spawn: false,
            },
        }
    }

});  

grunt.loadNpmTasks('grunt-cmd-combo');  
grunt.loadNpmTasks('grunt-contrib-uglify');  

grunt.loadNpmTasks('grunt-contrib-less')
grunt.loadNpmTasks('grunt-contrib-watch')

grunt.registerTask('default', ['watch']);
grunt.registerTask('mkcss', ['less']);
grunt.registerTask('normal', ['combo']);
grunt.registerTask('min', ['combo', 'uglify']);
grunt.registerTask('build', ['less', 'combo', 'uglify']);
};

目录结构

目录结构

html文件引入

   <script src="script-min/page/tt.js" data-main="page/tt"></script>

tt.js

define(function(require,exports){
   var t2 = require('./t2')
   alert(1)
 });
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352

推荐阅读更多精彩内容

  • 快速入门 Grunt和 Grunt 插件是通过 npm 安装并管理的,npm是 Node.js 的包管理器。Gru...
  • 快速入门 Grunt和 Grunt 插件是通过 npm 安装并管理的,npm是 Node.js 的包管理器。 在安...
    angelwgh阅读 1,106评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,647评论 18 139
  • Grunt是一个任务管理器,能大大提高您运行前端开发工作流程。使用大量的Grunt插件可以自动执行任务,例如编译S...
    寒梁沐月阅读 591评论 0 2
  • 苦熬的艰
    微笑丶诠释我的沉沦阅读 140评论 0 1