본문으로 건너뛰기

Grunt 튜토리얼

무료2015-05-22#Tool#grunt#grunt教程#grunt指南

쓸데없는 말이 적은 Grunt 튜토리얼, 분량은 길지 않고, 간단명료함

앞에 쓰는 말

특히 주의:만약 이 글이 충분히 상세하지 않다고 느껴진다면, 강력히 Grunt 영문 공식 사이트 의 튜토리얼을 보기를 권장합니다. 中文版 는 주석을 부분적으로 번역했는데, 번역하지 않는 것이 낫습니다 (번역에 오해되기 쉽습니다)

  1. Grunt 란 무엇인가?

Grunt 는 자동 구축 도구로, 유사한 것으로 Ant, Buildy, Gmake 등이 있습니다. 더 많은 정보는 [黯羽轻扬:JS 자동화](/articles/js 자동화/) 를 참조하십시오

  1. Grunt 의 용도는?

자동 구축 도구는 자동화 도구를 통합하여, 태스크 형식으로 관리할 수 있습니다. 따라서 Grunt 공식 사이트의 서브타이틀은 The JavaScript Task Runner 입니다.

간단히 설명하면, 프로젝트 구축 -> 모듈화 개발 -> 재사용 -> 테스트 -> 디버그 -> 검증 -> 릴리스 -> 버전 관리, 이 전체 플로우에서 많은 자동화 도구가 필요합니다. 예를 들어 Require, QUnit, JSHint, Uglify 등입니다. 거의 매번 소스코드를 수정할 때마다 특정 순서로 몇 가지 도구를 수동으로 다시 실행해야 합니다。。。

Grunt 와 같은 자동 구축 도구가 있으면 다시 실행하는 조작을 간소화할 수 있습니다. 설정 파일을 작성한 후, 커맨드라인에서 커스텀 태스크를 실행하기만 하면 됩니다. 심지어 grunt-contrib-watch 플러그인과 연동하여 파일 수정을 감시하고, 자동으로 태스크를 실행할 수도 있습니다

  1. Grunt 의 좋은 점은?
  • 인기:Twitter, JQuery, Adobe, Mozilla 등이 Grunt 를 사용

  • 플러그인이 많음:현재 (2015.5.22) 이미 4560 개의 Grunt 플러그인이 있습니다.常用的인 JSHint, Require, Sass 등을 포함하여, 충분히 사용할 수 있습니다.实在안 되면 직접 플러그인을 작성할 수도 있습니다

  • 사용하기 쉬움:설정 파일이 비교적 간단하고, 플러그인 문서가 충실함 (npm 공식 사이트가 통일 관리를 제공)

一.grunt 설치

  1. NodeJS 설치

Windows 는 직접http://nodejs.org/에서 설치 패키지를 다운로드하면 됩니다. npm 포함

其它 플랫폼의 설치 튜토리얼

설치 후, 커맨드라인에서 node -v 를 입력하여 테스트합니다

  1. npm 설치

커맨드라인에서 npm -v 를 입력하여 테스트합니다. 오류가 발생하면, 스스로 npm 을 설치하는 방법을 생각합니다

  1. Grunt-CLI(커맨드라인 도구 Command Line Interface) 설치

커맨드라인에서 npm install -g grunt-cli 를 입력하고, 설치 완료를 기다립니다

二.설정 파일

2 개의 설정 파일이 필요합니다:

  • package.json:Nodejs 패키지 관리용. 프로젝트 의존 모듈 (grunt 및 grunt 플러그인) 을 선언

  • Gruntfile.js:Grunt 설정 파일. 태스크를 정의. Gruntfile.js 또는 Gruntfile.coffee 로 명명 가능

주의:package.json 과 Gruntfile.js 는 모두 프로젝트의 루트 디렉토리에 배치하고, 프로젝트의 소스코드와 함께 제출합니다

단적으로 말하면, Grunt 를 배우는 것은 설정 파일 작성법을 배우는 것입니다

三.package.json

일반 형식은 다음과 같습니다:

{
    "name": "프로젝트명",
    "version": "프로젝트 버전 번호",
    "description": "프로젝트 설명",
    "author": "프로젝트 작성자",
    "license": "프로젝트 저작권",
    "devDependencies": {
        //프로젝트 의존 플러그인
    }
}

예를 들어 작은 프로젝트의 package.json:

{
  "name": "world",
  "version": "0.4.0",
  "devDependencies": {
    "grunt": "~0.4.2",
    "grunt-contrib-concat": "~0.3.0",
    "grunt-contrib-jshint": "~0.6.3",
    "grunt-contrib-uglify": "~0.2.2",
    "grunt-contrib-watch": "^0.6.1"
  }
}

package.json 을 작성한 후, 커맨드라인에서 cd 로 들어가고, npm install 을 실행하여,刚才 선언한 각 의존 항목을 다운로드합니다. 현재 디렉토리 하의 node_modules 폴더에 배치됩니다

의존 항목을 추가할 필요가 있을 때는 직접 npm install grunt-contrib-XXX --save-dev 를 실행하면 되며, package.json 의 내용을 자동으로 업데이트할 수 있습니다

주의

  1. 주석은 불가.否则 npm install 해석 실패 (어떠한 형식의 주석でも, 파일의 선두미미 부분でも其它でも。。모두 불가)

  2. version 은 반드시 X.X.X 형식.X.X 는 오류

実は version 의 포맷에는 복잡한 표준이 있습니다.http://semver.org/를 참조하십시오

  1. 커맨드라인에서 npm install grunt-contrib-XXX --save-dev 와 같은 커맨드를 입력하면, package.json 을 자동으로 업데이트할 수 있습니다

마지막 의존 모듈 grunt-contrib-watch 는 이ように 추가했습��다

  1. 버전 번호 앞의~와^는 무슨 뜻인가?

이를 설명하는 자료를 보지 못했지만, 추측할 수 있습니다:^는 최신 버전을 찾는 것을 나타내고, 는 지정 버전을 나타냅니다 (git 의 HEAD^ 와 HEADn 과 같을지도 모릅니다。。물론, 추측에 불과합니다)

일반적으로~를 사용하여 구체적인 버전을 지정합니다. 플러그인의 호환성 및 안정성 문제가 존재할 수 있기 때문입니다

P.S.만약 신뢰할 수 있는 설명을 알고 있다면알려주세요. 감사합니다

  1. package.json 을 자동으로 생성

커맨드라인에서 npm init 을 입력하고, 커맨드라인의提示에 따라 한 걸음 한 걸음 완료합니다. 실측에서는 사용하기 어렵습니다. 손으로 작성하는 것을 권장합니다. 또는常用的인 템플릿을 작성하여, 강제로 재사용합니다

三.Gruntfile.js

일반 형식은 다음과 같습니다:

module.exports = function(grunt){
    // 1.  태스크를 정의
    grunt.initConfig({
        // 1.  package.json 을 읽기
        pkg: grunt.file.readJSON('package.json'),

        // 2.  각 태스크의 설정 오브젝트를 초기화
        task1: {
            options: {
                // 설정 옵션을 설정
            },
            
            build: {
                // 입출력 경로 등을 설정
            }
        },
        task2: {
            // ...
        }
    });

    // 2.  플러그인을 로드
    grunt.loadNpmTasks('Grunt 플러그인명');

    // 3.  태스크를 등록
    grunt.registerTask('default',['Grunt 태스크']);
    grunt.registerTask('mytask',['task1', 'task3']);
};

예를 들어 작은 프로젝트의 package.json:

module.exports = function(grunt) {
    
    // 1.  태스크를 정의
    grunt.initConfig({
        // 1.  package.json 을 읽기
        pkg: grunt.file.readJSON("package.json"),
        
        // 2.  각 태스크의 설정 오브젝트를 초기화
        // 파일을 결합
        concat: {
            options: {
                // 결합 오류를 방지 (이전 파일의 미비에 세미콜론이 적음)
                separator: ";",
                //顶部 정보 (주석 포맷을自带할 필요가 있으며, 자동으로 주석하지 않고, 자동으로 개행하지도 않음)
                banner: "/*<%= pkg.name %>_<%= pkg.version %> " +
                        // *주의*:yyyy-mm-dd 는 인용부호를 추가하고, 문자열 파라미터를 나타냄
                        "<%= grunt.template.today('yyyy-mm-dd') %>*/\r\n\r\n",
                //底部 정보
                footer: "\r\n\r\n/* author: http://ayqy.net/ */"
            },
            
            build: {
                src: ["src/w.js", "src/Const.js", "src/Item.js", "src/Map.js", "src/Util.js", "src/Core.js"],
                dest: "build/<%= pkg.name %>.js"
            }
        },
        // 코드 검사
        jshint: {
            options: {
                eqeqeq: true,   // ===를 요구
                trailing: true, // 미비에 공백이 없는 것을 요구
                //unused: true,   // 사용되지 않은 변수를 경고하는 것을 요구 (모듈화 코드는 오류가 됨)
                forin: true,    // for-in 은 반드시 hasOwnProp 으로 필터할 것을 요구
                curly: true     // 중괄호를 요구
            },
            
            files: ["Gruntfile.js", "src/*.js"]
        },
        // 코드를瘦身
        uglify: {
            options: {
                // 변수명을混淆하지 않음
                mangle: false,
                // 압축률을 출력.선택 가능한 값은 false(정보를 출력하지 않음), gzip
                report: "min",
                //顶部 정보 (주석 포맷을自带할 필요가 있으며, 자동으로 주석하지 않고, 자동으로 개행하지도 않음)
                banner: "/*<%= pkg.name %>_<%= pkg.version %> " +
                        "<%= grunt.template.today('yyyy-mm-dd') %>*/\r\n\r\n",
                //底部 정보
                footer: "\r\n\r\n/* author: http://ayqy.net/ */"
            },
            
            build: {
                files: {
                    // <%= concat.dist.dest %>는 uglify 가 자동으로 concat 태스크에서 생성된 파일을瘦身하는 것을 나타냄
                    "build/<%= pkg.name %>.min.js": ["<%= concat.build.dest %>"]
                }
            }
        },
        // 파일 변동을 감시하고, 자동으로 태스크를 실행
        watch: {
            files: ["<%= jshint.files %>"],
            tasks: ["default"]
        }
    });
    
    // 2.  플러그인을 로드
    grunt.loadNpmTasks("grunt-contrib-concat");
    grunt.loadNpmTasks("grunt-contrib-jshint");
    grunt.loadNpmTasks("grunt-contrib-uglify");
    grunt.loadNpmTasks("grunt-contrib-watch");
    
    // 3.  태스크를 등록
    grunt.registerTask("default", ["jshint", "concat", "uglify"]);  // 디폴트 태스크
    grunt.registerTask("check", ["jshint"]);    // 커스텀 태스크:코드 검사
};

Gruntfile.js 를 작성한 후, num install 등의 커맨드를 실행할 필요가 없습니다. 직접 grunt TaskName 으로 대응하는 태스크를 실행하면 됩니다.예를 들어:grunt 는 default 태스크를 실행, grunt jshint 는 코드 검사를 실행, grunt mytask 는 순서대로 일련의 태스크를 실행 등입니다

여러 개의 target 이 있는 경우 grunt TaskName*:(영어 반각 콜론)*TargetName 으로 지정의 target 을 실행할 수 있습니다.태스크를 등록할 때도 TaskName:TargetName 으로 target 을 지정할 수 있습니다

P.S.target 이란 무엇인가에 대해서는, 아래를 계속 보십시오.Gruntfile.js 를 설정하는 것은 조금 번거로울지도 모르지만, 다행히 한 번만 설정하면 되며, 이후 직접 사용할 수 있습니다.某些의 상세를 아직あまり 이해하지 못할지도 모르지만, 반드시 아래의 주의 부분을看完하십시오

주의

  1. dist 와 build 는 어느 것을 사용하나?

常见的有 options-dist 와 options-build 의 2 종류로, 모두 사용 가능합니다.이름은 어떻게でも좋기 때문입니다

options 만이有所謂입니다.예를 들어 이ように할 수 있습니다:

    concat: {
        options: {
            separator: ";"
        },
        
        xx: {
            src: "src/*.js",
            dest: "<%= pkg.name %>.js"
        }
    }
    

물론 이ように도 할 수 있습니다:

    concat: {
        options: {
            separator: ";"
        },
        
        xx: {
            src: "src/*.js",
            dest: "<%= pkg.name %>.js"
        },
        
        xxx: {
            src: "src/*.js",
            dest: "<%= pkg.name %>.js"
        }
    }
    

그리고 grunt concat 을 실행하면, xx 와 xxx 를 순서��로 실행합니다.따라서 target 이 1 개만 (xx 와 xxx 는 모두 target 이라고 부름) 인 경우, build 와 dist 를 사용해도 차이는 없습니다.의미적으로 구분할 필요가 없기 때문입니다

여러 개의 target 이 있는 경우, 의미적으로 우호적인 이름을 붙이는 것이 좋습니다

P.S.개인적으로는 build 를 선호합니다.물론, 이름은 중요하지 않으므로,某些의 튜토리얼에서는 bar, foo 등도 나타나, 사람을 혼란시킵니다

  1. options 에 대해

위의 예는 grunt 가 options 만을 인정하는 것을 설명합니다 (주의:s 가 1 개 적어도 안 됩니다哟~).options 가 아닌 이름은 모두 target 으로 실행됩니다

前の 예는 모두 target 급의 options 이지만,実は task 급의 options 도 있습니다.task 하의 모든 target 에 작용할 수 있습니다.물론, 이를 몰라도 관계없습니다.코드를 조금 많이 작성할 뿐입니다

  1. 동명 태스크를 등록하면 죽再帰이 됩니다

    grunt.registerTask("concat", ["concat"]);
    
  2. 태스크에 별명을 붙일 수 있습니다

    grunt.registerTask("check", ["jshint"]);    // 커스텀 태스크:코드 검사
    
  3. 더 많은 예

더 많은 예가 필요하고 이해를 도울 필요가 있다면, 스스로 작은 프로젝트를 작성하여, 천천히 테스트하는 것을 권장합니다

实在시간이 없는 경우, 博客園:grunt 사용 소기之 uglify:最全의 uglify 사용 DEMO 를 참조하십시오

四.온라인 리소스

  1. 어느 플러그인이 니즈를 만족하고, 안정적이며, 사용하기 쉬운지 모른다

http://www.gruntjs.net/plugins

링크 페이지는 30 일 이내의 다운로드량 top100 의 플러그인을示하며, 기능簡介, 최종 업데이트 시간 등이 붙어 있습니다.클릭하면 대응하는 npm 공식 사이트 플러그인 홈페이지로 점프합니다.게다가 검색도 지원하며, 매우 편리합니다

  1. XX 플러그인에 어떠한 설정 옵션이 있는지 모른다

https://www.npmjs.com/

링크 페이지는 npm 공식 사이트로, 검색 박스에 플러그인 이름을 입력하면 됩니다.예를 들어 grunt-contrib-watch

플러그인 홈페이지는 상세한 설정 설명 및 예를 제공합니다.예를 들어 watch 의 설정 옵션:

가장 간단한 사용법:

    watch: {
        files: ['**/*'],
        tasks: ['jshint']
    }
    

또는 복잡한:

    watch: {
        sass: {
            // We watch and compile sass files as normal but don't live reload here 
            files: ['src/sass/*.sass'],
            tasks: ['sass']
        },
        livereload: {
            // Here we watch the files the sass task will compile to 
            // These files are sent to the live reload server after sass compiles to them 
            options: { livereload: true },
            files: ['dest/**/*']
        }
    }
    

3. Grunt API

http://gruntjs.com/api/grunt

링크 페이지에는 Grunt 의 모든 API 가 있습니다.예를 들어 grunt.log, grunt.initConfig 등등.새로운 것을 보면就去查吧

참고 자료

댓글

아직 댓글이 없습니다

댓글 작성