【问题标题】:Rails minify/optimize files on the fly using Grunt or GulpRails 使用 Grunt 或 Gulp 即时压缩/优化文件
【发布时间】:2015-05-18 03:43:22
【问题描述】:

我的 Rails 4 应用程序允许其用户导入一些 Adob​​e Edge 动画文件(广告)。虽然它工作正常,但 Adob​​e Edge 正在加载一堆文件,这些文件可以使用 Grunt 或 Gulp 等工具进行缩小和优化(图像)。

我正在使用 CarrierWave 上传文件,然后如果它们在存档中,我会提取它们:

class FileUploader < CarrierWave::Uploader::Base
  after :store, :uncompress_and_update_reference

  def uncompress_and_update_reference(_file)
    return unless archive_is_supported?(model.ext)
    extractor = Uploader::Archive.const_get("Extractor#{model.ext.upcase}").new
    Uploader::Archive::PubArchive.new(extractor, model, full_path).extract_and_save
  end
end

我在想我可以在后台作业中使用 Grunt 或 Gulp(例如使用 Sidekiq)来根据需要处理那些提取的文件。问题是我该怎么做?

根据我的阅读,为了运行gruntgulp,它们都需要分别拥有Gruntfile.jsGulpfile.js,这使得事情变得很棘手,因为我需要在解压文件夹。

有人吗?

【问题讨论】:

  • 您可以通过process.argv 轻松地将命令行参数传递给 Grunt 和 Gulp。
  • 好的,谢谢,不知道。由于 Grunt / Gulp 需要一个配置文件才能运行,我如何运行命令 gruntgulp 并使用通用外部文件?他们的 API 似乎没有显示如何实现它,因为它假定配置文件始终在当前文件夹中。
  • 可以像htmlcompressor 这样的宝石有帮助吗? github.com/paolochiodi/htmlcompressor
  • @kobaltz。我已经检查了那个 gem,但不幸的是,我的案例需要很多自定义处理,只有 Grunt 或 Gulp 等工具才能实现。我开始构建一个节点 CLI 来实现这一点。这是迄今为止我发现的最简单的解决方案。一旦我有什么有用的东西就会在这里写一篇文章

标签: ruby-on-rails gruntjs gulp sidekiq


【解决方案1】:

好的,我终于创建了一个 Node CLI 来处理这种情况。由于我需要能够动态优化文件夹内的文件,因此拥有命令行实用程序是最好的方案:

cli.js

#!/usr/bin/env node

'use strict';

var meow      = require('meow');
var fs        = require('fs');
var optimizer = require('./');

var cli = meow({
  help: [
    'Usage : pub-optimizer <path_to_optimize> <path_to_optimize>',
    ''
  ].join('\n')
});

var paths = cli.input

paths.forEach(function (path) {
  if (fs.existsSync(path) {
    optimizer.minify(path);
  } else {
    console.log(path + ' is not a valid directory.')
  }
});

index.js

'use strict';

var gulp     = require('gulp');
var imagemin = require('gulp-imagemin');
var pngquant = require('imagemin-pngquant');

exports.minify = function (folderPath) {

  // Remove trailing slash
  folderPath = folderPath.replace(/\/+$/, "");

  // Optimize images
  gulp.task('default', function () {
    return gulp
      .src(folderPath + '/**/*.{png,jpg,jpeg,gif,webp,svg}')
      .pipe(imagemin({
        progressive: true,
        use: [pngquant()]
      }))
      .pipe(gulp.dest(folderPath));
  });

  gulp.start();
};

然后我需要做的就是从我的 Rails 应用程序调用该 CLI:

uploaders/file_uploader.rb

class FileUploader < CarrierWave::Uploader::Base
  after :store, :uncompress_and_update_reference

  def uncompress_and_update_reference(_file)
    return unless archive_is_supported?(model.ext)
    extractor = Uploader::Archive.const_get("Extractor#{model.ext.upcase}").new
    Uploader::Archive::PubArchive.new(extractor, model, full_path).extract_and_save

    PubOptimizerWorker.perform_async(fullpath)
  end
end

workers/pub_optimizer_worker.rb

class PubApprovalRequestWorker
  include Sidekiq::Worker
  sidekiq_options queue: :pub

  def perform(path)
    system("pub-optimizer #{path}")
  end
end

希望这可能会对某人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多