@vitbokisch/next-optimized-images
Version:
Automatically optimize images used in next.js projects (jpeg, png, gif, svg).
101 lines (91 loc) • 2.51 kB
JavaScript
import { getUrlLoaderOptions } from './url-loader.js'
import { getResourceQueries } from '../resource-queries.js'
/**
* Build options for the webp loader
*
* @param {object} nextConfig - next.js configuration
* @returns {object}
*/
const getWebpLoaderOptions = ({ webp }) => webp || {}
/**
* Apply the webp loader to the webpack configuration
*
* @param {object} webpackConfig - webpack configuration
* @param {object} nextConfig - next.js configuration
* @param {boolean} optimize - if images should get optimized
* @param {boolean} isServer - if the build is for the server
* @param {object} detectedLoaders - all detected and installed loaders
* @returns {object}
*/
const applyWebpLoader = (
webpackConfig,
nextConfig,
optimize,
isServer,
detectLoaders
) => {
const webpLoaders = [
{
loader: 'url-loader',
options: getUrlLoaderOptions(nextConfig, isServer),
},
]
if (optimize) {
webpLoaders.push({
loader: 'webp-loader',
options: getWebpLoaderOptions(nextConfig),
})
}
webpackConfig.module.rules.push({
test: /\.webp$/i,
oneOf: [
// add all resource queries
...getResourceQueries(
nextConfig,
isServer,
!optimize ? null : 'webp-loader',
getWebpLoaderOptions(nextConfig),
detectLoaders
),
// default behavior: inline if below the definied limit, external file if above
{
use: webpLoaders,
},
],
})
return webpackConfig
}
/**
* Returns the resource query definition for converting a jpeg/png image to webp
*
* @param {object} nextConfig - next.js configuration
* @param {boolean} isServer - if the build is for the server
* @returns {object}
*/
const getWebpResourceQuery = (nextConfig, isServer) => {
const urlLoaderOptions = getUrlLoaderOptions(nextConfig, isServer)
const imageName =
urlLoaderOptions.name.indexOf('[ext]') >= 0
? urlLoaderOptions.name.replace(
'[ext]',
nextConfig.removeOriginalExtension ? 'webp' : '[ext].webp'
)
: `${urlLoaderOptions.name}.webp`
return {
resourceQuery: /webp/,
use: [
{
loader: 'url-loader',
options: Object.assign({}, urlLoaderOptions, {
name: imageName,
mimetype: 'image/webp',
}),
},
{
loader: 'webp-loader',
options: getWebpLoaderOptions(nextConfig),
},
],
}
}
export { getWebpLoaderOptions, applyWebpLoader, getWebpResourceQuery }