gpt4 book ai didi

npm-scripts - 是否可以使用imagemin-cli并保持相同的压缩文件文件夹结构?

转载 作者:行者123 更新时间:2023-12-03 13:51:57 26 4
gpt4 key购买 nike

我正在尝试使用npm脚本创建imagemin脚本,并为其使用imagemin-cli。首先,我将文件复制到dist(或用于开发的.tmp)文件夹,然后使用以下脚本压缩图像:

package.json

...
scripts {
"copy:dev": "cpx app/src/**/*.{html,png,jpg,mp4,webm} .tmp/",
"copy:prod": "cpx app/src/**/*.{html,png,jpg,mp4,webm} dist/",
"imagemin:dev": "imagemin app/src/images/**/* -o .tmp/images/",
"imagemin:prod": "imagemin app/src/images/**/* -o dist/images/",
...
},

因此,当我运行这些脚本时,压缩后,所有图像都放在 images/文件夹中。

有没有一种压缩图像并保持文件夹结构的方法?也许与另一个插件或其他。

最佳答案

Is it a way to compress images with keeping folder structure?


简短的回答是“否”,而不是imagemin-cli
imagemin(API imagemin-cli建立在其基础上)没有提供保留文件夹结构的机制。参见项目github repo中的open issue/feature-request #191

解决方案
满足您需求的跨平台方法是编写一个直接使用 imagemin API的自定义node.js实用程序脚本。如此有效地...建立您自己的CLI工具,可以通过 npm-scripts运行。
以下要点展示了如何实现这一目标...

imagemin.js
实用程序节点脚本如下:
#!/usr/bin/env node

'use strict';

var path = require('path');
var readline = require('readline');
var Imagemin = require('imagemin');

var outdir = process.env.PWD; // Default output folder.
var verbose = false; // Default no logging.

// The folder name specified MUST exist in the `glob` pattern of the npm-script.
var DEST_SUBROOT_FOLDER = 'images';

// Nice ticks for logging aren't supported via cmd.exe
var ticksymbol = process.env.npm_config_shell.indexOf('bash') !== -1 ? '✔' : '√';

var rl = readline.createInterface({
input: process.stdin,
output: null,
terminal: false
});

// Handle the optional `-o` argument for the destination folder.
if (process.argv.indexOf('-o') !== -1) {
outdir = process.argv[process.argv.indexOf('-o') + 1];
}

// Handle the optional `-v` argument for verbose logging.
if (process.argv.indexOf('-v') !== -1) {
verbose = true;
}

/**
* Utilizes the Imagemin API to create a new instance for optimizing each image.
* @param {String} srcpath - The filepath of the source image to optimize.
* @param {String} destpath - The destination path to save the resultant file.
* @param {Function} - The relevent `use` plugin (jpegtran|optipng|gifsicle).
*/
function imagemin(srcpath, destpath, plugin) {
var im = new Imagemin()
.src(srcpath)
.dest(destpath)
.use(plugin);

im.optimize(function (err, file) {
if (err) {
console.error('Error: ' + err);
process.exit(1);
}
if (file && verbose) {
console.log('\x1b[32m%s\x1b[0m', ticksymbol, destpath);
}
});
}

/**
* Obtains the destination path and file suffix from the original source path.
* @param {String} srcpath - The filepath for the image to optimize.
* @return {{dest: String, type: String}} dest path and ext (.jpg|.png|.gif).
*/
function getPathInfo(srcpath) {
var ext = path.extname(srcpath),
parts = srcpath.split(path.sep),
subpath = parts.slice(parts.indexOf(DEST_SUBROOT_FOLDER), parts.length);

subpath.unshift(outdir);

return {
dest: path.normalize(subpath.join(path.sep)),
ext: ext
};
}

/**
* Triggers the relevent imagemin process according to file suffix (jpg|png|gif).
* @param {String} srcpath - The filepath of the image to optimize.
*/
function optimizeImage(srcpath) {
var p = getPathInfo(srcpath);

switch (p.ext) {
case '.jpg':
imagemin(srcpath, p.dest, Imagemin.jpegtran({ progressive: true }));
break;
case '.png':
imagemin(srcpath, p.dest, Imagemin.optipng({ optimizationLevel: 5 }));
break;
case '.gif':
imagemin(srcpath, p.dest, Imagemin.gifsicle({ interlaced: true }));
break;
}
}

// Read each line from process.stdin (i.e. the filepath)
rl.on('line', function(srcpath) {
optimizeImage(srcpath);
});
注意:上面的代码使用 1.0.5 API的 imagemin版本而不是最新版本-为什么?请参阅下面“附加说明”部分下的第1点。)

卸载并安装新软件包
  • 由于不再需要imagemin-cli,请先将其卸载:
  • $ npm un -D imagemin-cli
  • 下一步安装imagemin版本 1.0.5 (这是一个较旧的软件包,因此安装npm所需的时间可能比平时更长)
  • $ npm i -D imagemin@1.0.5
  • 然后安装cli-glob。这将用于指定球形图案以匹配图像以进行优化。
  • $ npm i -D cli-glob
    npm-scripts
    如下更新您的 npm-scripts:
    ...
    "scripts": {
    "imagemin:prod": "glob \"app/src/images/**/*.{png,jpg,gif}\" | node bin/imagemin -v -o dist",
    "imagemin:dev": "glob \"app/src/images/**/*.{png,jpg,gif}\" | node bin/imagemin -v -o .tmp",
    ...
    },
    ...
    注:要使用上面显示的要点来优化图像,则不必使用原始帖子/问题中显示的两个名为 copy:prodcopy:dev的脚本)
  • 上面脚本的glob \"app/src/...部分使用cli-glob匹配必要的图像源文件。
  • 然后将路径通过管道传递到imagemin.js实用程序节点脚本。
  • 当包含-v(详细)参数/标志时,每个已处理的图像都将记录到控制台。要省略日志记录,只需删除-v标志。
  • -o(输出)参数/标志用于指定目标文件夹名称。例如。 dist.tmp。当省略-o的值时,结果图像将输出到项目根目录。

  • 附加说明:
  • 使用imagemin版本1.0.5的原因是因为此API
    允许将src值指定为单个文件路径。在大于2.0.0的版本中,API期望src值是glob模式,如最新版本5.2.2中所示。
  • 上面的要点假设imagemin.js已保存到名为bin的文件夹中,该文件夹与package.json存在于同一文件夹中。可以通过在其前面加上点号[。]来将其更改为首选名称或不可见的文件夹。 .scripts.bin。无论您选择什么,都需要相应地更新npm-scripts中脚本的路径。
  • 关于npm-scripts - 是否可以使用imagemin-cli并保持相同的压缩文件文件夹结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42526941/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com