面试题答案
一键面试性能优化策略
- 懒加载
- 使用next/image:Next.js 的
next/image
组件支持图片的懒加载。虽然它主要针对传统图片格式,但结合next-svgr
可以间接实现 SVG 的懒加载。首先安装next-svgr
:
- 使用next/image:Next.js 的
npm install @svgr/next
然后在 next.config.js
中配置:
const withSvgr = require('@svgr/next');
module.exports = withSvgr({});
之后就可以像使用 next/image
一样引入 SVG 文件:
import Image from 'next/image';
import mySvg from '../public/mySvg.svg';
const MyComponent = () => (
<Image
src={mySvg}
alt="My SVG"
width={200}
height={200}
layout="responsive"
priority
/>
);
- **Intersection Observer API**:手动使用 Intersection Observer API 实现 SVG 的懒加载。创建一个自定义的 React 组件,在组件内部使用 Intersection Observer 来监听 SVG 元素是否进入视口,进入时再加载 SVG。
import React, { useRef, useEffect } from'react';
const LazyLoadSVG = ({ src, alt }) => {
const svgRef = useRef(null);
useEffect(() => {
const observer = new IntersectionObserver((entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
const img = new Image();
img.src = src;
img.onload = () => {
svgRef.current.innerHTML = img.innerHTML;
observer.unobserve(svgRef.current);
};
}
});
});
if (svgRef.current) {
observer.observe(svgRef.current);
}
return () => {
if (svgRef.current) {
observer.unobserve(svgRef.current);
}
};
}, [src]);
return <div ref={svgRef} aria - label={alt} />;
};
export default LazyLoadSVG;
- 优化 SVG 文件本身
- 压缩 SVG:使用工具如
svgo
来压缩 SVG 文件。安装svgo
后,可以在命令行运行:
- 压缩 SVG:使用工具如
npx svgo input.svg -o output.svg
- **简化路径和形状**:检查 SVG 文件,去除不必要的路径、形状和元素。比如如果有隐藏的元素或者重复的路径,可以进行合并或删除。
- **内联 SVG**:对于较小的 SVG,可以将其直接内联到 HTML 或 JSX 中。这样可以减少 HTTP 请求,但要注意不要过度内联,以免增加文件体积。在 Next.js 中,可以使用 `next-svgr` 将 SVG 转换为 React 组件并内联:
import React from'react';
import mySvg from '../public/mySvg.svg';
const MyComponent = () => (
<div>
{mySvg}
</div>
);
export default MyComponent;
安全策略
- 防止 XSS 攻击
- 输入验证:如果 SVG 文件是由用户上传的,要对文件内容进行严格的验证。可以使用正则表达式或专门的 SVG 解析库来验证 SVG 的结构,确保不包含恶意脚本。例如,使用
DOMPurify
库:
- 输入验证:如果 SVG 文件是由用户上传的,要对文件内容进行严格的验证。可以使用正则表达式或专门的 SVG 解析库来验证 SVG 的结构,确保不包含恶意脚本。例如,使用
npm install dompurify
import DOMPurify from 'dompurify';
const cleanSvg = (svgString) => {
const clean = DOMPurify.sanitize(svgString, {
FORBID_TAGS: ['script'],
RETURN_DOM_FRAGMENT: true
});
return new XMLSerializer().serializeToString(clean);
};
- **内容安全策略(CSP)**:在 Next.js 项目中,可以通过设置 `Content - Security - Policy` 头来限制 SVG 中可以执行的脚本来源。在 `next.config.js` 中配置:
module.exports = {
headers: () => [
{
source: '/:path*',
headers: [
{
key: 'Content - Security - Policy',
value: "default - src'self'; script - src'self'"
}
]
}
]
};
这将只允许从自身来源加载脚本,防止 SVG 中嵌入外部恶意脚本。 - 严格的文件上传限制:只允许上传受信任的 SVG 文件。可以通过白名单机制,只允许特定目录或特定来源的 SVG 文件上传到项目中。