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-csscssmin하지만 아무 소용. 그것들을 사용하는 방법에 대해 내 머리를 이해할 수 없었습니다!

내 디렉토리 구조는 다음과 같습니다 (일반적인 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.jsconcat.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.cssconcat.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.