面试题答案
一键面试- 缓存机制
- 页面级缓存:
- 在Node.js的SSR项目中,可以利用HTTP缓存机制。例如,对于不经常变化的页面,可以设置
Cache - Control
头。在Express框架中,可以这样设置:const express = require('express'); const app = express(); app.get('/static - page', (req, res) => { res.set('Cache - Control', 'public, max - age = 31536000');// 设置缓存1年 // 渲染页面逻辑 res.send('渲染后的页面'); });
- 在Node.js的SSR项目中,可以利用HTTP缓存机制。例如,对于不经常变化的页面,可以设置
- 数据缓存:
- 使用内存缓存,如
node - cache
库。首先安装npm install node - cache
。然后在项目中:const NodeCache = require('node - cache'); const myCache = new NodeCache(); async function getData() { let data = myCache.get('key'); if (!data) { // 从数据库或其他数据源获取数据 data = await fetchDataFromDB(); myCache.set('key', data); } return data; }
- 使用内存缓存,如
- 页面级缓存:
- 代码拆分
- 路由级代码拆分:
- 在基于React Router和Node.js的SSR项目中,可以使用动态导入。例如,在路由配置中:
const { BrowserRouter as Router, Routes, Route } = require('react - router - dom'); const React = require('react'); const lazy = React.lazy; const Home = lazy(() => import('./components/Home')); const About = lazy(() => import('./components/About')); function App() { return ( <Router> <Routes> <Route path="/" element={<React.Suspense fallback={<div>Loading...</div>}><Home /></React.Suspense>} /> <Route path="/about" element={<React.Suspense fallback={<div>Loading...</div>}><About /></React.Suspense>} /> </Routes> </Router> ); } module.exports = App;
- 在基于React Router和Node.js的SSR项目中,可以使用动态导入。例如,在路由配置中:
- 组件级代码拆分:
- 对于大型组件,可以将其拆分成更小的子组件,并按需加载。比如一个复杂的
Dashboard
组件:const React = require('react'); const ChartComponent = React.lazy(() => import('./ChartComponent')); const TableComponent = React.lazy(() => import('./TableComponent')); function Dashboard() { return ( <div> <React.Suspense fallback={<div>Loading chart...</div>}><ChartComponent /></React.Suspense> <React.Suspense fallback={<div>Loading table...</div>}><TableComponent /></React.Suspense> </div> ); } module.exports = Dashboard;
- 对于大型组件,可以将其拆分成更小的子组件,并按需加载。比如一个复杂的
- 路由级代码拆分:
- 服务器资源管理
- 负载均衡:
- 使用Nginx作为反向代理和负载均衡器。在Nginx配置文件(如
/etc/nginx/sites - available/default
)中:upstream node_servers { server 192.168.1.10:3000; server 192.168.1.11:3000; } server { listen 80; server_name your_domain.com; location / { proxy_pass http://node_servers; proxy_set_header Host $host; proxy_set_header X - Real - IP $remote_addr; proxy_set_header X - Forwarded - For $proxy_add_x_forwarded_for; proxy_set_header X - Forwarded - Proto $scheme; } }
- 使用Nginx作为反向代理和负载均衡器。在Nginx配置文件(如
- 优化服务器配置:
- 根据服务器硬件资源,合理调整Node.js进程数。例如,在Linux系统中,可以使用
pm2
来管理Node.js进程,并根据CPU核心数来设置进程数。首先安装pm2
:npm install -g pm2
。然后启动应用:
这里pm2 start app.js - - instances max
max
会根据服务器CPU核心数自动分配进程数。
- 根据服务器硬件资源,合理调整Node.js进程数。例如,在Linux系统中,可以使用
- 负载均衡:
- 优化渲染过程
- 增量渲染:
- 在React项目中,可以使用
react - incremental - DOM
库。首先安装npm install react - incremental - DOM
。然后在渲染逻辑中:const React = require('react'); const { render, element, text } = require('react - incremental - DOM'); function MyComponent() { return ( element('div', null, text('Hello, world!') ) ); } render(() => <MyComponent />, document.getElementById('root'));
- 在React项目中,可以使用
- 减少重排重绘:
- 在CSS和JavaScript代码中,避免频繁修改引起重排重绘的样式属性。例如,不要在循环中频繁修改元素的
width
、height
等属性。如果需要批量修改,可以先修改元素的class
,通过CSS的transition
和transform
属性来实现动画效果,减少重排重绘的次数。
- 在CSS和JavaScript代码中,避免频繁修改引起重排重绘的样式属性。例如,不要在循环中频繁修改元素的
- 增量渲染:
- 优化数据库查询
- 数据库连接池:
- 在Node.js中,使用
mysql2
库连接MySQL数据库时,可以使用连接池。首先安装npm install mysql2
。然后:const mysql = require('mysql2'); const pool = mysql.createPool({ host: 'localhost', user: 'root', password: 'password', database: 'test', connectionLimit: 10 }); async function query(sql) { return new Promise((resolve, reject) => { pool.query(sql, (err, results) => { if (err) { reject(err); } else { resolve(results); } }); }); }
- 在Node.js中,使用
- 索引优化:
- 分析数据库查询语句,在经常用于
WHERE
、JOIN
等条件的字段上创建索引。例如,在MySQL中:
这样可以加快涉及CREATE INDEX idx_username ON users(username);
username
字段的查询速度。
- 分析数据库查询语句,在经常用于
- 数据库连接池: