This package is no longer maintained and most likely won't work with the newest version of svelte/sapper and rollup.
A Rollup plugin for image optimization and auto generation of responsive images for Svelte.
*This package is inspired by Svelte Image. If you want more feature like Lazy loading with auto generated placeholder you should check Svelte Image out.
<script>
import Image from 'svelte-i-pack'
</script>
<image
class="leaf"
src="leaf.png"
width="400*2"
sizes="(min-width: 800px) 400px, 100vw"
alt="Happa!"
media="(max-width: 400px)"
aSrc="grass.jpg"
aWidth="40*3"
/>
Will generate
<picture>
<source
type="image/webp"
srcset="
ipack/grass-120.webp 120w,
ipack/grass-80.webp 80w,
ipack/grass-40.webp 40w
"
sizes="40px"
/>
<source
srcset="
ipack/grass-120.jpg 120w,
ipack/grass-80.jpg 80w,
ipack/grass-40.jpg 40w
"
sizes="40px"
/>
<source
type="image/webp"
srcset="ipack/leaf-800.webp 800w, ipack/leaf-400.webp 400w"
sizes="(min-width: 400px) 400px, 100vw"
/>
<img
class="leaf"
srcset="ipack/leaf-800.png 800w, ipack/leaf-400.png 400w"
sizes="(min-width: 400px) 400px, 100vw"
alt="Happa!"
/>
</picture>
yarn add -D svelte-i-pack
(requires svelte >= v3)
SvelteSimply add iPack() in the rollup plugins before svelte plugin.
// rollup.config.js
import iPack from 'svelte-i-pack';
export default {
...,
plugins: [
iPack({ /* options */ }),
svelte({ ... }),
...
]
}
SapperPretty much the same as Svelte.
However, Sapper has two build configurations, one for the client bundle and one for the server.
To use svelte-i-pack with Sapper, you need to define it on both configurations.
// ...
import iPack from 'svelte-i-pack';
const iPackOptions = { /* options if needed */ }
export default {
client: {
plugins: [
iPack(iPackOptions),
svelte({
// ...
}),
},
server: {
plugins: [
iPack(iPackOptions),
svelte({
// ...
}),
],
},
};
iPack processor can receive an options object.
const options = {
/**
* Specify input directory for your original images.
* Original ones are simply treated as source and will not be included in the build.
* Thus, you should not set it in ./static.
**/
inputDir: 'content/img',
/**
* Jpeg/webp quality level
**/
quality: 75,
/**
* Png quality level
**/
pngCompLevel: 8,
/**
* Images below the threshold will be encoded to base64 and be inlined.
* In this case no image file will be generated.
**/
inlineThreshold: 5000,
/**
* If true, logs all an array of created and deleted images.
**/
logging: true,
}
<Image> component can recieve props below:
Standard html attributes. -These will be passed as normal attributes.
src (required) -relative and static path only
class
style
media
alt
sizes
When not specified,
sizeswill fall back to the value of the left part of thewidth- in the example below,160px.
You cannot pass
widthandheight. Use inline style or css instead.
iPack attributes.
width (required)
This is completely different from the normal html
widthattribute. This prop controls the size and the number of image generated.
syntax:
{actual.displayed.size}*{resolution}
example:
width="160*3"will generate images with size of[160, 320, 480]for both png/jpg and webp.
aSrc
aWIdth
aSizes
When you specify
mediain art direction scenarios, you can specify theirsrc,width,sizeswith these props. (a = alternative) If you don't specifyaSizes, value of the left part of theaWidthwill be used.
no-inline
Pass this prop if you don't want the image to be converted to inlined-base64. This should be desirable for the images that get used multiple times in the same page.
If you want to disable inline-img feature globally, set
inline-thresholdin preprocessor option to0.
As you can see above, you can pass as many classes to <Image> component.
However, since Svelte's style is scoped by default, you need to tweek a little to apply the style you specified in the parent component to the <Image> component.
:global styleChange
.callout {
margin-right: 0.5rem;
margin-top: 1.25rem;
}
to
:global(.callout) {
margin-right: 0.5rem;
margin-top: 1.25rem;
}
<image
src="pc/2x/leaf3.png"
width="160*2"
sizes="160px"
alt=""
class="h-16 w-16 mx-auto"
/>
Both works, but using utility-first css should be slightly optimal.
By configuring Tailwind.css correctly you can eliminate the small overhead caused by :global-ing styles.