教程:于江水的Grunt 新手一日入门

Grunt是基于Nodejs的工具,有大量插件来帮助前端工程师做一些重复性的工作,比如:使用jshint检查代码,合并多个js、css文件,压缩js、css文件,编译sass文件,预览项目。

安装必要组件

  1. 下载并安装NodeJS
  2. 安装Grunt,打开Windows命令提示符cmd,使用命令npm install -g grunt-cli-g参数意思是安装到全局,而不是当前目录。
  3. Windows平台安装Ruby,需要使用rubyinstaller
  4. 安装Ruby的包管理工具Gem,需要手动下载这个页面的ZIP文件。解压到任意目录,比如D:\rubygems-2.6.8。在Windows命令提示符中进入该目录,运行命令ruby setup.rb
  5. 安装sass,gem install sass

开始

创建一个项目

创建一个目录,比如说d:\myproj,进入目录运行npm init来创建一个NodeJs项目,并生成该项目的配置文件。
也可以直接创建一个package.json文件。把以下内容贴进去:

{
  "name": "my-project-name",//项目名
  "version": "0.1.0",//项目版本
  "devDependencies": {//开发过程中需要的模块
    "grunt": "~0.4.5",//表示需要版本号为0.4.5的grunt,以及版本号到0.9.9的新版本。
    "grunt-contrib-jshint": "~0.10.0",
    "grunt-contrib-nodeunit": "~0.4.1",
    "grunt-contrib-uglify": "~0.5.0"
  }
}

再创建几个目录,来存放不同的文件,可以根据自己需求更改:

  • src:原始的js文件
  • scss: sass文件
  • js: jsHint检查、合并、压缩后的js文件
  • css: 编译,压缩后的css文件

安装Grunt插件

此处需要以下五个插件:

  • 合并文件:grunt-contrib-concat
  • js检查:grunt-contrib-jshint
  • Sass编译: grunt-contrib-sass
  • 压缩文件: grunt-contrib-uglify
  • 监视文件更改:grunt-contrib-watch
  • 建立本地服务器:grunt-contrib-connect

这些插件都是npm包,使用npm命令即可安装npm -g --save-dev grunt-contrib-concat grunt-contrib-jshint grunt-contrib-sass grunt-contrib-uglify grunt-contrib-watch grunt-contrib-connect

--save-dev参数是说将这些包的信息保存到package.json的devDepandencies开发依赖包中。Grunt只在开发过程中使用,开发完成后就不需要了,所以放在devDepandencies。
--save,如果是jQuery、Bootstrap、AngularJS这类前端框架,开发完成后也要使用,就要用这个参数。

配置Grunt

新建一个Gruntfile.js文件,先填上

module.exports = function(grunt) {

  // 项目相关配置
  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',
        js: 'build/<%= pkg.name %>.min.js'
      }
    }
  });

  // 二. 载入uglify插件
  grunt.loadNpmTasks('grunt-contrib-uglify');

  // 三. 默认任务
  grunt.registerTask('default', ['uglify']);

};

这个配置文件做了这些事:

  1. 从package.json读取项目配置;
  2. 使用了uglify插件。给插件配置了一个生成顶部信息的参数,并让插件从src目录查找js文件,压缩后放到js目录;
  3. 载入了uglify插件;
  4. 注册一个任务,任务名叫default,任务内容是使用上面定义的uglify插件。在命令行中直接运行grunt,就相当于运行grunt default

接下来还有三步:

配置任务

本文用于解决Excel中,把很多条数据分别填充到一个模板的问题。

需要了解的信息

Excel 函数:

  1. address。接受5个参数,返回由这五个参数生成的对单元格的引用。 用法:address(第几行,第几列(数字),相对引用还是绝对引用,此处用不到不填,另一个工作表的名字)
    比如,ADDRESS(1,3,1,,"Sheet2"),返回Sheet2!$C$1。这样一来,只要修改它的参数即可更改引用的单元格。但是结果是文本字符串,要得到这个字符串所引用的单元格的值就要用indirect。
  2. indirect。接受2个参数,返回第一个参数指定的单元格的值,第二个参数此处用不到,省略。用法:indirect("上面公式生成的字符串")
    例如,indirect("Sheet2!$C$1"),将返回Sheet2工作表,C列,第1行的值。等同于公式=Sheet2!$C$1

开始

  • 假如打印模板和数据是这样的,模板在Sheet1,数据在Sheet2。打印区域已设置好。
    sheet.png
    data.png
    姓名单元格的公式就是=INDIRECT(ADDRESS(2,1,1,,"Sheet2")),提取Sheet2表,第二行,第一列的数据。生日的公式就是=INDIRECT(ADDRESS(2,2,1,,"Sheet2")),获取Sheet2表,第二行,第二列的数据。其他单元格以此类推。

  • 这样就做好了基本的样子,接下来让这个模板能填充其他数据
    在一个单元格中填入序号,比如G1。那么第一位同学的数据行号是2,第二位是3,依次递增。那么只需要更改公式中的行号,改成1加上序号,就能让模板内容随着序号改变而更新。那么姓名的公式就该改成=INDIRECT(ADDRESS(1+G1,1,1,,"Sheet2"))。请注意ADDRESS函数的第一个参数。这样,改动序号就能填充其他同学的数据了。

  • 加个按钮来更改序号吧
    首先在选项-自定义功能区-开发工具前面打勾,确定。点击菜单栏的开发工具,插入ActiveX控件“数值调节钮”。在表上画出一组上下按钮。在按钮上右键-属性,修改Min为1,Max为Sheet2中数据总行数,LinkedCell为G1。
    点击“设计模式”。再点击按钮,序号和模板中的数据应该就可以变化了。

  • 加个按钮一键打印
    在开发工具中添加ActiveX控件,按钮。右键按钮选属性,其中Caption就是按钮上显示的文字,改成“打印”或者随便什么文字。
    双击按钮进入代码编辑。在光标位置输入代码ActiveSheet.PrintOut
    退出设计模式,再点击按钮就会以当前默认的打印机、纸张、边距、打印区域等设置打印出当前表了。

  • 打印后自动增加序号
    在打印按钮的代码中,ActiveSheet.PrintOut下面,添加一句Range("G1").Value = Range("G1").Value + 1

  1. Input file not specified
    检查fastcgi_pass是127.0.0.1:9000还是unix:/tmp/php-cgi.sock

  2. 500错误:
    检查地址栏目前的php文件,将以下代码加入该文件,即可提示详细错误,而不是500

ini_set('display_errors','1');
error_reporting(E_ALL);
  1. Fatal Error: permission denyed
    检查nginx.conf第一行,nginx使用的用户。比如www
    将网站目录下文件所有者替换为nginx使用的用户。chown -R www *
    将网站目录下的文件权限更改为750 chmod -R 750 *

  2. 登陆后台提示 Access denied
    开启php的pathinfo
    先找php.ini文件的位置find / -name php.ini
    编辑php.ini,把fix_pathinfo =0改为等于1