@zhaoshijun/compress 1.0.5 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -115,35 +115,42 @@ import { compressVitePlugin } from "@zhaoshijun/compress";
115
115
  export default defineConfig({
116
116
  plugins: [
117
117
  compressVitePlugin({
118
- // 1. 覆盖通用质量
119
- quality: 75,
120
-
121
- // 2. 覆盖 PNG 特定选项 (注意:如果覆盖对象,需要提供完整属性,或者插件逻辑里做深度合并)
122
- // 根据当前代码实现是浅合并,所以如果只写 palette,compressionLevel 可能会丢失(如果默认值是在loader里处理的)
123
- // 实际上 loader.js 做了深度合并,但 vite 插件里的 options 是顶层覆盖。
124
- // 建议:如果只改一项,尽量在 compress.config.js 里改。
125
- // 如果必须在这里改,传入完整对象:
118
+ // 1. JPEG 压缩选项
119
+ jpegOptions: {
120
+ quality: 75,
121
+ progressive: true,
122
+ mozjpeg: true
123
+ },
124
+
125
+ // 2. PNG 压缩选项
126
126
  pngOptions: {
127
- compressionLevel: 6,
128
- palette: false,
127
+ compressionLevel: 9,
128
+ palette: true,
129
+ effort: 7
130
+ },
131
+
132
+ // 3. WebP 压缩选项
133
+ webpOptions: {
134
+ quality: 80,
135
+ effort: 4
129
136
  },
130
137
 
131
- // 3. 甚至可以开启尺寸限制(虽然通常不建议在构建时改变原图尺寸)
138
+ // 4. 尺寸限制(可选)
132
139
  resize: {
133
140
  maxWidth: 1024,
134
141
  },
135
142
 
136
- // 4. 控制缓存
137
- cache: false,
138
-
139
- // 5. 启用水印
143
+ // 5. 水印配置
140
144
  watermark: {
141
145
  text: 'Copyright 2024',
142
146
  opacity: 0.5,
143
147
  density: 3,
144
148
  color: '#ffffff',
145
149
  fontSize: 24
146
- }
150
+ },
151
+
152
+ // 6. 控制缓存
153
+ cache: false,
147
154
  }),
148
155
  ],
149
156
  });
@@ -178,14 +185,34 @@ module.exports = {
178
185
  // scale: 0.8 // 缩放比例 (0-1)
179
186
  },
180
187
 
181
- // 通用质量参数 (JPEG/WebP)
182
- // 范围 1-100,默认 88
183
- quality: 88,
188
+ // JPEG 专属配置
189
+ jpegOptions: {
190
+ quality: 88, // 质量 (1-100),默认 88
191
+ progressive: false, // 渐进式 JPEG,默认 false
192
+ mozjpeg: false, // 使用 mozjpeg 编码器,默认 false
193
+ trellisQuantisation: false, // Trellis 量化,默认 false
194
+ overshootDeringing: false, // 过冲去环,默认 false
195
+ optimiseScans: false, // 优化扫描,默认 false
196
+ optimiseCoding: false // 优化编码,默认 false
197
+ },
184
198
 
185
199
  // PNG 专属配置
186
200
  pngOptions: {
187
201
  compressionLevel: 9, // 压缩等级 0-9,默认 9
188
202
  palette: true, // 是否启用调色板量化,默认 true (显著减小体积)
203
+ adaptiveFiltering: false, // 自适应过滤,默认 false
204
+ progressive: false, // 渐进式 PNG,默认 false
205
+ effort: 7 // 压缩努力程度 1-10,默认 7
206
+ },
207
+
208
+ // WebP 专属配置
209
+ webpOptions: {
210
+ quality: 88, // 质量 (1-100),默认 88
211
+ alphaQuality: 80, // 透明度质量 (0-100),默认 80
212
+ lossless: false, // 无损压缩,默认 false
213
+ nearLossless: false, // 近无损压缩,默认 false
214
+ smartSubsample: false, // 智能子采样,默认 false
215
+ effort: 4 // 压缩努力程度 0-6,默认 4
189
216
  },
190
217
 
191
218
  // 输出文件名后缀
@@ -245,3 +272,21 @@ A: 可以。使用 `watermark` 命令可以单独给图片添加水印而不进
245
272
 
246
273
  **Q: 水印颜色支持哪些格式?**
247
274
  A: 水印颜色支持十六进制格式(如 `#ffffff`)和 RGBA 格式(如 `rgba(255,255,255,0.5)`)。
275
+
276
+ **Q: 如何选择合适的压缩选项?**
277
+ A: 不同格式有不同的压缩策略:
278
+
279
+ - **JPEG**:
280
+ - `quality`: 75-85 是平衡质量和体积的最佳范围
281
+ - `progressive`: 适合网络传输,可渐进加载
282
+ - `mozjpeg`: 使用 mozjpeg 编码器可获得更好的压缩率
283
+
284
+ - **PNG**:
285
+ - `compressionLevel`: 9 是最大压缩,但处理时间较长
286
+ - `palette`: 对简单图形(如 logo、图标)启用调色板可大幅减小体积
287
+ - `effort`: 7 是默认值,可根据需要调整(1-10)
288
+
289
+ - **WebP**:
290
+ - `quality`: 80-90 通常能获得很好的压缩效果
291
+ - `lossless`: 对需要保持透明度的图片可考虑无损模式
292
+ - `effort`: 4 是默认值,数值越大压缩时间越长但效果更好
package/bin/compress.js CHANGED
@@ -197,10 +197,19 @@ program
197
197
  // // maxHeight: 1080,
198
198
  // // scale: 0.8
199
199
  // },
200
- quality: 88,
200
+ jpegOptions: {
201
+ quality: 88,
202
+ progressive: false,
203
+ mozjpeg: false
204
+ },
201
205
  pngOptions: {
202
206
  compressionLevel: 9,
203
- palette: true
207
+ palette: true,
208
+ effort: 7
209
+ },
210
+ webpOptions: {
211
+ quality: 88,
212
+ effort: 4
204
213
  },
205
214
  suffix: '.min',
206
215
  backup: false,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zhaoshijun/compress",
3
- "version": "1.0.5",
3
+ "version": "1.1.0",
4
4
  "description": "Image compression CLI and Vite plugin",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,9 +1,29 @@
1
1
  export const defaultConfig = {
2
2
  output: './compressed',
3
3
  quality: 88,
4
+ jpegOptions: {
5
+ quality: 88,
6
+ progressive: false,
7
+ mozjpeg: false,
8
+ trellisQuantisation: false,
9
+ overshootDeringing: false,
10
+ optimiseScans: false,
11
+ optimiseCoding: false
12
+ },
4
13
  pngOptions: {
5
14
  compressionLevel: 9,
6
- palette: true
15
+ palette: true,
16
+ adaptiveFiltering: false,
17
+ progressive: false,
18
+ effort: 7
19
+ },
20
+ webpOptions: {
21
+ quality: 88,
22
+ alphaQuality: 80,
23
+ lossless: false,
24
+ nearLossless: false,
25
+ smartSubsample: false,
26
+ effort: 4
7
27
  },
8
28
  suffix: '.min',
9
29
  backup: false,
@@ -22,10 +22,18 @@ export async function loadConfig(configPath) {
22
22
  return {
23
23
  ...defaultConfig,
24
24
  ...userConfig,
25
+ jpegOptions: {
26
+ ...defaultConfig.jpegOptions,
27
+ ...(userConfig.jpegOptions || {})
28
+ },
25
29
  pngOptions: {
26
30
  ...defaultConfig.pngOptions,
27
31
  ...(userConfig.pngOptions || {})
28
32
  },
33
+ webpOptions: {
34
+ ...defaultConfig.webpOptions,
35
+ ...(userConfig.webpOptions || {})
36
+ },
29
37
  watermark: {
30
38
  ...defaultConfig.watermark,
31
39
  ...(userConfig.watermark || {})
@@ -44,17 +44,13 @@ export async function compressImage(input, options, filePath) {
44
44
  switch (format) {
45
45
  case 'jpeg':
46
46
  case 'jpg':
47
- instance = instance.jpeg({ quality: options.quality || 88 });
47
+ instance = instance.jpeg(options.jpegOptions || { quality: 88 });
48
48
  break;
49
49
  case 'png':
50
- instance = instance.png({
51
- compressionLevel: options.pngOptions?.compressionLevel ?? 9,
52
- palette: options.pngOptions?.palette ?? true,
53
- quality: options.quality
54
- });
50
+ instance = instance.png(options.pngOptions || { compressionLevel: 9, palette: true });
55
51
  break;
56
52
  case 'webp':
57
- instance = instance.webp({ quality: options.quality || 88 });
53
+ instance = instance.webp(options.webpOptions || { quality: 88 });
58
54
  break;
59
55
  default:
60
56
  if (['jpeg', 'jpg', 'png', 'webp'].includes(format)) {
package/vite/index.js CHANGED
@@ -32,10 +32,26 @@ export function compressVitePlugin(options = {}) {
32
32
  }
33
33
  };
34
34
 
35
- // 特殊处理:如果 options 里有 quality,覆盖 config.quality
36
- if (options.quality) config.quality = options.quality;
37
- // 如果 options 里有 cache,覆盖 config.vite.cache
38
- if (options.cache !== undefined) config.vite.cache = options.cache;
35
+ // 特殊处理:深度合并各格式的压缩选项
36
+ if (options.jpegOptions) {
37
+ config.jpegOptions = {
38
+ ...fileConfig.jpegOptions,
39
+ ...options.jpegOptions
40
+ };
41
+ }
42
+ if (options.pngOptions) {
43
+ config.pngOptions = {
44
+ ...fileConfig.pngOptions,
45
+ ...options.pngOptions
46
+ };
47
+ }
48
+ if (options.webpOptions) {
49
+ config.webpOptions = {
50
+ ...fileConfig.webpOptions,
51
+ ...options.webpOptions
52
+ };
53
+ }
54
+
39
55
  // 特殊处理:如果 options 里有 watermark,深度合并
40
56
  if (options.watermark) {
41
57
  config.watermark = {