zoukankan      html  css  js  c++  java
  • Grunt 构建网站初探

    一直在钻研关于 Umbraco 的东西, 打算换换脑子,玩点别的东西先。

    Grunt 是之前两个项目中,尝试开始使用的东西,因为不是专职的前端攻城狮,所以对于这类东西还是知之甚少,不过经过这两次的使用,真心觉得这种东西非常的便利,选择了对的工具,很多工作都可是事半功倍的。

    具体 Grunt 是什么,请自行前往官网了解。中文版网站,近期不知为何不能访问了,www.gruntjs.net,看起来不是被墙的原因,似乎是服务除了什么故障。

    How to started,根据官网的指南一步步做下来即可。之前一直在用 mac,给同事 Windows 安装时确实也遇到了一点问题,在此仅给出 Windows平台安装的的一点建议。

    1、不必使用类似于 n 或者 nvm 一类的 node 版本管理工具进行安装,这在某些集团企业中,设置权限是非常麻烦的事情;

    2、直接下载 nodejs 官网的 for windows 安装包下载 node,安装好之后,运行:

    npm install -g grunt grunt-cli grunt-init
    

      *以上分别是安装 grunt、grunt 命令行工具,init 是一个 grunt 插件,可以初始化基本的 grunt 文件结构。

    3、安装好后,一定记得设置 windows 环境变量,将 Grunt 安装的目录,配置到系统 PATH 路径中去,否则当你关闭 dos 窗口再开启,则会提示找不到 Grunt 命令,而你再次安装又会提示报错。

    Grunt 结构中,有两个最为重要的结构性描述文件:package.json、Gruntfile.js,前者实际也是 node 项目的标配,后者是 Grunt 独有的构建文件。

    package.json 文件:

    {
      "name": "grunt_templete",
      "version": "1.0.0",
      "description": "基础的Grunt项目模板",
      "license": "MIT",
      "repository": {
        "type": "git",
        "url": "https://git.oschina.net/xxxx"
      },
      "devDependencies": {
        "grunt": "^1.0.1",
        "grunt-contrib-clean": "^1.1.0",
        "grunt-contrib-concat": "^1.0.1",
        "grunt-contrib-copy": "^1.0.0",
        "grunt-contrib-cssmin": "^2.2.0",
        "grunt-contrib-htmlmin": "^2.3.0",
        "grunt-contrib-jshint": "^1.1.0",
        "grunt-contrib-less": "^1.4.1",
        "grunt-contrib-uglify": "^3.0.1",
        "grunt-contrib-watch": "^1.0.0"
      }
    }
    

      *其中,关于依赖包的版本号,是需要权衡考虑的,如果项目时间较长,可能会不定期的更新 package.json,导致团队间共享要小心该文件的管理,还是改为固定版本较好;如果是短期项目,则可是使用"^"来自动更新至最新版本。

    Gruntfile.js 文件:

    module.exports = function(grunt) {
        grunt.file.defaultEncoding = 'utf-8';
        /**project configuration*/
        grunt.initConfig({
            pkg : grunt.file.readJSON('package.json'),
    
            clean: {
                contents: ['dest/*'],
                subfolders: ['dest/*/'],
                css: ['dest/assets/css/*'],
                js: ['dest/assets/js/*'],
                cleantemp:['dest/assets/css/temp']
            },
            less: {
                default: {
                    files: [{
                        expand: true,
                        cwd: 'src/less',
                        src: ['*.less'],
                        dest: 'dest/assets/css/temp',
                        ext: '.css'
                    }]
                }
            },
            cssmin: {
                default:{
                    files: [{
                        expand: true,
                        cwd: 'dest/assets/css/temp',
                        src: ['*.css'],
                        dest: 'dest/assets/css/',
                        ext: '.min.css'
                    }]
                }
            },
            jshint:{
                options:{
                    expr:true, 
                    lastsemic : true,
                    scripturl:true, 
                    ignores : ['dealer-*.js']
                },
                beforeuglify:['Gruntfile.js', 'src/js/*.js'],
                afteruglify:['dest/assets/js/*.js', '!dest/assets/js/dealer.min.js']
            },
            uglify:{
                buildall: {
                    files: [{
                        expand:true,
                        cwd: 'src/js',
                        src:'*.js',//所有js文件
                        dest: 'dest/assets/js',//输出到此目录下
                        ext: '.min.js'
                    }]
                },
            },
            copy: {
                main: {
                    expand: true,
                    nonull: true,
                    cwd: 'src/html',
                    src: '**',
                    dest: 'dest/',
                    options: {
                    }
                },
                resources: {
                    expand: true,
                    nonull: true,
                    cwd: 'src/images',
                    src: '**',
                    dest: 'dest/assets/images',
                }
            },
            watch: {
                css: {
                    files: ['src/less/*.less'],
                    tasks: ['less', 'cssmin', 'clean:cleantemp'],
                    options: {
                        interrupt: true,
                        spawn: false
                    }
                },
                js: {
                    files: ['src/js/*.js'],
                    tasks: ['jshint:beforeuglify', 'uglify', 'jshint:afteruglify'],
                    options: {
                        interrupt: true,
                        spawn: false
                    }
                },
                resources: {
                    files: ['src/html/*', 'src/html/**/*', 'src/images/*', 'src/images/**/*'],
                    tasks: ['copy'],
                    options: {
                        interrupt: true,
                        spawn: false,
                        event: ['all'],
                    }
                }
            }
        });
    
        /**load tasks package*/
        grunt.loadNpmTasks('grunt-contrib-clean');
        grunt.loadNpmTasks('grunt-contrib-less');
        grunt.loadNpmTasks('grunt-contrib-cssmin');
        grunt.loadNpmTasks('grunt-contrib-jshint');/**语法检查**/
        grunt.loadNpmTasks('grunt-contrib-uglify');/**js 压缩**/
        grunt.loadNpmTasks('grunt-contrib-copy');
        grunt.loadNpmTasks('grunt-contrib-watch');
        
        grunt.registerTask('default', ['clean', 'less', 'cssmin', 'jshint:beforeuglify', 'uglify', 'jshint:afteruglify', 'clean:cleantemp', 'copy', 'watch']);
    };

    *这是我目前比较常用的基本包,包含了文件清理、less 编译、css 压缩、 js语法检查(分压缩前和压缩后)、压缩、html 以及其他资源文件的复制、文件变动的检测。每次运行 Grunt 命令之后,即可专注于前端的工作,不必再去考虑 js 语法、css 格式等问题,复制文件路径等。如果语法错误,命令行中会有醒目的提示;如果无误,修改后即可在浏览器中直接查看。

    so easy!!!

    所有的组件及使用方法,均可在官方插件库(https://gruntjs.com/plugins)找到,这里也不再赘述谁都在讲的内容了。

    对于工具的态度,我一直是点到即止,不求甚解,使用时先让它动起来,遇到问题,需要研究再认真钻研。

  • 相关阅读:
    python sort dict 总结
    深度学习网络压缩模型方法总结(model compression)
    串口通讯(中)——USART
    串口通讯(上)——基础概念
    关于通讯的一点常识
    SysTick定时器的一个简单应用
    RCC时钟配置实践
    GPIO输入——按键检测
    stm32中断初识与实践(下)
    stm32中断初识与实践(上)
  • 原文地址:https://www.cnblogs.com/bashenandi/p/grunt-project.html
Copyright © 2011-2022 走看看