Grunt.js (0.3.x)로 여러 CSS 및 JavaScript 파일을 연결하고 축소하는 방법


99

참고 :이 질문은 Grunt 0.3.x에만 해당되며 참조 용으로 남겨졌습니다. 최신 Grunt 1.x 릴리스에 대한 도움말은이 질문 아래의 내 의견을 참조하십시오.

현재 Grunt.js를 사용하여 CSS 및 JavaScript 파일을 먼저 연결 한 다음 축소하기위한 자동 빌드 프로세스를 설정하려고합니다.

내가 grunt를 실행할 때마다 파일을 덮어 쓰는 대신 파일에 추가하는 것처럼 보이지만 JavaScript 파일을 성공적으로 연결하고 축소 할 수있었습니다.

축소 또는 연결 CSS에 관해서는 아직이 작업을 수행 할 수 없었습니다!

툴툴 거리는 소리 CSS 모듈의 측면에서 내가 사용하는 시도 consolidate-css, grunt-css및 cssmin하지만 아무 소용. 그것들을 사용하는 방법에 대해 내 머리를 이해할 수 없었습니다!

내 디렉토리 구조는 다음과 같습니다 (일반적인 node.js 응용 프로그램).

  • app.js
  • grunt.js
  • /public/index.html
  • / public / css / [다양한 CSS 파일]
  • / public / js / [다양한 자바 스크립트 파일]

내 응용 프로그램의 루트 폴더에있는 내 grunt.js 파일은 다음과 같습니다.

module.exports = function(grunt) {

  // Project configuration.
  grunt.initConfig({
    pkg: '<json:package.json>',
    concat: {
      dist: {
        src: 'public/js/*.js',
        dest: 'public/js/concat.js'
      }
    },
    min: {
      dist: {
        src: 'public/js/concat.js',
        dest: 'public/js/concat.min.js'
      }
    },
    jshint: {
      options: {
        curly: true,
        eqeqeq: true,
        immed: true,
        latedef: true,
        newcap: true,
        noarg: true,
        sub: true,
        undef: true,
        boss: true,
        eqnull: true,
        node: true
      },
      globals: {
        exports: true,
        module: false
      }
    },
    uglify: {}
  });

  // Default task.
  grunt.registerTask('default', 'concat min');

};

요약하자면 두 가지 질문에 대한 도움이 필요합니다.

  1. 폴더 아래의 모든 CSS 파일 /public/css/을 하나의 파일 로 연결하고 축소하는 방법main.min.css
  2. grunt.js 가 명령 이 실행될 때마다 덮어 쓰는 대신 연결되고 축소 된 javascript 파일 concat.js과 concat.min.js아래 에 계속 추가하는 이유는 무엇 입니까?/public/js/grunt

2016 년 7 월 5 일 업데이트 됨-Grunt 0.3.x에서 Grunt 0.4.x 또는 1.x로 업그레이드

Grunt.js의 새 구조로 이동했습니다 Grunt 0.4.x(이제 파일 이름은 Gruntfile.js). .NET 용 빌드 프로세스 설정에 대한 도움말 은 내 오픈 소스 프로젝트 Grunt.js Skeleton 을 참조하세요 Grunt 1.x.

에서 Grunt 0.4.x로 이동하는 Grunt 1.x 것은 많은 주요 변경 사항을 도입해서는 안됩니다 .

답변:


107

concat.js는 concat작업의 소스 파일 에 포함됩니다 public/js/*.js. concat.js다시 연결하기 전에 제거하는 작업 (파일이있는 경우) 을 가질 수 있으며, 배열을 전달하여 연결하려는 파일과 순서를 명시 적으로 정의하거나 프로젝트의 구조를 변경할 수 있습니다.

후자를 수행하는 경우 모든 소스를 아래 ./src에 놓고 빌드 파일을./dest

src
├── css
│   ├── 1.css
│   ├── 2.css
│   └── 3.css
└── js
    ├── 1.js
    ├── 2.js
    └── 3.js

그런 다음 연결 작업을 설정하십시오.

concat: {
  js: {
    src: 'src/js/*.js',
    dest: 'dest/js/concat.js'
  },
  css: {
    src: 'src/css/*.css',
    dest: 'dest/css/concat.css'
  }
},

귀하의 분 작업

min: {
  js: {
    src: 'dest/js/concat.js',
    dest: 'dest/js/concat.min.js'
  }
},

기본 제공 최소 작업은 UglifyJS를 사용하므로 교체가 필요합니다. grunt-css 가 꽤 좋다는 것을 알았습니다 . 설치 후 grunt 파일에로드하십시오.

grunt.loadNpmTasks('grunt-css');

그런 다음 설정

cssmin: {
  css:{
    src: 'dest/css/concat.css',
    dest: 'dest/css/concat.min.css'
  }
}

사용법은 기본 제공 최소값과 유사합니다.

default작업을 다음으로 변경하십시오.

grunt.registerTask('default', 'concat min cssmin');

이제 실행 grunt하면 원하는 결과가 생성됩니다.

dest
├── css
│   ├── concat.css
│   └── concat.min.css
└── js
    ├── concat.js
    └── concat.min.js

1
너는 천재 야! 물론 내가 concat같은 js폴더에 포함하면 그것을 퍼서 추가 할 것이라는 생각은 전혀 생각하지 못했습니다 ! 나는 cssmin을 사용하기 시작했고 훌륭하게 작동합니다! 다시 한 번 감사드립니다.
— Jasdeep Khalsa

1
정말 좋아요! 그러나 파일 이름은 항상 concat.min.css및 concat.min.js. 내가 무언가를 수정하고 다시 실행하고 배포하면 브라우저가 이미 캐시했기 때문에 사람들이 최신 버전을 얻지 못할 것입니다. 파일 이름을 임의로 지정하고 적절한 태그 <link>와 <script>태그 에 따라 링크하는 방법이 있습니까?
— Tárcio Zemel 2013-06-15

3
: TárcioZemel @ 당신은 파일 이름에 package.json의 버전을 포함 할 수 있습니다concat.min-<%= pkg.version %>.js
— 루이 Nunes 보낸

1
당신은 사용할 수 있습니다 .dest같이 cssmin: { css:{ src: '<%= concat.css.dest %>', dest: './css/all.min.css'그것은 작업의 결과입니다`}}concat -> css
— 이반 블랙

12

여기서는 jQuery 및 Modernizr와 같은 거대한 프로젝트에서 연결 작업에 사용되는 매우 매우 흥미로운 기술을 언급하고 싶습니다.

이 두 프로젝트는 모두 requirejs 모듈 (github 저장소에서 확인할 수 있음)으로 완전히 개발 된 다음 requirejs 최적화 프로그램을 매우 스마트 한 연결 자로 사용합니다. 흥미로운 점은 보시다시피, Modernizr가 작동하는 데 requirejs를 필요로하지 않는 jQuery도, 코드에서 requirejs를 제거하기 위해 requirejs 구문 의식을 지워서 발생한다는 것입니다. 그래서 그들은 requirejs 모듈로 개발 된 독립형 라이브러리로 끝납니다! 이 덕분에 다른 장점 중에서도 라이브러리의 컷섬 빌드를 수행 할 수 있습니다.

requirejs 최적화 프로그램과의 연결에 관심이있는 모든 사람들은 이 게시물을 확인하십시오.

또한 프로세스의 모든 상용구를 추상화하는 작은 도구가 있습니다. AlbanilJS


RequireJS는 모듈 로더이기 때문에 이것은하지 CONCATENATE 또는 작게하다 AFAIK 않는, 매우 흥미로운하지만, 질문에 관련이 없습니다
— Jasdeep Khalsa

감사! 당신 말이 맞습니다. RequireJS는 모듈 로더이며 연결하거나 축소하지 않습니다. 그러나 r.js (RequireJS 옵티 마이저-> requirejs.org/docs/optimization.html ) 가이를 수행합니다. 더 구체적으로 말하자면, 의존성에 따라 모듈을 순서대로 연결합니다. Modernizr 및 jQuery의 사람들은 도구의 순서 지정 알고리즘을 활용하여 특히 스마트 연결 자로 사용했습니다. 리포지토리를 확인하여 그들이 무엇을하는지 확인할 수 있습니다.
— Augusto Altman Quaranta

grunt의 concat 또는 uglify를 사용하면 구성된 지정된 소스 파일의 순서를 사용하여 결과 파일이 구성됩니다. RequireJS는 종속성을 기반으로합니다. 접근 방식이 다르지만 동일한 결과를 얻을 수 있습니다.
— priyabagus

10

위의 답변에 동의합니다. 그러나 여기에 또 다른 CSS 압축 방법이 있습니다.

YUI 압축기 를 사용하여 CSS를 연결할 수 있습니다 .

module.exports = function(grunt) {
  var exec = require('child_process').exec;
   grunt.registerTask('cssmin', function() {
    var cmd = 'java -jar -Xss2048k '
      + __dirname + '/../yuicompressor-2.4.7.jar --type css '
      + grunt.template.process('/css/style.css') + ' -o '
      + grunt.template.process('/css/style.min.css')
    exec(cmd, function(err, stdout, stderr) {
      if(err) throw err;
    });
  });
}; 

'grunt-css'를 사용하는 경우에는 Locale Npm 모듈이 필요하므로 'grunt-css'를 설치할 때 Locale Npm 모듈에 있어야합니다.
— Anshul

7
이 모든 복잡성을 수행하고 빌드 프로세스에서 jvm을 호출하려는 이유는 무엇입니까? 이유없이 모든 것을 느리게 만듭니다.
— michael salmon

3

concat 패키지를 추가 할 필요가 없습니다. 다음과 같이 cssmin을 통해이 작업을 수행 할 수 있습니다.

cssmin : {
      options: {
            keepSpecialComments: 0
      },
      minify : {
            expand : true,
            cwd : '/library/css',
            src : ['*.css', '!*.min.css'],
            dest : '/library/css',
            ext : '.min.css'
      },
      combine : {
        files: {
            '/library/css/app.combined.min.css': ['/library/css/main.min.css', '/library/css/font-awesome.min.css']
        }
      }
    }

그리고 js의 경우 다음과 같이 uglify를 사용하십시오.

uglify: {
      my_target: {
        files: {
            '/library/js/app.combined.min.js' : ['/app.js', '/controllers/*.js']
        }
      }
    }

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.