Grunt项目搭建

2015-06-12  本文已影响1006人  ddai_Q

首先介绍一篇比较棒的文章:
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。

在终端大概包含该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练手了:

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)
 });
上一篇下一篇

猜你喜欢

热点阅读