Rails minify/optimize 使用 Grunt 或 Gulp 即时处理文件

Rails minify/optimize files on the fly using Grunt or Gulp

我的 Rails 4 应用程序允许它的用户导入一些 Adob​​e Edge 动画文件(广告)。虽然它有效,但 Adob​​e Edge 正在加载一堆文件,这些文件可以使用 G运行t 或 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

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

根据我的阅读,为了 运行 gruntgulp,它们都需要分别具有 Gruntfile.jsGulpfile.js ,这让事情变得棘手,因为我需要 运行 在提取的文件夹中动态地处理它。

有人吗?

好的,我终于创建了一个 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

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