From 661cb76578bae234eaee687de3412442c45ae09f Mon Sep 17 00:00:00 2001 From: chendq Date: Sat, 21 Jun 2025 21:16:18 +0800 Subject: [PATCH 1/3] fix(file): improve compressImg, add response data type --- src/file.ts | 39 +++++++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/src/file.ts b/src/file.ts index 7012451..028c330 100644 --- a/src/file.ts +++ b/src/file.ts @@ -40,6 +40,7 @@ export interface ICompressOptions { mime?: ImageType; /* 最大图片尺寸, 即width、height的最大值,不能小于1200 */ maxSize?: number; + minFileSizeKB?: number; } /** @@ -128,27 +129,42 @@ function scalingByAspectRatio({ sizeKB, maxSize, originWidth, originHeight }): { return { width: targetWidth, height: targetHeight }; } +export interface ICompressImgResult { + file: File; + bufferArray?: Uint8Array; + origin?: File; + beforeSrc?: string; + afterSrc?: string; + beforeKB?: number; + afterKB?: number; +} + /** - * Web端:等比例压缩图片批量处理 (size小于50KB,不压缩), 支持压缩全景图或长截图 + * Web端:等比例压缩图片批量处理 (小于minFileSizeKB:50,不压缩), 支持压缩全景图或长截图 * * 1. 默认根据图片原始size及宽高适当地调整quality、width、height * 2. 可指定压缩的图片质量 quality(若不指定则根据原始图片大小来计算), 来适当调整width、height * 3. 可指定压缩的图片最大宽高 maxSize(若不指定则根据原始图片宽高来计算), 满足大屏幕图片展示的场景 * * @param {File | FileList} file 图片或图片数组 - * @param {ICompressOptions} options 压缩图片配置项,default: {mime:'image/jpeg'} - * @returns {Promise | undefined} + * @param {ICompressOptions} options 压缩图片配置项,default: {mime:'image/jpeg', minFileSizeKB: 50} + * @returns {Promise} */ export function compressImg( file: File | FileList, - options: ICompressOptions = { mime: 'image/jpeg' } -): Promise | undefined { + options: ICompressOptions = { mime: 'image/jpeg', minFileSizeKB: 50 } +): Promise { if (!(file instanceof File || file instanceof FileList)) { throw new Error(`${file} require be File or FileList`); } else if (!supportCanvas()) { throw new Error(`Current runtime environment not support Canvas`); } - const { quality, mime = 'image/jpeg', maxSize: size }: ICompressOptions = isObject(options) ? options : {}; + const { + quality, + mime = 'image/jpeg', + maxSize: size, + minFileSizeKB = 50 + }: ICompressOptions = isObject(options) ? options : {}; let targetQuality = quality, maxSize; @@ -156,7 +172,7 @@ export function compressImg( targetQuality = quality; } else if (file instanceof File) { const sizeKB = +parseInt((file.size / 1024).toFixed(2)); - if (sizeKB < 1 * 50) { + if (sizeKB < minFileSizeKB) { targetQuality = 1; } else if (sizeKB < 1 * 1024) { targetQuality = 0.85; @@ -172,7 +188,9 @@ export function compressImg( } if (file instanceof FileList) { - return Promise.all(Array.from(file).map(el => compressImg(el, { maxSize, mime: mime, quality: targetQuality }))); // 如果是 file 数组返回 Promise 数组 + return Promise.all( + Array.from(file).map(el => compressImg(el, { maxSize, mime: mime, quality: targetQuality })) + ) as Promise; // 如果是 file 数组返回 Promise 数组 } else if (file instanceof File) { return new Promise(resolve => { const ext = { @@ -182,7 +200,7 @@ export function compressImg( }; const fileName = [...file.name.split('.').slice(0, -1), ext[mime]].join('.'); const sizeKB = +parseInt((file.size / 1024).toFixed(2)); - if (sizeKB < 50) { + if (sizeKB < minFileSizeKB) { resolve({ file: file }); @@ -219,7 +237,7 @@ export function compressImg( origin: file, beforeSrc: src, afterSrc: canvasURL, - beforeKB: Number((file.size / 1024).toFixed(2)), + beforeKB: sizeKB, afterKB: Number((miniFile.size / 1024).toFixed(2)) }); }; @@ -229,4 +247,5 @@ export function compressImg( } }); } + return Promise.resolve(null); } From ece865c962f0fcef45522c3386303cbb15980c52 Mon Sep 17 00:00:00 2001 From: chendq Date: Sat, 21 Jun 2025 23:02:27 +0800 Subject: [PATCH 2/3] build: use terser plugin when build umd --- package-lock.json | 62 ++++++++++++++++++++++++++++++++++++----------- package.json | 1 + rollup.config.js | 28 +++++++++++++++------ src/file.ts | 1 + 4 files changed, 71 insertions(+), 21 deletions(-) diff --git a/package-lock.json b/package-lock.json index d259336..3986392 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,6 +21,7 @@ "@rollup/plugin-commonjs": "^25.0.5", "@rollup/plugin-json": "^6.0.1", "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/plugin-terser": "^0.4.4", "@rollup/plugin-typescript": "^11.1.5", "@types/jest": "^29.5.5", "@typescript-eslint/eslint-plugin": "^6.7.5", @@ -3335,7 +3336,6 @@ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", "dev": true, - "peer": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -3543,6 +3543,28 @@ } } }, + "node_modules/@rollup/plugin-terser": { + "version": "0.4.4", + "resolved": "https://registry.npmmirror.com/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", + "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", + "dev": true, + "dependencies": { + "serialize-javascript": "^6.0.1", + "smob": "^1.0.0", + "terser": "^5.17.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, "node_modules/@rollup/plugin-typescript": { "version": "11.1.5", "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-11.1.5.tgz", @@ -11814,7 +11836,6 @@ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, - "peer": true, "dependencies": { "safe-buffer": "^5.1.0" } @@ -12619,7 +12640,6 @@ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", "dev": true, - "peer": true, "dependencies": { "randombytes": "^2.1.0" } @@ -12732,6 +12752,12 @@ "node": ">=12" } }, + "node_modules/smob": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/smob/-/smob-1.5.0.tgz", + "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==", + "dev": true + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -13188,7 +13214,6 @@ "resolved": "https://registry.npmjs.org/terser/-/terser-5.22.0.tgz", "integrity": "sha512-hHZVLgRA2z4NWcN6aS5rQDc+7Dcy58HOf2zbYwmFcQ+ua3h6eEFf5lIDKTzbWwlazPyOZsFQO8V80/IjVNExEw==", "dev": true, - "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -13272,15 +13297,13 @@ "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/terser/node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, - "peer": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -16566,7 +16589,6 @@ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", "dev": true, - "peer": true, "requires": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -16707,6 +16729,17 @@ "resolve": "^1.22.1" } }, + "@rollup/plugin-terser": { + "version": "0.4.4", + "resolved": "https://registry.npmmirror.com/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", + "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", + "dev": true, + "requires": { + "serialize-javascript": "^6.0.1", + "smob": "^1.0.0", + "terser": "^5.17.4" + } + }, "@rollup/plugin-typescript": { "version": "11.1.5", "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-11.1.5.tgz", @@ -22424,7 +22457,6 @@ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, - "peer": true, "requires": { "safe-buffer": "^5.1.0" } @@ -22990,7 +23022,6 @@ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", "dev": true, - "peer": true, "requires": { "randombytes": "^2.1.0" } @@ -23074,6 +23105,12 @@ } } }, + "smob": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/smob/-/smob-1.5.0.tgz", + "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -23398,7 +23435,6 @@ "resolved": "https://registry.npmjs.org/terser/-/terser-5.22.0.tgz", "integrity": "sha512-hHZVLgRA2z4NWcN6aS5rQDc+7Dcy58HOf2zbYwmFcQ+ua3h6eEFf5lIDKTzbWwlazPyOZsFQO8V80/IjVNExEw==", "dev": true, - "peer": true, "requires": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -23410,15 +23446,13 @@ "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "peer": true + "dev": true }, "source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, - "peer": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" diff --git a/package.json b/package.json index 57dafb1..20f86e2 100644 --- a/package.json +++ b/package.json @@ -60,6 +60,7 @@ "@rollup/plugin-commonjs": "^25.0.5", "@rollup/plugin-json": "^6.0.1", "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/plugin-terser": "^0.4.4", "@rollup/plugin-typescript": "^11.1.5", "@types/jest": "^29.5.5", "@typescript-eslint/eslint-plugin": "^6.7.5", diff --git a/rollup.config.js b/rollup.config.js index b7df5ec..add3bc6 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -6,6 +6,7 @@ import subpathExternals from 'rollup-plugin-subpath-externals'; import { dts } from 'rollup-plugin-dts'; import clear from 'rollup-plugin-clear'; import pkg from './package.json' assert { type: 'json' }; +import terser from '@rollup/plugin-terser'; const pkgName = pkg.name.includes('/') ? pkg.name.split('/')[1] : pkg.name; const isCore = process.env.BUILD_TARGET === 'core'; // 适用于web、node、小程序等任何js运行环境 @@ -48,13 +49,6 @@ export default [ preserveModulesRoot: 'src', exports: 'named', banner - }, - { - dir: 'lib/umd', - format: 'umd', - entryFileNames: 'index.js', - name: moduleName, - banner } ], plugins: [ @@ -71,6 +65,26 @@ export default [ json() ] }, + { + input: `src/${isCore ? 'core-index.ts' : 'index.ts'}`, + output: { + dir: 'lib/umd', + format: 'umd', + entryFileNames: 'index.js', + name: moduleName, + banner + }, + plugins: [ + resolve(), + commonjs(), + typescript({ + tsconfig: 'tsconfig.json', + include: ['src/**/*.ts'] + }), + json(), + terser() + ] + }, { // 生成 .d.ts 类型声明文件 input: `src/${isCore ? 'core-index.ts' : 'index.ts'}`, diff --git a/src/file.ts b/src/file.ts index 028c330..d7340ec 100644 --- a/src/file.ts +++ b/src/file.ts @@ -40,6 +40,7 @@ export interface ICompressOptions { mime?: ImageType; /* 最大图片尺寸, 即width、height的最大值,不能小于1200 */ maxSize?: number; + // 最小图片体积,小于该数值则不压缩,默认50KB minFileSizeKB?: number; } From 7b1c172a5efe26477945e487b53312daaff9adac Mon Sep 17 00:00:00 2001 From: chendq Date: Sat, 21 Jun 2025 23:06:04 +0800 Subject: [PATCH 3/3] chore(release): 1.10.4 --- CHANGELOG.md | 6 ++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e798806..d507b30 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +### [1.10.4](https://github.com/chandq/sculp-js/compare/v1.10.3...v1.10.4) (2025-06-21) + +### Bug Fixes + +- **file:** improve compressImg, add response data type ([661cb76](https://github.com/chandq/sculp-js/commit/661cb76578bae234eaee687de3412442c45ae09f)) + ### [1.10.3](https://github.com/chandq/sculp-js/compare/v1.10.2...v1.10.3) (2025-06-02) ### Bug Fixes diff --git a/package-lock.json b/package-lock.json index 3986392..7f7ebf2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "sculp-js", - "version": "1.10.3", + "version": "1.10.4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "sculp-js", - "version": "1.10.3", + "version": "1.10.4", "license": "MIT", "dependencies": { "bezier-easing": "^2.1.0" diff --git a/package.json b/package.json index 20f86e2..16b3a69 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sculp-js", - "version": "1.10.3", + "version": "1.10.4", "packageManager": "npm@8.19.2", "description": "js utils library, includes function library、class library", "scripts": {