source: https://webpack.js.org/guides/asset-modules/
Les assets Modules sont un type de module qui permet d’utiliser des fichiers d’assets (images, polices, icônes, etc.) sans configurer de chargeurs supplémentaires.
Avant Webpack 5, il était courant d’utiliser:
raw-loader
pour importer un fichier sous forme de chaîneurl-loader
pour insérer un fichier dans le bundle en tant qu’URI de donnéesfile-loader
pour émettre un fichier dans le répertoire de sortie
Les asset Modules remplacent tous ces chargeurs en ajoutant 4 nouveaux types de modules:
asset/resource
émet un fichier séparé et exporte l’URL. Auparavant réalisable en utilisantfile-loader
.asset/inline
exporte un URI de données de l’asset. Auparavant réalisable en utilisanturl-loader
.asset
choisit automatiquement entre l’exportation d’un URI de données (asset/inline) et l’émission d’un fichier séparé (asset/resource). Auparavant réalisable en utilisanturl-loader
avec une limite de taille de l’asset.asset/source
intègre sans aucune transformation le code source de l’asset. Auparavant réalisable en utilisantraw-loader
.
asset/resource
Emet un fichier séparé et exporte l’URL. Par défaut, les asset/resource
modules émettent avec le [hash][ext][query]
nom de fichier dans le répertoire de sortie.
Vous pouvez modifier ce modèle en définissant output.assetModuleFilename
dans votre configuration Webpack. Il est configurable via un template strings.
Il convient d’ajouter ceci dans webpack.config.js
const path = require('path') module.exports = { entry: './src/index.js', output: { filename: 'main.js', path: path.resolve(__dirname, 'dist'), assetModuleFilename: '/images/[hash][ext][query]' }, module: { rules: [ { test: /\.png/, type: 'asset/resource' } ] }, }
Il est également possible de spécifier un dossier de destination pas extension testée:
module: { rules: [ { test: /\.png/, type: 'asset/resource' }, { test: /\.html/, type: 'asset/resource', generator: { filename: 'static/[hash][ext][query]' } } ] }
asset/inline
Exporte un URI de données de l’asset.
webpack.config.js
module: { rules: [ { test: /\.svg/, type: 'asset/inline' } ] }
La donnée de l’asset est encodée en utilisant algorithme Base64 et injectée dans une URL.
import metroMap from './images/metro.svg' block.style.background = `url(${metroMap})` // url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDo...vc3ZnPgo=)
Il est possible d’utiliser un algorithme d’encodage personnalisé en spécifiant une fonction personnalisée pour encoder le contenu d’un fichier. Par exemple le module mini-svg-data-uri convertit les SVGs en une donnée plus compact qu’une version Base64.
const path = require('path') const svgToMiniDataURI = require('mini-svg-data-uri') module.exports = { entry: './src/index.js', output: { filename: 'main.js', path: path.resolve(__dirname, 'dist') }, module: { rules: [ { test: /\.svg/, type: 'asset/inline', generator: { dataUrl: content => { content = content.toString() return svgToMiniDataURI(content) } } } ] }, }
asset
Webpack choisit automatiquement entre asset/ressource et asset inline (fichier inférieur à 8kb). Il est possible de changer cette condition en configurant Rule.parser.dataUrlCondition.maxSize
.
module: { rules: [ { test: /\.txt/, type: 'asset', parser: { dataUrlCondition: { maxSize: 4 * 1024 // 4kb } } } ] },
asset/source
Intègre sans aucune transformation le code source de l’asset.
module: { rules: [ { test: /\.txt/, type: 'asset/source', } ] },
Optimisation des images
Utilisation du plugin ImageMinimizerWebpackPlugin.