File-to-File obrada
Browser File se proslijedi optimizeru i kao rezultat se dobije novi browser File koji se može direktno koristiti u postojećem upload procesu.
Frameworkski nezavisna i potpuno tipizirana biblioteka za optimizaciju slika prije uploada iz preglednika. Slike se lokalno skaliraju, kompresuju i konvertuju prije nego što stignu do same upload pipeline.
Zasnovano na browser File objektima, Web Workerima i WebAssemblyju, uz podršku za mješovite batch-eve datoteka, kontrolisanu paralelnu obradu, optimizaciju prema ciljanoj veličini i detaljne metapodatke obrade.
Velike slike povećavaju vrijeme uploada, potrošnju bandwidtha i potreban prostor za pohranu. jamit-image-optimizer dodaje poseban sloj za obradu slika ispred postojećeg upload procesa, bez preuzimanja kontrole nad samim uploadom.
Paket prima obične browser File objekte i vraća iste takve File objekte. Zbog toga ostaje kompatibilan sa FormData, signed URL-ovima, multipart uploadima i vlastitim backend API-jima.
Paket se fokusira na korake obrade koji su važni prije nego što slika ode na mrežu, uz potpunu nezavisnost od frameworka i backend infrastrukture.
Browser File se proslijedi optimizeru i kao rezultat se dobije novi browser File koji se može direktno koristiti u postojećem upload procesu.
Slike se dekodiraju, skaliraju i enkodiraju direktno u pregledniku. Sam paket ne šalje datoteke na eksterni servis.
Zahtjevna obrada slika izvršava se izvan glavnog UI threada kako bi aplikacija ostala responzivna tokom optimizacije.
JPEG, PNG i WebP obrada koristi browser-kompatibilne WebAssembly kodeke koji su uključeni u worker build paketa.
Slike i druge vrste datoteka mogu se obrađivati zajedno, dok se originalni redoslijed odabranih datoteka zadržava.
Za JPEG i WebP izlaz optimizer može tražiti odgovarajući nivo kvaliteta kada je potrebno približiti se određenoj ciljanoj veličini datoteke.
Batch obrada ograničava broj aktivnih image workera kako bi se izbjeglo nepotrebno opterećenje procesora i memorije.
AbortSignal podrška i lifecycle callbackovi omogućavaju prekid aktivne obrade i prikaz korisnih statusa unutar korisničkog interfejsa.
Svaka obrada vraća metapodatke o originalu i rezultatu, uštedu veličine, podatke o kompresiji i vrijeme obrade.
Interaktivni playground prikazuje stvarnu lokalnu obradu sa podesivim output modovima, kvalitetom, resize limitima, ciljnom veličinom i batch concurrency postavkama.
Images are optimized locally. Other file types can remain unchanged in the same batch.
JPEG · PNG · WebP · native HEIC / HEIF where supportedOptimizer prati jasan i predvidiv tok obrade, dok stvarna upload implementacija ostaje potpuno pod kontrolom aplikacije.
Ulaz se klasifikuje kao podržana slika, nepodržana slika ili passthrough datoteka koristeći MIME informacije i potpise datoteka gdje je to primjenjivo.
Podržane slike dekodiraju se unutar workera odgovarajućim kodekom ili putem nativnih browser funkcija.
Opcionalna maksimalna širina i visina primjenjuju se uz zadržavanje omjera stranica i bez nepotrebnog povećavanja slike.
Slika se enkodira prema konfigurisanom output modu, formatu, kvalitetu i opcionoj strategiji ciljane veličine.
Optimizer odlučuje da li generisani rezultat treba zamijeniti original i vraća finalni File zajedno sa detaljnim metapodacima.
jamit-image-optimizer se isporučuje kao ESM paket sa TypeScript deklaracijama i može se instalirati package managerom koji se već koristi u projektu.
pnpm add jamit-image-optimizernpm install jamit-image-optimizerObjavljeni paket ne zahtijeva dodatne runtime dependencies u aplikaciji koja ga koristi. Kodeci koje worker koristi već su uključeni u build paketa.
Koristi optimizeImage() kada jednu podržanu sliku treba skalirati, kompresovati ili konvertovati prije uploada.
import { optimizeImage } from 'jamit-image-optimizer';
const result = await optimizeImage(file, {
mode: 'auto',
quality: 0.85,
resize: {
maxWidth: 1920,
maxHeight: 1920,
},
});
console.log(result.file);
console.log(result.savings.percent);Optimizer sam ne šalje datoteke. Vraćeni File možeš koristiti sa FormData, fetch, Axios, signed URL-ovima, multipart uploadima ili vlastitom backend integracijom.
const result = await optimizeImage(file, {
mode: 'auto',
});
const formData = new FormData();
formData.append('file', result.file);
await fetch('/upload', {
method: 'POST',
body: formData,
});processFiles() je napravljen za upload interfejse u kojima korisnici biraju više datoteka i gdje batch može sadržavati slike i druge vrste datoteka.
Podržane slike obrađuju se uz kontrolisanu paralelnu obradu, dok izlazni niz zadržava isti redoslijed kao originalni odabir.
import { processFiles } from 'jamit-image-optimizer';
const result = await processFiles(files, {
mode: 'auto',
quality: 0.85,
resize: {
maxWidth: 1920,
maxHeight: 1920,
},
concurrency: 2,
});
await uploadFiles(result.files);PDF-ovi, video datoteke, tekstualne datoteke i druge vrste datoteka mogu ostati nepromijenjene u istom batchu dok se podržane slike optimizuju.
const result = await processFiles([
photo,
contractPdf,
screenshot,
video,
]);
for (const item of result.items) {
console.log({
name: item.originalFile.name,
kind: item.kind,
outcome: item.outcome,
});
}Tri output moda pokrivaju zadržavanje originalnog formata, eksplicitnu konverziju i automatsku optimizaciju bez prisiljavanja aplikacije na samo jednu strategiju.
Optimizer zadržava izvorni format kada je za taj format dostupan encoder i primjenjuje resize ili kompresiju bez namjerne konverzije formata.
const result = await optimizeImage(file, {
mode: 'original',
quality: 0.8,
});Odaberi JPEG, PNG ili WebP kada aplikacija treba tačno određeni izlazni format umjesto zadržavanja originalnog formata.
const result = await optimizeImage(file, {
mode: 'format',
format: 'webp',
quality: 0.85,
});Auto mod provjerava WebP kao kandidata za optimizaciju i koristi ga samo kada generisani rezultat zaista donosi korist.
const result = await optimizeImage(file, {
mode: 'auto',
quality: 0.85,
});Resize ograničenja i kompresija zasnovana na kvalitetu mogu se kombinovati kako bi se velike fotografije smanjile prije nego što potroše mrežni bandwidth.
Može se definisati maksimalna širina, maksimalna visina ili oboje. Slika se smanjuje unutar zadatih granica bez namjernog upscalinga.
const result = await optimizeImage(file, {
resize: {
maxWidth: 1920,
maxHeight: 1920,
},
});Kod izlaznih formata zasnovanih na kvalitetu optimizer može koristiti ograničenu pretragu kvaliteta kako bi se približio željenoj veličini datoteke uz poštovanje definisanog minimalnog kvaliteta.
const result = await optimizeImage(file, {
quality: 0.9,
targetSize: 500 * 1024,
minQuality: 0.5,
});
console.log(result.compression.targetReached);Status callbackovi i AbortSignal podrška čine optimizer pogodnim za interaktivne upload interfejse, a ne samo za procese u pozadini.
Lifecycle statusi poput dekodiranja, skaliranja, enkodiranja i finalizacije mogu se koristiti za prikaz smislenih stanja obrade u korisničkom interfejsu.
await optimizeImage(file, {
onStatus(status) {
console.log(status.stage);
},
});AbortSignal omogućava zaustavljanje aktivne obrade. Aktivni workeri se prekidaju umjesto da nepotrebno nastave raditi u pozadini.
const controller = new AbortController();
const promise = processFiles(files, {
concurrency: 2,
signal: controller.signal,
});
controller.abort();
await promise;Podrška za HEIC i HEIF ulaz namjerno se oslanja na nativne mogućnosti dekodiranja preglednika i operativnog sistema. Paket ne uključuje vlastiti HEVC decoder.
Ako okruženje može dekodirati datoteku, ona se može konvertovati u podržani izlazni format kao što su WebP, JPEG ili PNG. Ako nativno dekodiranje nije dostupno, paket prijavljuje nepodržani codec path umjesto da simulira uspješnu obradu.
Kompresovane slike nakon dekodiranja mogu zahtijevati znatno više memorije. Podesivi limiti za veličinu ulazne datoteke, broj piksela i dimenzije pomažu u sprečavanju neočekivano zahtjevne obrade u pregledniku.
const result = await optimizeImage(file, {
limits: {
maxInputBytes: 20 * 1024 * 1024,
maxPixels: 12_000_000,
maxDimension: 8192,
},
});ImageOptimizerError pruža tipizirane error kodove za situacije kao što su neispravne opcije, nedostupni kodeci, nepodržani izlazni formati, prekoračenje resource limita, worker greške i prekinute operacije.
import {
isImageOptimizerError,
optimizeImage,
} from 'jamit-image-optimizer';
try {
await optimizeImage(file);
} catch (error) {
if (isImageOptimizerError(error)) {
console.error(error.code);
console.error(error.message);
}
}Javni API je običan TypeScript i radi sa browser File objektima. Vue, Nuxt, React, Next.js, Svelte i Vanilla TypeScript aplikacije mogu koristiti isti paket bez framework-specifičnog adaptera.
Obrada slika odvija se lokalno u pregledniku sve dok aplikacija sama ne odluči šta će uraditi sa vraćenim File objektom.
jamit-image-optimizer ne šalje slike, nazive datoteka, metapodatke optimizacije niti telemetriju obrade na JamIT servis. Upload i analytics infrastruktura same aplikacije ostaju potpuno odvojeni od paketa.
API za obradu zahtijeva moderne browser mogućnosti. HEIC i HEIF dekodiranje dodatno zavisi od nativne podrške za kodeke u pregledniku i operativnom sistemu.
Prva javna verzija uključuje optimizaciju pojedinačnih slika, obradu mješovitih batch-eva datoteka, JPEG, PNG i WebP kodeke, resize i kontrolu kvaliteta, optimizaciju prema ciljanoj veličini, nativno HEIC/HEIF dekodiranje gdje je dostupno, kontrolisanu paralelnu obradu, Abort podršku i detaljne metapodatke rezultata.
Paket je objavljen na npm-u, a izvorni kod, testovi i razvojni playground dostupni su javno na GitHubu.
Pregledaj implementaciju, browser testove, worker pipeline i javni API ili prijavi problem direktno u repozitoriju.