【发布时间】:2021-12-06 18:33:22
【问题描述】:
所以我制作了一个占位符图像/svg 以使用Nextjs image component,我从他们的回购中复制了这个code。
我对后端开发(主要是前端)不是很有经验,所以我不得不对缓冲区、流、window.bto 等进行研究。
我无法完全理解的是为什么需要typeof window === "undefined" 以及随后的代码行。如果我删除它,它也可以工作。
我可以理解这是一个边缘案例,例如“假设”。但我无法理解为什么需要。它总是会呈现给浏览器。为什么要检查窗口是否未定义?
提前致谢,抱歉英语不好,这不是我的主要语言。
Nextjs 代码
const shimmer = (w, h) => `
<svg width="${w}" height="${h}" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<linearGradient id="g">
<stop stop-color="#333" offset="20%" />
<stop stop-color="#222" offset="50%" />
<stop stop-color="#333" offset="70%" />
</linearGradient>
</defs>
<rect width="${w}" height="${h}" fill="#333" />
<rect id="r" width="${w}" height="${h}" fill="url(#g)" />
<animate xlink:href="#r" attributeName="x" from="-${w}" to="${w}" dur="1s" repeatCount="indefinite" />
</svg>`
const toBase64 = (str) =>
typeof window === 'undefined'
? Buffer.from(str).toString('base64')
: window.btoa(str)
const Shimmer = () => (
<div>
<ViewSource pathname="pages/shimmer.js" />
<h1>Image Component With Shimmer Data URL</h1>
<Image
alt="Mountains"
src="/mountains.jpg"
placeholder="blur"
blurDataURL={`data:image/svg+xml;base64,${toBase64(shimmer(700, 475))}`}
width={700}
height={475}
/>
</div>
我在组件上的实现
<Image
src={props.src}
layout={props.layout}
width={props.width}
height={props.height}
placeholder="blur"
blurDataURL={`data:image/svg+xml;base64,${toBase64(shimmer(300, 300))}`}
/>
【问题讨论】:
-
第一次在服务器上执行代码,其中未定义浏览器窗口对象。因此它用于确保您在浏览器中运行该代码。
标签: javascript reactjs next.js nextjs-image