grunt两小时入门

author author     2022-09-18     348

关键词:

目录:
1. 用途和场景
2.Grunt插件
3.相关资源
4.环境安装
5.开始学习
5.1 一个新项目
5.2 生成package.json
5.3 在项目中安装grunt和相关插件
5.4 Gruntfile语法
5.4.1 配置任务
5.4.2 加载插件
5.4.3 注册任务
5.5 为我们的项目配置gruntfile.js
5.6 执行任务
6.后续学习
 

1. 用途和场景
  • jshint代码检查
  • 代码合并
  • 代码压缩--js/css/html都可以
  • SASS/LESS编译css
  • watch监听---文件发生改变自动执行任务
 
以上这些都是可以用grunt来执行的自动化任务。
grunt本身是一种自动化任务处理工具,它是一个工具框架,有很多插件扩展它的功能。
上述的各个功能都有其相对应的grunt插件。
 

2.Grunt插件
Grunt官方给出了60个左右的插件--------日常基本够用
 
另外,来自民间的grunt插件(上传到npm且标记了gruntplugin关键词的)就有上千个------功能十分健全,甚至还有sprites。
 

3.相关资源
官方github:
https://github.com/gruntjs
 
官方网址(文档):
https://gruntjs.com/
 
中文文档:
http://www.gruntjs.net/
 
插件列表:
https://gruntjs.com/plugins
 

4.环境安装
1.首先,grunt依赖Nodejs和npm环境
2.使用npm安装grunt-cli命令行工具
全局安装命令:
npm install -g grunt-cli

 


5.开始学习
 
5.1 一个新项目
假设你手上有一个项目,叫gruntlearn,项目文件中你的源码存储在src目录下:
技术分享
src下,是所有的源码。包含四个模块的js文件,还没编译的scss文件,html文件,图片文件。
 
现在你想用grunt,自动给你的源代码执行几个任务:
  • 将images/html和复制到 发布文件夹build下
  • 用jshint检查js语法
  • 合并四个js文件(分别合并,因为a,b用于不同的页面)
  • 编译scss文件
  • 压缩合并后的js文件,存储到build下
  • 调试:新建一个本地服务器监听文件改变自动刷新HTML文件
 
5.2 生成package.json
首先,要在命令行里打开到gruntlearn的目录下,输入指令npm.init
然后跟着引导,对项目进行相关设置:
技术分享
最后会根据你的设置,在项目根目录下生成一个package.json的文件
技术分享
 
这个文件是nodejs用来描述一个项目的文件。这时候你还没有在你的项目中使用grunt以及相关插件。
 
5.3 在项目中安装grunt和相关插件
根据第1步中的需求,需要用到一下插件:
 
安装grunt命令:
技术分享
 
技术分享
后面的参数意思是【把刚刚安装的东西添加到package.json中】。
出现[email protected]版本号,说明安装成功了。
在安装完以后,你就可以看见在package.json中多了:
技术分享
并且在项目根目录下增加了node_modules文件夹,这里面存放的就是当前项目安装的node模块。
 
一次性安装插件:
命令:
npm install --save-dev grunt-contrib-copy grunt-contrib-concat grunt-contrib-jshint grunt-contrib-sass grunt-contrib-uglify grunt-contrib-watch grunt-contrib-connect

 

技术分享
 
5.4 Gruntfile语法
Gruntfile文件:
Gruntfile.js 或 Gruntfile.coffee 文件是有效的 JavaScript 或 CoffeeScript 文件,应当放在你的项目根目录中,和package.json文件在同一目录层级,并和项目源码一起加入源码管理器。
Gruntfile结构:
  • "wrapper" 函数
    • 项目与任务配置
    • 加载grunt插件和任务
    • 自定义任务
 
具体的代码结构:
技术分享
 
5.4.1 配置任务
例如官方文档中的如下代码:
grunt.initConfig({
  pkg: grunt.file.readJSON(‘package.json‘),
  uglify: {
    options: {
      banner: ‘/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n‘
    },
    build: {
      src: ‘src/<%= pkg.name %>.js‘,
      dest: ‘build/<%= pkg.name %>.min.js‘
    }
  }
});

其中先写了一句 pkg: grunt.file.readJSON(‘package.json‘) 功能是读取 package.json 文件,并把里面的信息获取出来,方便在后面任务中应用(例如下面就用了 <%= pkg.name %> 来输出项目名称),这样可以提高灵活性。

之后的uglify对象就是自定义的任务,uglify对象里面具体配置,需要根据不同插件的文档来定义。
 
5.4.2 加载插件
很easy:
grunt.loadNpmTasks(‘grunt-contrib-uglify‘);

 

5.4.3 注册任务
 
在default上注册任务:
grunt.registerTask(‘default‘, [‘uglify‘]);

(default是默认的task,当你在命令行执行grunt的时候,会执行注册在default上的任务)

 
自定义注册任务:
grunt.registerTask(‘compress‘, [‘uglify:build‘]);

如果想要执行这个 task,我们需要在命令行输入 grunt compress 命令来执行这条 task,而这条 task 的任务是 uglify 下面的 build 任务,也就是说,我们只会执行 uglify 里面 build 定义的任务,而不会执行 uglify 里面定义的其他任务。

 
需要注意:
task 的命名不能与后面的任务配置同名,也就是说这里的 compress 不能命名成 uglify,这样会报错或者产生意外情况
 
5.5 为我们的项目配置gruntfile.js
下面是我参考插件文档写的代码:
 
//wrapper函数
module.exports = function(grunt) {

    //你可以像普通的js文件一样添加自己的代码
    var sassStyle = ‘expanded‘;

    //1.配置任务 tasks--根据插件的文档来定义任务
    grunt.initConfig({
        pkg: grunt.file.readJSON(‘package.json‘),
        //将html和图片从src复制到build
        copy: { //task
            html: { //target
                files: [
                    { expand: true, cwd: ‘./src/html‘, src: ‘*‘, dest: ‘./build/html/‘ }
                ]
            },
            images: { //target
                files: [
                    { expand: true, cwd: ‘./src/images‘, src: ‘*‘, dest: ‘./build/images/‘ }
                ]
            }
        },
        //合并js
        concat: {
            /* options: {
                separator: ‘;‘,//合并分隔符
            }, */
            dist: {
                files: { //文件路径
                    ‘./src/js/a.all.js‘: [‘./src/js/a.1.js‘, ‘./src/js/a.2.js‘],
                    ‘./src/js/b.all.js‘: [‘./src/js/b.1.js‘, ‘./src/js/b.2.js‘]
                }
            },
        },
        //task:编译sass
        sass: {
            output: { //target
                options: { //target options
                    style: sassStyle
                },
                files: {
                    ‘./build/css/style.css‘: ‘./src/scss/style.scss‘ //‘目标文件‘:‘源文件‘
                }
            }
        },
        //代码检查
        jshint: {
            all: [‘./src/js/a.all.js‘, ‘./src/js/b.all.js‘]
        },
        //压缩
        uglify: {
            uglifyjs: {
                files: {
                    ‘./build/js/a.min.js‘: [‘./src/js/a.all.js‘],
                    ‘./build/js/b.min.js‘: [‘./src/js/b.all.js‘]
                }
            }
        },
        //监听
        watch: {
            scripts: {
                files: [‘./src/js/a.1.js‘, ‘./src/js/a.2.js‘, ‘./src/js/b.1.js‘, ‘/src/js/b.2.js‘],
                tasks: [‘concat‘, ‘jshint‘, ‘uglify‘]
            },
            sass: {
                files: [‘./src/scss/style.scss‘],
                tasks: [‘sass‘]
            },
            livereload: {
                options: {
                    liverelload: ‘<%= connect.options.livereload %>‘
                },
                files: [
                    ‘./src/html/index.html‘,
                    ‘./src/scss/style.scss‘,
                    ‘./src/js/a.1.js‘,
                    ‘./src/js/a.2.js‘,
                    ‘./src/js/b.1.js‘,
                    ‘./src/js/b.2.js‘
                ]
            }
        },
        connect: {
            options: {
                port: 9000,
                open: true,
                livareload: 35729,
                //change this to ‘0.0.0.0‘ to access the server from outside
                hostname: ‘localhost‘
            },
            server: {
                options: {
                    port: 9001,
                    base: ‘./‘
                }
            }
        }
    });

    //2.加载插件
    grunt.loadNpmTasks(‘grunt-contrib-copy‘);
    grunt.loadNpmTasks(‘grunt-contrib-concat‘);
    grunt.loadNpmTasks(‘grunt-contrib-sass‘);
    grunt.loadNpmTasks(‘grunt-contrib-jshint‘);
    grunt.loadNpmTasks(‘grunt-contrib-uglify‘);
    grunt.loadNpmTasks(‘grunt-contrib-watch‘);
    grunt.loadNpmTasks(‘grunt-contrib-connect‘);

    //3.注册任务
    grunt.registerTask(‘copyhtml‘, [‘copy:html‘]); //可以用task:target的方法分别注册
    grunt.registerTask(‘concatjs‘, [‘concat‘]); //也可以只用task名称注册,默认执行task下全部target
    grunt.registerTask(‘outputcss‘, [‘sass‘]);
    grunt.registerTask(‘watchit‘, [‘concat‘, ‘sass‘, ‘jshint‘, ‘uglify‘, ‘connect‘, ‘watch‘]);
    grunt.registerTask(‘default‘, [‘copy‘, ‘concat‘, ‘sass‘, ‘jshint‘, ‘uglify‘]);
}

  

 
 
5.6 执行任务
注意:
由于npm install sass安装的sass是dart写的,而grunt-contrib-sass插件需要的是ruby的版本,
所以执行sass任务时,如果安装的是npm sass,会导致编译后的css文件为空,
此时需要用 gem install sass 命令提前安装Ruby版本的sass。
 
将上面的代码复制到你的gruntfile.js文件里,就可以在命令行执行几个呗注册的任务。
例如执行:grunt grunt default
技术分享
 
执行后的代码目录:
技术分享
成功啦~~~撒花
 
另外:
执行watchit命令后,即可自动构建本地服务器,自动打开浏览器,监听改变自动刷新。
 
 

6.后续学习
  • 上述例子仅供学习,有些配置还值得推敲,具体的插件配置文档还有很多细节可以学习。
 

grunt快速入门

快速入门Grunt和Grunt插件是通过 npm 安装并管理的,npm是 Node.js 的包管理器。Grunt0.4.x必须配合Node.js >=0.8.0版本使用。;奇数版本号的Node.js被认为是不稳定的开发版。在安装Grunt前,请确保当前环境中所安装的&... 查看详情

grunt入门学习-gruntfile具体示例

  经过前面的学习,将测试的Gruntfile整合在一起!/***CreatedbyAdministratoron2017/6/22.*/module.exports=function(grunt){"usestrict";grunt.initConfig({pkg:grunt.file.readJSON("package.json"),//将存储在package.json文件中的grunt版本信 查看详情

grunt使用入门

一、首先用npm在global环境安装grunt-cli,注意在任何目录下install-g都是一样的 npminstall-ggrunt-cli二、安装grunt插件时项目中一定要package.json,所以在项目中加一个最简单的package.json。不然的话插件安装不上。三、在项目目录下安... 查看详情

grunt入门

 Grunt简介:插件丰富,功能强大,jshint对JS文件的检测,以及js和css文件的合并,压缩,是前端自动化压缩构建项目的得力助手。接下来就随lizimeme一起学习grunt的基本使用  我的电脑安装了nodejs,自动全局安装了npm(npm是... 查看详情

grunt入门学习

前端工作流,Grunt上手指南Posted@2013-04-207:15a.m.CategoriesGrunt ,  javascript我想先花点时间回忆一下作为一个前端需要做的工作(Loading...)JS合并JS压缩CSS压缩CSSSprite图片优化测试静态资源缓存(版本更新)...对应的,一个全副武... 查看详情

yeoman和grunt使用入门教程

 下载地址:百度网盘下载 查看详情

glup入门

本文是gulp的入门级介绍,主要内容包括什么是gulp,gulp与grunt有什么区别,gulp可以解决grunt存在的哪些问题,以及一个简单的说明例子。什么是gulpgulp的官方定义非常简洁: 基于文件流的构建系统 。这里强调了streaming,... 查看详情

两小时入门docker(代码片段)

引入Docker是什么?Docker最初是dotCloud公司创始人SolomonHykes在法国期间发起的一个公司内部项目,于2013年3月以Apache2.0授权协议开源,主要项目代码在GitHub上进行维护。Docker使用Google公司推出的Go语言进行开发实现。docker是linux容器的... 查看详情

杂项:grunt-tmod(代码片段)

...~0.4.1如果你没有用过 Grunt ,可以先看一下 新手入门 指南,里面有 查看详情

sass编译css/grunt压缩文件

Sass安装(mac)$sudogeminstallsassscss编译成css文件$sassui.scssui.cssCLI安装$npminstall-ggrunt-cliGrunt安装$npminstallgruntGrunt入门package.json{"name":"my-project-name","version":"0.1.0","devDependencies":{grunt":" 查看详情

前端工程化系列[04]-grunt构建工具的使用进阶(代码片段)

在前端工程化系列[02]-Grunt构建工具的基本使用和前端工程化系列[03]-Grunt构建工具的运转机制这两篇文章中,我们对Grunt以及Grunt插件的使用已经有了初步的认识,并探讨了Grunt的主要组件以及它的运转机制,这篇文章是Grunt使用... 查看详情

grunt压缩html和css

...帮你或你的小组完成大部分无聊的工作.下面咱们来快速入门一下:Grunt和Grunt插件是通过npm安装并管理的,npm是Node.js的包管理器.所以也就是说,想要安装Grunt就必须要安装Node,想要安装G 查看详情

dp入门问题

...没敲代码完全没手感。作为总结,贴一道昨天浪费了我两小时的dp。http://acm.dirring.com/problem.php?cid=1003&pid=3问题D:Dirringlove音乐时间限制: 1Sec  内存限制: 128MB提交: 34  解决: 10题目描 查看详情

《qtquick4小时入门》学习笔记4

http://edu.csdn.net/course/detail/1042/14806?auto_start=1QtQuick4小时入门第七章:处理鼠标与键盘事件1、处理鼠标事件鼠标信号传递一个MouseEvent类型的mouse参数importQtQuick2.7importQtQuick.Controls2.0importQtQuick.Layouts1.0importQtQuick.Win 查看详情

如何在两次之间添加每小时计数

】如何在两次之间添加每小时计数【英文标题】:Howtoaddacountperhourbetweentwotimes【发布时间】:2019-01-1016:17:09【问题描述】:我不确定这是否可行,但我想显示在条目有效的每小时两个日期/时间之间有效的结果:RcvDateTimeFinishDateTi... 查看详情

elasticsearch7.8.0版本入门——elasticsearch-head插件的安装(win10环境)(代码片段)

目录一、elasticsearch-head插件的介绍二、Elasticsearch7.8.0及Node安装三、Grunt安装四、elasticsearch-head插件的下载五、elasticsearch-head插件的安装六、访问elasticsearch-head插件一、elasticsearch-head插件的介绍elasticsearch-head是用于监控Elasticsearch... 查看详情

java中两次之间小时的正确格式

】java中两次之间小时的正确格式【英文标题】:Correctformatforhoursbetweentwotimesinjava【发布时间】:2016-08-1906:36:26【问题描述】:我正在尝试计算java中两次之间的小时数。我正在使用joda时间库来格式化它。该程序可以提取在文本框... 查看详情

宋宝华:docker最初的2小时(docker从入门到入门)

最初的2小时,你会爱上Docker,对原理和使用流程有个最基本的理解,避免满世界无头苍蝇式找资料。本人反对暴风骤雨式多管齐下狂轰滥炸的学习方式,提倡迭代学习法,就是先知道怎么玩,有个感性认识,再深入学习高级用... 查看详情