如何使用 Grunt.js (0.3.x) 连接和缩小多个 CSS 和 JavaScript 文件

IT技术 javascript css concatenation minify gruntjs
2021-03-10 22:54:05

注意:此问题仅与 Grunt 0.3.x 相关,已留作参考。有关最新 Grunt 1.x 版本的帮助,请参阅我在此问题下方的评论。

我目前正在尝试使用 Grunt.js 来设置一个自动构建过程,用于首先连接然后缩小 CSS 和 JavaScript 文件。

我已经能够成功地连接和缩小我的 JavaScript 文件,尽管每次运行 grunt 时它似乎只是附加到文件而不是覆盖它们。

至于缩小甚至连接 CSS,到目前为止我还无法做到这一点!

就 grunt CSS module而言,我尝试使用consolidate-css, grunt-css&cssmin但无济于事。无法理解如何使用它们!

我的目录结构如下(是一个典型的 node.js 应用程序):

  • 应用程序.js
  • grunt.js
  • /public/index.html
  • /public/css/[各种css文件]
  • /public/js/[各种javascript文件]

这是我的 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)。请参阅我的开源项目Grunt.js Skeleton以获取有关为Grunt 1.x.

Grunt 0.4.xGrunt 1.x 不应该引入许多重大变化

5个回答

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任务

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'
  }
},

内置的min任务使用 UglifyJS,因此您需要替换。我发现grunt-css非常好。安装后,将其加载到您的 grunt 文件中

grunt.loadNpmTasks('grunt-css');

然后设置一下

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

请注意,用法类似于内置的 min。

将您的default任务更改

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

现在,运行grunt将产生您想要的结果。

dest
├── css
│   ├── concat.css
│   └── concat.min.css
└── js
    ├── concat.js
    └── concat.min.js
@TárcioZemel 您可以在文件名中包含 package.json 的版本: concat.min-<%= pkg.version %>.js
2021-04-18 22:54:05
你是个天才!我从来没有想过,如果我把包含concat在同一个js文件夹中,它会把它挖出来并附加它!我已经开始使用 cssmin 并且效果很好!再次感谢。
2021-04-28 22:54:05
很棒,真的很棒!但文件名总是concat.min.cssconcat.min.js. 如果我修改某些内容,重新运行和部署,人们将不会获得最新版本,因为浏览器已经缓存了它。有什么方法可以随机命名文件并根据正确的<link><script>标签链接它们
2021-05-06 22:54:05
您可以使用.dest这样cssmin: { css:{ src: '<%= concat.css.dest %>', dest: './css/all.min.css'}}`这是操作的结果concat -> css
2021-05-10 22:54:05

我想在这里提到一个非常非常有趣的技术,它被用于像 jQuery 和 Modernizr 这样的大型项目来连接事物。

这两个项目完全是用 requirejs module开发的(你可以在他们的 github 仓库中看到),然后他们使用 requirejs 优化器作为一个非常智能的连接器。有趣的是,正如你所看到的,无论是 jQuery 还是 Modernizr 都不需要 requirejs 才能工作,这是因为它们删除了 requirejs 的语法规则,以便在他们的代码中去掉 requirejs。所以他们最终得到了一个用 requirejs module开发的独立库!多亏了这一点,他们能够执行库的 cutom 构建,以及其他优势。

对于所有对与 requirejs 优化器连接感兴趣的人,请查看这篇文章

还有一个小工具可以抽象出流程的所有样板:AlbanilJS

使用 grunt 的 concat 或 uglify,使用配置的指定源文件的顺序组合生成的文件。而 RequireJS 是基于依赖的。不同的方法却可以达到相同的结果。
2021-04-21 22:54:05
这很有趣但与问题无关,因为 RequireJS 是一个module加载器,它不会连接或缩小 AFAIK
2021-05-03 22:54:05
谢谢!你是对的,RequireJS 是一个module加载器,它不会连接也不会缩小。但是 r.js(RequireJS 优化器 --> requirejs.org/docs/optimization.html)做到了。更具体地说,它连接您的module,按依赖项对它们进行排序。Modernizr 和 jQuery 的人利用了该工具的排序算法,并将其专门用作智能连接器。您可以检查他们的回购以了解他们在做什么。
2021-05-07 22:54:05

我同意上面的回答。但这是另一种 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;
    });
  });
}; 
为什么要在构建过程中执行所有这些复杂操作并调用 jvm?只是无缘无故地放慢了速度。
2021-04-17 22:54:05
如果您使用的是“grunt-css”,则必须需要 Locale Npm module,因此请确保在安装“grunt-css”时必须在 Locale Npm module中。
2021-05-15 22:54:05

你不需要添加 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']
        }
      }
    }

我认为可能更自动化,grunt 任务 usemin 会为您完成所有这些工作,只需要一些配置:

https://stackoverflow.com/a/33481683/1897196