next
Version:
The React Framework
74 lines (73 loc) • 3.18 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = exports.raw = void 0;
var _loaderUtils3 = _interopRequireDefault(require("next/dist/compiled/loader-utils3"));
var _imageOptimizer = require("../../../server/image-optimizer");
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
const BLUR_IMG_SIZE = 8;
const BLUR_QUALITY = 70;
const VALID_BLUR_EXT = [
"jpeg",
"png",
"webp",
"avif"
] // should match next/client/image.tsx
;
function nextImageLoader(content) {
const imageLoaderSpan = this.currentTraceSpan.traceChild("next-image-loader");
return imageLoaderSpan.traceAsyncFn(async ()=>{
const { isServer , isDev , assetPrefix , basePath } = this.getOptions();
const context = this.rootContext;
const opts = {
context,
content
};
const interpolatedName = _loaderUtils3.default.interpolateName(this, "/static/media/[name].[hash:8].[ext]", opts);
const outputPath = assetPrefix + "/_next" + interpolatedName;
let extension = _loaderUtils3.default.interpolateName(this, "[ext]", opts);
if (extension === "jpg") {
extension = "jpeg";
}
const imageSizeSpan = imageLoaderSpan.traceChild("image-size-calculation");
const imageSize = await imageSizeSpan.traceAsyncFn(()=>(0, _imageOptimizer).getImageSize(content, extension));
let blurDataURL;
if (VALID_BLUR_EXT.includes(extension)) {
if (isDev) {
const prefix = "http://localhost";
const url = new URL(`${basePath || ""}/_next/image`, prefix);
url.searchParams.set("url", outputPath);
url.searchParams.set("w", BLUR_IMG_SIZE);
url.searchParams.set("q", BLUR_QUALITY);
blurDataURL = url.href.slice(prefix.length);
} else {
// Shrink the image's largest dimension
const dimension = imageSize.width >= imageSize.height ? "width" : "height";
const resizeImageSpan = imageLoaderSpan.traceChild("image-resize");
const resizedImage = await resizeImageSpan.traceAsyncFn(()=>(0, _imageOptimizer).resizeImage(content, dimension, BLUR_IMG_SIZE, extension, BLUR_QUALITY));
const blurDataURLSpan = imageLoaderSpan.traceChild("image-base64-tostring");
blurDataURL = blurDataURLSpan.traceFn(()=>`data:image/${extension};base64,${resizedImage.toString("base64")}`);
}
}
const stringifiedData = imageLoaderSpan.traceChild("image-data-stringify").traceFn(()=>JSON.stringify({
src: outputPath,
height: imageSize.height,
width: imageSize.width,
blurDataURL
}));
if (!isServer) {
this.emitFile(interpolatedName, content, null);
}
return `export default ${stringifiedData};`;
});
}
const raw = true;
exports.raw = raw;
var _default = nextImageLoader;
exports.default = _default;
//# sourceMappingURL=next-image-loader.js.map