Rails minify/optimize 使用 Grunt 或 Gulp 即时处理文件
Rails minify/optimize files on the fly using Grunt or Gulp
我的 Rails 4 应用程序允许它的用户导入一些 Adobe Edge 动画文件(广告)。虽然它有效,但 Adobe 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 来根据需要处理那些提取的文件。问题是我该怎么做?
根据我的阅读,为了 运行 grunt
或 gulp
,它们都需要分别具有 Gruntfile.js
和 Gulpfile.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
希望这可能会对某人有所帮助。
我的 Rails 4 应用程序允许它的用户导入一些 Adobe Edge 动画文件(广告)。虽然它有效,但 Adobe 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 来根据需要处理那些提取的文件。问题是我该怎么做?
根据我的阅读,为了 运行 grunt
或 gulp
,它们都需要分别具有 Gruntfile.js
和 Gulpfile.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
希望这可能会对某人有所帮助。