
Caractéristiques
sharploading="lazy" )<Picture />Par défaut, le prochain IMG est configuré pour utiliser:
768px Tous ces paramètres et plus peuvent être modifiés dans votre next.config.js ou dans les importations d'image individuelles.
Développé et utilisé par les humains.
Par défaut, next.js ou webpack ne vous aide pas beaucoup à optimiser les images. Cela signifie une configuration ou un script personnalisé, en traitement des images à la main, en utilisant un CDN d'image ou en optimisant les images du tout. Next-IMG fournit et une approche alternative rationalisée pour ajouter des images à vos projets Next.js. Il combine un plugin Next.js, un chargeur Webpack personnalisé et un composant React pour rendre les images de service de manière optimale d'une manière qui est presque aussi simple que de taper <img src='foo.png' /> .
Bref, il faut ce qui suit:
< Picture src = { require ( './images/jelly.jpg?sizes=375,800' ) } alt = 'Jellyfish' />Importe, redimensionne, optimise, cache (constamment dans le repo git) et produit le HTML suivant:
< picture >
< source
type =" image/webp "
srcset ="
/_next/static/images/[email protected] 375w,
/_next/static/images/[email protected] 750w,
/_next/static/images/[email protected] 800w,
/_next/static/images/[email protected] 1600w
"
sizes =" (max-width: 768px) 375px, 800px "
/>
< source
type =" image/jpeg "
srcset ="
/_next/static/images/[email protected] 375w,
/_next/static/images/[email protected] 750w,
/_next/static/images/[email protected] 800w,
/_next/static/images/[email protected] 1600w
"
sizes =" (max-width: 768px) 375px, 800px "
/>
< img
src =" /_next/static/images/[email protected] "
srcset ="
/_next/static/images/[email protected] 375w,
/_next/static/images/[email protected] 750w,
/_next/static/images/[email protected] 800w,
/_next/static/images/[email protected] 1600w
"
width =" 375 "
height =" 250 "
alt =" Jellyfish "
/>
</ picture >Afficher des exemples.
Installer le package
npm install next-img
Ajoutez le plugin à votre next.config.js :
const withImg = require ( 'next-img/plugin' )
module . exports = withImg ( {
nextImg : {
breakpoints : [ 768 ] ,
} ,
} ) Dans votre application, importez les images et intégrez à l'aide du composant <Picture /> :
import { Picture } from 'next-img'
import jelly from './images/jelly.jpg?sizes=375,800'
export default ( ) => < Picture src = { jelly } />Ou en ligne:
import { Picture } from 'next-img'
export default ( ) => < Picture src = { require ( './images/jelly.jpg?sizes=375,800' ) } />Cet exemple particulier générera les images suivantes:
Les images redimensionnées et optimisées seront enregistrées dans le répertoire resources à la racine de votre projet pendant le développement. Cela signifie que si vous modifiez les paramètres d'importation d'image ou la configuration du plugin, vous pouvez générer des images supplémentaires qui ne sont plus utilisées par votre projet. Dans ce cas, exécutez la commande next-img pour supprimer toutes les images inutiles et construire toutes les manquantes:
npx next-img
Vérifiez maintenant le répertoire resources à votre contrôle de source à réutiliser plus tard pour le développement et les versions de production. Vous pouvez désactiver cette fonctionnalité en définissant persistentCache: false dans la configuration du plugin, auquel cas les images ne seront stockées que dans un cache temporaire à l'intérieur du répertoire .next .
Voir plus d'exemples d'utilisation.
Options de configuration du plugin par défaut:
{
// global settings for images, can be overriden per image
breakpoints : [ 768 ] ,
densities : [ '1x' , '2x' ] ,
// output image quality configuration
jpeg : {
quality : 80 ,
webp : {
quality : 90 ,
reductionEffort : 6 ,
} ,
} ,
png : {
quality : 100 ,
webp : {
reductionEffort : 6 ,
lossless : true ,
} ,
} ,
// the directory within Next.js build output
imagesDir : 'images' ,
// the output image name template
imagesName : '[name]-[size]@[density]-[hash].[ext]' ,
// advanced - customise the image public path
imagesPublicPath : null ,
// advanced - customise the image output path
imagesOutputPath : null ,
// persistent cache allows for fast deploy and
// development workflow by avoiding reprocessing
// images that were previously processed
persistentCache : true ,
persistentCacheDir : 'resources' ,
// this directory within .next is used in case persistent cache is turned off
cacheDir : path . join ( 'cache' , 'next-img' )
} Reportez-vous à la documentation Sharp pour les options de compression jpeg/png/webp .
Lors de l'importation d'une image, vous pouvez utiliser des paramètres de requête pour personnaliser l'optimisation:
320px de large sur votre site Web, spécifiez simplement 320 ici, le plugin produira toutes les versions plus grandes nécessaires en fonction de la configuration densities .1x et 2x tailles d'images seront produits, spécifiez 1x si vous souhaitez produire une seule image par taille, ou 1x,2x,3x , etc. si vous voulez plus de densités.jpeg . Remarque, les paramètres jpeg->webp doivent être ?jpeg[webp][quality]=95 sous ce parampng . ?png[webp][lossless]=false&png[webp][nearLossless]=true , les paramètres png->webp doivent être imbriqués sous ce paramExemples:
import img1 from './images/img.jpg'
import img2 from './images/img.jpg?sizes=375,900'
import img3 from './images/img.jpg?sizes=375,900&densities=1x'
import img4 from './images/img.jpg?sizes=375,900&densities=1x,2x,3x'
import img5 from './images/img.jpg?sizes=375,900&densities=1x,2x,3x&jpeg[quality]=70&jpeg[webp][quality]=70' next-img est livré avec un composant React facilitant l'intégration des images.
Voici les accessoires que ce composant accède:
img . Cela permet d'utiliser des attributs tels que alt , loading="lazy" , etc. Lorsqu'une seule image est fournie via l'hélice src , chaque taille sera configurée pour s'afficher pour chaque point d'arrêt disponible à l'aide de l'attribut sizes attribute .
Par exemple, avec des points d'arrêt [375, 768] et ?sizes=100,400,800 le composant <Picture> appliquera l'attribut sizes suivantes:
(max-width: 375px) 100px,
(max-width: 768px) 400px,
800px
Lorsqu'un tableau d'images est fourni via le src Prop, chaque image sera configurée pour s'afficher pour chaque point d'arrêt disponible à l'aide de l' media attribute .
Par exemple, avec des points d'arrêt [375, 768] et src=[img1, img2, img3] Le composant <Picture> appliquera l'attribut media suivant:
< picture >
< source media =" (max-width: 480px) " sizes =" {{img1 width}} " />
< source media =" (max-width: 768px) " sizes =" {{img2 width}} " />
< source sizes =" {{img3 width}} " />
< img ... />
</ picture > Dois-je utiliser le composant <Picture /> ?
Le composant d'image est facultatif. Vous pouvez gérer l'objet d'image importé comme vous le souhaitez.
Les images ne pourraient-elles pas être optimisées davantage?
Oui, vous pourriez probablement obtenir ~ 10% à 20% ou plus de compression si vous passez le jpg/png via ImageOptim ou d'autres outils. Le fait est que ce plugin publie un WebP déjà bien optimisé et que vous servez WebP à la plupart des navigateurs modernes, qui supprime la nécessité de presser cette taille de fichier supplémentaire pour jpg/png car ce sont les images de secours . Cependant, il peut y avoir des cas d'utilisation où des algorhiths de compression personnalisés sont BESOINSED et nous pourrions ajouter une prise en charge des transformations arbitraires dans ce plugin à l'avenir.
Pour développer ce projet, vous devrez exécuter un observateur pour le composant <Picture /> :
npm install
npm run watch
Vous pouvez utiliser l'exemple comme terrain de jeu:
cd example
npm install
next
Pour exécuter la commande next-img dans l'exemple Dir:
node ../bin/next-img
Feuille de route
jpg->webp et png->webp webp/jpg/png ?raw qui ne traite en aucune façon l'image next-img en branchant directement dans next build Et quelques idées pour savoir où ce projet pourrait être réalisé à l'avenir:
imagemin dans le pipeline via la configuration. De cette façon, les utilisateurs peuvent contrôler comment optimiser leurs images plus granuarly.?sizes=100vw,50vw,900px à des pixels en fonction de la configuration du point d'arrêt, cela permettrait des importations dynamiques qui dépendent de votre système de conception et de votre dimensionnement relatif des images, par exemple, si CSS dit "50vw", vous n'aurez pas besoin de faire ce calcul manuellement.require() .