@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 +64 -19
- package/bin/compress.js +11 -2
- package/package.json +1 -1
- package/src/config/defaults.js +21 -1
- package/src/config/loader.js +8 -0
- package/src/core/compressor.js +3 -7
- package/vite/index.js +20 -4
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
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
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:
|
|
128
|
-
palette:
|
|
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
|
-
//
|
|
138
|
+
// 4. 尺寸限制(可选)
|
|
132
139
|
resize: {
|
|
133
140
|
maxWidth: 1024,
|
|
134
141
|
},
|
|
135
142
|
|
|
136
|
-
//
|
|
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
|
-
//
|
|
182
|
-
|
|
183
|
-
|
|
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
|
-
|
|
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
package/src/config/defaults.js
CHANGED
|
@@ -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,
|
package/src/config/loader.js
CHANGED
|
@@ -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 || {})
|
package/src/core/compressor.js
CHANGED
|
@@ -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:
|
|
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:
|
|
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
|
-
//
|
|
36
|
-
if (options.
|
|
37
|
-
|
|
38
|
-
|
|
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 = {
|