From 23837b25ac8d65470137bbfa4f5f8bc8355a3f25 Mon Sep 17 00:00:00 2001 From: Jad Date: Sat, 20 Dec 2025 13:37:52 +0800 Subject: [PATCH] chore: improve performance --- build.js | 3 +- package.json | 3 ++ pnpm-lock.yaml | 86 +++++++++++++++++++++++++++++++++++++++++++++ public/index.html | 18 +++++----- src/app.js | 17 ++++----- src/i18n/en-US.json | 2 +- src/i18n/zh-CN.json | 4 +-- 7 files changed, 108 insertions(+), 25 deletions(-) diff --git a/build.js b/build.js index 12062f5..3eea2df 100644 --- a/build.js +++ b/build.js @@ -27,8 +27,7 @@ async function build() { bundle: true, format: 'esm', outfile: 'dist/app.js', - loader: { '.png': 'file' }, - assetNames: 'assets/[name]', + loader: { '.png': 'dataurl' }, publicPath: '/', minify: process.env.NODE_ENV === 'production' }); diff --git a/package.json b/package.json index 6afc802..46c65cd 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,9 @@ "build": "NODE_ENV=production node build.js", "serve": "npx serve dist" }, + "dependencies": { + "jszip": "^3.10.1" + }, "devDependencies": { "esbuild": "^0.24.0" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 741f9c0..33952ec 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,6 +7,10 @@ settings: importers: .: + dependencies: + jszip: + specifier: ^3.10.1 + version: 3.10.1 devDependencies: esbuild: specifier: ^0.24.0 @@ -164,11 +168,50 @@ packages: cpu: [x64] os: [win32] + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + esbuild@0.24.2: resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} engines: {node: '>=18'} hasBin: true + immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + jszip@3.10.1: + resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + + lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + snapshots: '@esbuild/aix-ppc64@0.24.2': @@ -246,6 +289,8 @@ snapshots: '@esbuild/win32-x64@0.24.2': optional: true + core-util-is@1.0.3: {} + esbuild@0.24.2: optionalDependencies: '@esbuild/aix-ppc64': 0.24.2 @@ -273,3 +318,44 @@ snapshots: '@esbuild/win32-arm64': 0.24.2 '@esbuild/win32-ia32': 0.24.2 '@esbuild/win32-x64': 0.24.2 + + immediate@3.0.6: {} + + inherits@2.0.4: {} + + isarray@1.0.0: {} + + jszip@3.10.1: + dependencies: + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + + lie@3.3.0: + dependencies: + immediate: 3.0.6 + + pako@1.0.11: {} + + process-nextick-args@2.0.1: {} + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + safe-buffer@5.1.2: {} + + setimmediate@1.0.5: {} + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + util-deprecate@1.0.2: {} diff --git a/public/index.html b/public/index.html index 367ef6f..a9c225c 100644 --- a/public/index.html +++ b/public/index.html @@ -11,13 +11,12 @@ - - + \ No newline at end of file diff --git a/src/app.js b/src/app.js index 96ffe7a..f16f837 100644 --- a/src/app.js +++ b/src/app.js @@ -1,16 +1,13 @@ -/** - * 主应用程序 - UI 交互逻辑 - */ - import { WatermarkEngine } from './core/watermarkEngine.js'; import i18n from './i18n.js'; +import JSZip from 'jszip'; -// 全局状态 +// global state let engine = null; let imageQueue = []; let processedCount = 0; -// DOM 元素 +// dom elements references const uploadArea = document.getElementById('uploadArea'); const fileInput = document.getElementById('fileInput'); const singlePreview = document.getElementById('singlePreview'); @@ -29,7 +26,7 @@ const resetBtn = document.getElementById('resetBtn'); const statusMessage = document.getElementById('statusMessage'); /** - * 初始化应用 + * initialize the application */ async function init() { try { @@ -48,7 +45,7 @@ async function init() { } /** - * 设置语言切换 + * setup language switch */ function setupLanguageSwitch() { const btn = document.getElementById('langSwitch'); @@ -62,7 +59,7 @@ function setupLanguageSwitch() { } /** - * 设置事件监听器 + * setup event listeners */ function setupEventListeners() { uploadArea.addEventListener('click', () => fileInput.click()); @@ -143,7 +140,7 @@ async function processSingle(item) { originalCanvas.height = img.height; originalCanvas.getContext('2d').drawImage(img, 0, 0); - // 显示图片信息 + // update original image info const watermarkInfo = engine.getWatermarkInfo(img.width, img.height); originalInfo.innerHTML = ` ${i18n.t('info.size')}:${img.width} × ${img.height} px
diff --git a/src/i18n/en-US.json b/src/i18n/en-US.json index cddd83d..26584b0 100644 --- a/src/i18n/en-US.json +++ b/src/i18n/en-US.json @@ -1,7 +1,7 @@ { "title": "Gemini Watermark Remover - Lossless Watermark Removal Tool", "header.title": "Gemini Watermark Remover", - "nav.userscript": "Userscript for Gemini", + "nav.userscript": "Install Userscript for Gemini", "nav.principle": "How It Works?", "main.title": "Gemini AI Watermark Removal", "main.subtitle": "Based on reverse alpha blending algorithm, pure browser-side processing, Free, Fast, and Lossless", diff --git a/src/i18n/zh-CN.json b/src/i18n/zh-CN.json index 8ff171a..e302ce5 100644 --- a/src/i18n/zh-CN.json +++ b/src/i18n/zh-CN.json @@ -1,7 +1,7 @@ { "title": "Gemini Watermark Remover - Gemini 无损去水印工具", "header.title": "Gemini Watermark Remover", - "nav.userscript": "油猴脚本", + "nav.userscript": "安装油猴脚本", "nav.principle": "去水印原理", "main.title": "Gemini AI 图像去水印", "main.subtitle": "基于反向 Alpha 混合算法,纯浏览器本地处理,免费、极速、无损", @@ -21,7 +21,7 @@ "feature.speed.title": "极速处理", "feature.speed.desc": "基于现代浏览器技术加速处理,毫秒级响应,无需等待排队", "feature.privacy.title": "隐私安全", - "feature.privacy.desc": "纯前端运行,图片数据不离机,绝不上传服务器", + "feature.privacy.desc": "浏览器前端本地运行,图片数据不会离开您的设备,绝不会上传服务器", "feature.free.title": "完全免费", "feature.free.desc": "无次数限制,无隐藏付费,即开即用", "footer.desc": "Gemini 无损去水印工具,本工具仅供学习交流使用",