面试题答案
一键面试性能优化策略
- 减少网络请求
- 代码拆分与懒加载:使用React.lazy和Suspense进行组件的代码拆分,只在需要的时候加载对应的组件代码,避免一次性加载过多代码,减少初始网络请求量。例如:
const SomeComponent = React.lazy(() => import('./SomeComponent'));
function App() {
return (
<div>
<React.Suspense fallback={<div>Loading...</div>}>
<SomeComponent />
</React.Suspense>
</div>
);
}
- **缓存机制**:在微服务之间以及React组件与后端服务交互时,合理设置缓存。对于不经常变化的数据,前端可以使用浏览器本地缓存(localStorage或sessionStorage),后端微服务可以采用分布式缓存(如Redis)。例如,对于一些配置信息,可以在首次获取后存于localStorage,后续直接从本地读取。
- **合并请求**:如果有多个请求是针对同一微服务或相关联的数据,可以将这些请求合并为一个。例如,在获取用户信息时,同时需要获取用户的权限信息,可通过后端接口设计,让一个接口返回这两部分数据。
2. 提升渲染效率 - 虚拟DOM与Diff算法优化:React的虚拟DOM和Diff算法已经在很大程度上优化了渲染,但可以通过减少不必要的状态更新来进一步提升。使用React.memo包裹无状态组件,它会对组件的props进行浅比较,如果props没有变化,组件不会重新渲染。例如:
const MyComponent = React.memo((props) => {
return <div>{props.value}</div>;
});
- **优化列表渲染**:当渲染大量列表数据时,使用react - virtualized或react - window库。这些库只渲染可见区域内的列表项,极大地提高了渲染性能。例如:
import { List } from'react - virtualized';
const data = Array.from({ length: 1000 }, (_, i) => i + 1);
const rowRenderer = ({ index, key, style }) => {
return (
<div key={key} style={style}>
Item {data[index]}
</div>
);
};
function App() {
return (
<List
height={400}
rowCount={data.length}
rowHeight={50}
rowRenderer={rowRenderer}
width={300}
/>
);
}
- **避免不必要的重渲染**:使用useState和useReducer时,确保状态更新是必要的。如果一个状态变化不会影响组件的显示,不要触发更新。例如,在一个只依赖于某个状态的计算结果的组件中,使用useMemo来缓存计算结果,避免重复计算。
const result = useMemo(() => expensiveCalculation(data), [data]);
安全加固策略
- 防范跨站脚本攻击(XSS)
- 输入验证与过滤:在React组件接收用户输入时,对输入内容进行严格验证,只允许符合特定格式的数据。例如,对于输入的邮箱地址,使用正则表达式验证。同时,过滤掉可能包含恶意脚本的字符,如
<script>
标签等。可以使用DOMPurify库来清理用户输入,防止XSS攻击。
- 输入验证与过滤:在React组件接收用户输入时,对输入内容进行严格验证,只允许符合特定格式的数据。例如,对于输入的邮箱地址,使用正则表达式验证。同时,过滤掉可能包含恶意脚本的字符,如
import DOMPurify from 'dompurify';
const sanitizedInput = DOMPurify.sanitize(userInput);
- **设置HTTP安全头**:在微服务的后端设置HTTP安全头,如Content - Security - Policy(CSP),限制页面可以加载的资源来源,防止恶意脚本注入。例如:
Content - Security - Policy: default - src'self'; script - src'self'
- **使用React的自动转义**:React默认会对插入到DOM中的数据进行转义,将特殊字符转换为安全的HTML实体,避免XSS攻击。但对于动态创建的HTML元素(如dangerouslySetInnerHTML),要谨慎使用,确保其中的数据是安全的。
2. 防范数据泄露 - 认证与授权:在微服务架构中,采用基于令牌(如JWT)的认证机制。React组件在请求微服务时,携带有效的令牌,微服务验证令牌的合法性。同时,实施细粒度的授权,确保用户只能访问其有权限的数据。例如,在获取用户数据的微服务接口中,根据用户的角色和权限判断是否允许访问该数据。 - 数据加密:在传输过程中,使用HTTPS协议对数据进行加密,防止数据在网络传输中被窃取。对于敏感数据,如用户密码、银行卡信息等,在存储时也应进行加密,如使用AES等加密算法。 - 安全编码实践:编写React组件和微服务代码时,遵循安全编码规范。避免硬编码敏感信息,如数据库密码等。对数据库查询进行参数化处理,防止SQL注入攻击(如果微服务涉及数据库操作)。同时,定期进行代码审查,及时发现并修复潜在的安全漏洞。