optimo

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

optimo

optimo

optimo
reduces image size with a format-specific compression pipeline.
optimo
采用针对不同格式的压缩流程来缩小图片体积。

Prerequisites

前置依赖

optimo
resolves compressors from
PATH
and throws if required binaries are missing.
Required by format:
  • all ImageMagick-backed formats:
    magick
  • SVG pipeline:
    svgo
  • JPEG second pass:
    mozjpegtran
    or
    jpegtran
  • GIF second pass:
    gifsicle
optimo
会从
PATH
中查找压缩工具,如果缺少所需的二进制文件则会抛出错误。
按格式划分的依赖要求:
  • 所有基于ImageMagick的格式:
    magick
  • SVG处理流程:
    svgo
  • JPEG二次处理:
    mozjpegtran
    jpegtran
  • GIF二次处理:
    gifsicle

Quick Start (CLI)

快速开始(CLI)

Use
npx
for one-off runs:
bash
npx -y optimo public/media
Optimize a single file:
bash
npx -y optimo public/media/banner.png
Run a dry run (no file changes):
bash
npx -y optimo public/media/banner.png --dry-run # long version
npx -y optimo public/media/banner.png -d # short version
Enable lossy mode:
bash
npx -y optimo public/media/banner.jpg --losy # long version
npx -y optimo public/media/banner.jpg -l # short version
Convert and optimize to a new format:
bash
npx -y optimo public/media/banner.png --format jpeg # long version
npx -y optimo public/media/banner.png -f jpeg # short version
Resize by percentage:
bash
npx -y optimo public/media/banner.png --resize 50% # long version
npx -y optimo public/media/banner.png -r 50% # short version
Resize to a target max file size:
bash
npx -y optimo public/media/banner.png --resize 100kB # long version
npx -y optimo public/media/banner.png -r 100kB # short version
Resize by width:
bash
npx -y optimo public/media/banner.png --resize w960 # long version
npx -y optimo public/media/banner.png -r w960 # short version
Resize by height:
bash
npx -y optimo public/media/banner.png --resize h480 # long version
npx -y optimo public/media/banner.png -r h480 # short version
Enable verbose debugging:
bash
npx -y optimo public/media/banner.heic --dry-run --verbose # long version
npx -y optimo public/media/banner.heic -d -v # short version
使用
npx
进行一次性运行:
bash
npx -y optimo public/media
优化单个文件:
bash
npx -y optimo public/media/banner.png
执行试运行(不修改文件):
bash
npx -y optimo public/media/banner.png --dry-run # 完整写法
npx -y optimo public/media/banner.png -d # 简写
启用有损模式:
bash
npx -y optimo public/media/banner.jpg --losy # 完整写法
npx -y optimo public/media/banner.jpg -l # 简写
转换并优化为新格式:
bash
npx -y optimo public/media/banner.png --format jpeg # 完整写法
npx -y optimo public/media/banner.png -f jpeg # 简写
按比例调整大小:
bash
npx -y optimo public/media/banner.png --resize 50% # 完整写法
npx -y optimo public/media/banner.png -r 50% # 简写
调整至目标最大文件体积:
bash
npx -y optimo public/media/banner.png --resize 100kB # 完整写法
npx -y optimo public/media/banner.png -r 100kB # 简写
按宽度调整大小:
bash
npx -y optimo public/media/banner.png --resize w960 # 完整写法
npx -y optimo public/media/banner.png -r w960 # 简写
按高度调整大小:
bash
npx -y optimo public/media/banner.png --resize h480 # 完整写法
npx -y optimo public/media/banner.png -r h480 # 简写
启用详细调试模式:
bash
npx -y optimo public/media/banner.heic --dry-run --verbose # 完整写法
npx -y optimo public/media/banner.heic -d -v # 简写

Pipelines

处理流程

optimo
selects a pipeline by output format:
  • .png
    ->
    magick.png
  • .svg
    ->
    svgo.svg
  • .jpg/.jpeg
    ->
    magick.jpg/jpeg
    +
    mozjpegtran.jpg/jpeg
  • .gif
    ->
    magick.gif
    +
    gifsicle.gif
  • other formats (
    webp
    ,
    avif
    ,
    heic
    ,
    heif
    ,
    jxl
    , etc.) ->
    magick.<format>
Mode behavior:
  • default: lossless-first pipeline
  • --losy
    /
    -l
    : lossy + lossless pass where supported
optimo
会根据输出格式选择对应的处理流程:
  • .png
    ->
    magick.png
  • .svg
    ->
    svgo.svg
  • .jpg/.jpeg
    ->
    magick.jpg/jpeg
    +
    mozjpegtran.jpg/jpeg
  • .gif
    ->
    magick.gif
    +
    gifsicle.gif
  • 其他格式(
    webp
    avif
    heic
    heif
    jxl
    等)->
    magick.<format>
模式行为:
  • 默认:优先无损压缩的流程
  • --losy
    /
    -l
    :在支持的格式上先执行有损压缩,再执行无损压缩

Recommended Workflow

推荐工作流

  1. Start with
    --dry-run
    to confirm target files.
  2. Run optimization on one file first, then scale to directories.
  3. Use
    --format
    only when conversion is intended.
  4. Use
    --resize
    only when explicit dimension/size control is required.
  5. Use
    --verbose
    when diagnosing unsupported files or binary/flag issues.
  6. Verify outputs in version control before committing.
  1. 先使用
    --dry-run
    确认目标文件。
  2. 先对单个文件执行优化,再扩展到目录。
  3. 仅当需要转换格式时才使用
    --format
    选项。
  4. 仅当需要精确控制尺寸或体积时才使用
    --resize
    选项。
  5. 当诊断不支持的文件或二进制文件/参数问题时,使用
    --verbose
    选项。
  6. 在提交前,通过版本控制验证输出文件。

CLI Options

CLI选项

  • -d
    ,
    --dry-run
    : Show what would change without writing files.
  • -f
    ,
    --format
    : Convert output format (
    jpeg
    ,
    webp
    ,
    avif
    , etc.).
  • -l
    ,
    --losy
    : Enable lossy + lossless pass.
  • -r
    ,
    --resize
    : Resize using percentage (
    50%
    ), max file size (
    100kB
    ), width (
    w960
    ), or height (
    h480
    ).
  • -s
    ,
    --silent
    : Suppress per-file logs.
  • -v
    ,
    --verbose
    : Print debug logs (pipeline selection, command execution, and errors).
  • -d
    --dry-run
    :显示将会发生的变更,但不写入文件。
  • -f
    --format
    :转换输出格式(
    jpeg
    webp
    avif
    等)。
  • -l
    --losy
    :启用有损+无损压缩流程。
  • -r
    --resize
    :按比例(
    50%
    )、最大文件体积(
    100kB
    )、宽度(
    w960
    )或高度(
    h480
    )调整大小。
  • -s
    --silent
    :抑制每个文件的日志输出。
  • -v
    --verbose
    :打印调试日志(流程选择、命令执行及错误信息)。

Programmatic API

程序化API

js
const optimo = require('optimo')

await optimo.file('/absolute/path/image.jpg', {
  dryRun: false,
  losy: false,
  format: 'webp',
  resize: '50%',
  onLogs: console.log
})

await optimo.file('/absolute/path/image.jpg', {
  resize: '100kB',
  onLogs: console.log
})

await optimo.file('/absolute/path/image.jpg', {
  resize: 'w960',
  onLogs: console.log
})

const result = await optimo.dir('/absolute/path/images')
console.log(result)
// { originalSize, optimizedSize, savings }
js
const optimo = require('optimo')

await optimo.file('/absolute/path/image.jpg', {
  dryRun: false,
  losy: false,
  format: 'webp',
  resize: '50%',
  onLogs: console.log
})

await optimo.file('/absolute/path/image.jpg', {
  resize: '100kB',
  onLogs: console.log
})

await optimo.file('/absolute/path/image.jpg', {
  resize: 'w960',
  onLogs: console.log
})

const result = await optimo.dir('/absolute/path/images')
console.log(result)
// { originalSize, optimizedSize, savings }

Behavior Notes

行为说明

  • For non-conversion runs, if the optimized file is not smaller, the original file is kept.
  • During conversion, output uses the new extension and the original source file is removed (unless
    --dry-run
    ).
  • Hidden files and folders (names starting with
    .
    ) are skipped in directory mode.
  • Unsupported files are reported as
    [unsupported]
    and ignored.
  • 在未转换格式的运行中,如果优化后的文件体积没有更小,则保留原文件。
  • 在转换格式时,输出文件会使用新的扩展名,原文件会被删除(除非使用
    --dry-run
    )。
  • 在目录模式下,会跳过隐藏文件和文件夹(名称以
    .
    开头的)。
  • 不支持的文件会被标记为
    [unsupported]
    并被忽略。