滴滴前端面试全流程复盘:从八股文到真实场景设计
1. 面试基本信息与技术栈冷启动上周刚走完滴滴前端面试全流程一共三轮技术面加一轮HR面趁记忆还热乎赶紧把面经写下来。投的是滴滴某核心业务部门的前端岗位主线是出行场景的C端产品技术栈以React为主但面试过程中Vue也没少问——这是当前前端市场很典型的形势框架不再是唯一标准底层能力和工程化素养才是分水岭。先交代一下我的背景三年经验上一份工作主要做中后台系统用过React和Vue两种技术栈写过一些组件库和微前端改造项目了解Node.js但不算深入工程化方面有自己的沉淀。这次面试准备时间大概两周重点复习了前端面试题中出现频率最高的几个方向实际面下来发现滴滴的考察风格跟传统八股文驱动型面试有明显差异——更务实更偏向场景推演。整个流程的安排大概是一面技术面约1小时二面技术面约1小时三面约45分钟每轮中间间隔三到五天。HR面相对轻松但也问了技术学习能力和职业规划的问题。整体节奏比很多大厂要紧凑而且面试官普遍会对简历上的项目细节追得非常深基本不存在“背完八股就完事”的空间。这个岗位Base在北京面试是纯线上的用的是常规的视频面试工具需要共享屏幕写代码。如果你也在准备滴滴的前端面试建议提前做好这几件事把简历里每个技术点都准备一个“为什么这样设计”的答案把常用的手写题在IDE里练一遍而不是只靠脑子过准备好一两个能体现性能优化或稳定性治理的完整案例。接下来按轮次把面试题和我的复盘拆开讲。2. 一面深挖简历项目里的那些“追问陷阱”2.1 监控上报系统的设计思路一面上来没有让我自我介绍太久面试官直接指着简历里的一个项目问“你说你们做过前端监控那首屏加载时间具体是怎么定义的DOMContentLoaded和Load事件在这一场景下的区别是什么”这个问题看似基础但答不好很容易暴露“只写了文档没真正实践过”。我当时回答的核心思路是第一屏的判定不能简单用DOMContentLoaded因为接口数据没回来之前页面上是loading态用户感知到的“首屏可用”其实是核心数据渲染完成的时间。我在项目里用的方案是用PerformanceObserver监听largest-contentful-paint再结合接口返回时机和图片加载时机做综合判定同时在SDK里包裹了一个自定义的markPoint方法在业务代码需要打点的地方手动上报关键节点。面试官随后追问“如果接口挂了或者接口长时间pending你的监控数据会怎么表现怎么把这个信息编码上报”这个问题实际考察的是异常链路设计能力。我当时项目里的方案是监控SDK内部有一个超时兜底机制对每个请求包一层Promise.race超过5秒即使业务还没有完成也会发一条statustimeout的上报数据。同时SDK内部会区分错误类型——网络错误、超时、业务错误——分别打不同的tag方便后端做聚合分析。面试官对这个回答比较满意又问了一个衍生问题“监控数据本身就依赖网络上报那如果用户网络已断这些数据是不是就丢了你会怎么做本地缓存”这个追问属于很典型的滴滴风格——不满足于表面方案非要逼到“边缘场景你怎么兜底”。我的回答是用localStorage做环形队列设定最大50条超过就覆盖最老的数据然后在online事件触发时重新flush。面试官继续追问了“为什么是50条而不是更多”我解释是localStorage有5MB容量限制而单条上报数据大约1-2KB50条大约100KB即使加上其他业务存储也完全安全而且在弱网场景下flush失败的概率可控。这个回答基本让面试官满意从这一步开始我明显感觉到这次面试不是走过场。2.2 微前端改造的“历史包袱”我的简历里写过微前端改造项目面试官问的第二个大方向就在这里“你们公司在做微前端改造的时候App和子应用的版本依赖是怎么管理的如果不同的子应用需要不同版本的React怎么处理”这个问题需要把主应用和子应用之间的依赖关系彻底理清才能答好。我当时的方案是子应用构建时把React和ReactDOM配置为externals由主框架统一加载和下发版本号相当于整个微前端架构只有一个运行时React实例子应用不再感知框架版本。面试官立刻追问“那如果其中一个子应用因为特殊原因必须用React 18的新特性而主框架用的还是React 17你们怎么处理“这里我承认当时有点卡壳。我最初的设计其实没有考虑这种灰度过渡期的情况。我当时临场回答是用qiankun提供的sandbox特性允许特定子应用加载自己的React副本其他子应用仍然走主框架的externals下发。面试官没有否定我的方案但追问了一句“你有没有考虑过这样做的成本比如首屏下载体积增加、多个React实例带来的事件污染问题”——这其实是在提醒我技术方案必须考虑代价不能只说收益。复盘这个问题时我意识到面试官想考察的不是你是否知道qiankun的API而是你对整个方案的利弊权衡是否清楚。如果当时我在回答基础上补上“这个方案我们只在过渡期使用长期走统一版本路线我们会建立升级小组推动主框架升级到18”整个回答的完整度会更高。2.3 简历里没有但一定会问的前端安全一面还有一个我完全没预料到的问题“你做过前端监控监控SDK在页面上是怎么注入的如果第三方脚本被劫持了怎么办”这是我简历上的空白点但面试官依然问到了大概率是考验知识面。我现场结合web安全的知识回答了SRISubresource Integrity的思路script标签加integrity属性用哈希值校验脚本完整性不匹配就不执行。监控SDK如果是自建的话还可以走可信CDN加内容安全策略CSP。随后面试官补充问了一下CSP这个点我详细讲了CSP的指令级别比如script-src、connect-src、report-uri这些核心配置。这个补充回答把面试官意料之外的追问也接住了。这一类题目提醒我准备滴滴这类大厂的前端面试不能只围绕简历项目打磨基础的web安全、浏览器原理也必须过一遍。3. 二面现场手写、场景设计题和三个“考基本功”的问题3.1 并发控制与前端大文件上传这道题值得重点复盘二面第一个手写题是“实现一个带并发数限制的异步调度器比如最多同时执行2个任务多余的任务排队等待。”这题在2026年的前端面试八股文里出现频率极高属于必须稳拿的基础题。我给了这样的实现class Scheduler { constructor(limit) { this.limit limit; this.queue []; this.running 0; } add(task) { return new Promise((resolve, reject) { this.queue.push({ task, resolve, reject }); this.run(); }); } run() { while (this.running this.limit this.queue.length) { const { task, resolve, reject } this.queue.shift(); this.running; task() .then(resolve, reject) .finally(() { this.running--; this.run(); }); } } }面试官看完说“可以”然后立刻升级难度“如果这个调度器要用于大文件上传分片上传过程中某一秒网络抖动导致一个分片失败你怎么设计重试策略重试会不会影响并发队列的公平性”这个追加场景题是我觉得二面含金量最高的部分。基于我在实际项目中使用worker上传大文件的经验我给出了这个思路分片失败单独维护一个retryQueue不阻塞后续分片的上传每个分片最多重试3次采用指数退避策略间隔为1s、2s、4s当retryQueue里有任务时优先从retryQueue取任务执行保证失败分片尽快恢复前端层面用localStorage或IndexedDB断点记录每个分片的上传状态页面刷新后可以从断点续传。面试官在这个问题上追问了“IndexedDB和localStorage的选择理由”我答了容量限制和异步API差异这部分我比较有把握整体回答流畅。从这道题可以明显看出滴滴前端面试对工程场景的考察不是那种“你知道html标签有哪些”的路子而是要求你面对真实业务问题时能快速组织出可用方案。3.2 水波纹进度条从需求到方案拆解二面还出了一道让人意外的设计题“页面需要做一个水波纹进度条水波要动起来进度到100%后要有一个完成状态变化你会怎么实现”这道题我当时第一反应是UI层面的问题但深入一聊发现考察的是CDN动画方案的性能、CSS与JS的配合方式、以及状态管理在动画过程中的角色。我的方案是主用CSS来实现配合Canvas只做水波动画层。具体来说进度数字和遮罩层用普通的DOMCSS transition水波纹本身用Canvas绘制画一条基于sin函数变形的水波线并通过requestAnimationFrame让相位随时间变化形成波浪感进度值由外部传入Canvas根据百分比计算水位高度这样性能和状态就解耦了到达100%时触发一个回调整个水波组件切换成完成状态的样式加一个简单的缩放或颜色渐变。面试官继续追问“如果这个进度条要放在低端安卓机上90Hz/60Hz屏幕的适配怎么做CSS的transition和requestAnimationFrame在这个场景下的选择逻辑是什么”我说了用will-change和transform代替top/left做位移动画来避免重排重绘以及把Canvas的像素比设为devicePixelRatio来保证清晰度。低端机降级方面会在低端机型上关闭水波动画只保留静态水位和百分比数字。实际上这个题在项目里还有一个很典型的变体——用纯CSS加SVG的clip-path或border-radius来模拟水波。但我个人经验是真正要“动起来好看”的水波纹Canvas的可控性和表现力都比纯CSS好得多CSS裁剪方案在波动的自然度上容易显得机械。3.3 虚拟列表和长列表性能一通百通的底层逻辑二面另一个手写题就是虚拟列表。面试官给了一张长列表页截图说“这是我们的订单列表可能几千条直接渲染卡顿你来说说你的优化方案”。我给出的方案是使用虚拟滚动只渲染可视区加上缓冲区的内容采用固定行高时用绝对定位计算偏移如果行高不固定则需要动态测量和估算。面试官追问了“动态行高的实现细节”这里我讲了ResizeObserver监控每一项的高度变化并维护一个高度数组来动态计算总高度和偏移这也是我之前实现过的方案。写代码的时候我呈现了一个简化版固定行高的虚拟列表核心代码function VirtualList({ items, rowHeight, visibleCount }) { const [scrollTop, setScrollTop] useState(0); const startIndex Math.floor(scrollTop / rowHeight); const endIndex Math.min(items.length, startIndex visibleCount 2); const visibleItems items.slice(startIndex, endIndex); return ( div style{{ overflowY: auto, height: visibleCount * rowHeight }} onScroll{(e) setScrollTop(e.currentTarget.scrollTop)} div style{{ height: items.length * rowHeight, position: relative }} {visibleItems.map((item, index) ( div key{item.id} style{{ position: absolute, top: (startIndex index) * rowHeight, height: rowHeight, }} {item.content} /div ))} /div /div ); }面试官比较满意又追加了一个问题“如果列表项里还有图片图片懒加载怎么和虚拟列表结合”我说了把图片的data-src放在自定义属性里在列表项进入可视区后换成真实src同时通过IntersectionObserver监听而不是在scroll事件里做判断这样能减少对滚动性能的影响。3.4 SSE替代轮询关于服务端推送的考察二面的最后一道代码题是关于SSE的面试官问“如果系统里有一个功能需要实时展示服务端推送的数据比如订单状态变化你会用WebSocket还是SSE为什么在有些场景下SSE更合适”我倾向于SSE的场景是单向推送数据流是从服务端到客户端而且天然支持断线重连EventSource规范自带reconnect。订单状态变化正好符合这个模式服务端只需单向推送状态更新给前端展示即可不需要双向通信用WebSocket反而更重。这里我可以分享一些我在服务端项目中实际用过的方案。SSE在服务端可以用原生Node实现也可以借助框架简化例如在Express中直接设置响应头。展示一个基于Node服务的简化实现代码router.get(/events, (req, res) { res.writeHead(200, { Content-Type: text/event-stream, Cache-Control: no-cache, Connection: keep-alive, }); const timer setInterval(() { res.write(data: ${JSON.stringify({ status: PENDING })}\n\n); }, 3000); req.on(close, () clearInterval(timer)); });面试官点头后又追问了“断线重连的机制和心跳包的实现”我解释了EventSource自带的last-event-id字段实现断点续传以及服务端需要定期发送注释行保持连接不超时。整体来说二面是压力最大的一轮题目都是直接从真实业务场景里抽出来的不会有那种背完八股就能过的题。4. 三面与终面从“你会用”到“你会设计”4.1 如果让你从零设计订单列表页三面的风格跟一二面差异很大不太考具体API或手写更多是开放式的架构设计题。面试官劈头就问“假设现在我们滴滴需要一个订单列表页服务端给你一个接口从0到1你会怎么设计说完整链路不是只写页面组件。”我回答时按这个链路展开需求分析核心场景、用户心智→ 技术选型框架选择、状态管理方案→ 接口设计数据格式约定、分页策略、错误码约定→ 渲染层设计虚拟列表、骨架屏、缓存策略→ 监控上报关键性能指标埋点→ 异常兜底错误重试、降级展示→ 发布与灰度方案。面试官每个环节都做了追问。比如在接口设计部分他问了“分页参数用页码还是游标cursor为什么很多C端场景用游标更好”我答了游标分页在数据实时变化时更稳定不会因新数据插入导致页码错位同时数据库层面用游标偏移查询性能更优。在渲染层部分他又追问“订单列表的每一项状态可能不同比如已完成、进行中、已取消不同类型的UI差异很大你怎么设计组件结构”我拆成了容器组件展示组件的结构不同类型只是展示组件的差异容器组件负责状态分拣和逻辑处理。整体就是组合模式这个回答他认可了。4.2 “大屏数据可视化部署”的技术判断力三面还问了一个开放题“如果我们做一个数据大屏要展示实时订单数据、城市热力图、司机分布图前端工程上你会怎么做这个项目要考虑到大屏硬件性能、数据刷新频率、长时间运行的稳定性。”这个问题跟热搜里“avue-data数据大屏前端是怎么部署的”有很强关联。我当时的回答框架是这样的项目结构上按业务模块拆分主包和功能包大屏项目不适合做超大单页应用否则加载体积和内存占用都不可控实时数据按需push用SSE或WebSocket做增量更新不做全量轮询Canvas和WebGL的图层要控制数量长时间运行必须考虑内存泄漏问题定时销毁不可见图层大屏字体做等比缩放适配不同分辨率用vw/vh配合rem的混合方案部署层面用静态资源走CDN接口层独立网关前端只负责渲染缓存策略要及时更新但又要防止缓存穿透导致每次启动都全量加载。面试官追问了“长时间运行的内存如何监控和预警”我说了用PerformanceObserver监控内存变化趋势同时设置定时器定期清理不用的WebGL纹理资源和Canvas画布数据。这个题答得比较像“有经验的人在说话”了因为都是实际项目里会遇到的坑。4.3 聊到职业规划与前端边界三面后半段面试官开始聊一些“软性”问题“前端技术迭代这么快你怎么保持自己的竞争力说说最近在关注的前端技术方向。”我说了三个方面一是AI辅助开发工具的实际使用比如codebuddy和cursor这些工具已经在改变前端开发的效率模式二是边缘计算和端侧AI对前端的可能影响三是跨端方案的发展包括小程序、Flutter Web和React Native这些不同方向的取舍认知。面试官对AI辅助开发这个话题明显有兴趣追问了一句“你日常开发里AI工具占比多少哪些环节你觉得AI还做不了”。我说了AI在生成页面模板、写CSS、处理重复性代码上效率很高但在复杂业务状态设计、异常情况边界梳理、以及对存量系统的改造决策上目前还无法替代人工判断。这个回答面试官比较认可因为不是那种“AI真厉害”的盲目乐观也不是“AI不行”的排斥态度。5. 滴滴面经里的隐藏考点前端稳定性和监控体系5.1 为什么滴滴如此看重前端监控和稳定性三轮技术面下来我有一个很强烈的感受滴滴面试中会反复出现“监控、兜底、异常处理、降级方案”这类话题。几乎每一轮的每个场景题都会有人在最后追问“出了问题你怎么发现、怎么处理”。这不是偶然而是由滴滴的业务形态决定的——出行是强时效性场景用户正在马路上等车这时候如果前端页面白屏或接口报错就不是“体验不好”的问题而是直接影响用户能不能打到车。前端稳定性的优先级在滴滴的研发文化里被提得很高。所以如果你准备投滴滴前端一定要有意识地准备一个完整的稳定性治理案例。面试官普遍认可的监控体系是全链路结构通常包括三个层级采集层页面加载性能、接口成功率、JS运行异常、用户行为链路通过SDK统一上报分析层对采集的数据做聚合分析比如从成功率、耗时分布、版本对比这些维度看问题预警层指标异动时触发告警告警要分级高危问题直接电话通知低危问题进微信群避免高噪音导致真正的线上事故被淹没。我在二面中被问到“监控平台你用的是自研还是第三方”这个问题我的回答是自研为主第三方兜底。原因也很现实第三方监控平台的采样率通常无法满足核心链路全量打点的需求而且数据出网存在合规风险但第三方在告警渠道和可视化上省事所以会作为一个辅助通道。5.2 一个完整的线上事故复盘思路面试官在监控话题中很自然地让我讲了一次线上事故的完整复盘。我跟面试官分享了我之前负责的系统里一次典型的线上问题这个事故我也建议每个面试者都提前准备一个类似的案例因为大厂面试基本都会问。我讲的事故背景是某次新版本发布后首页接口成功率从99.95%陡降到70%监控系统半小时内就触发了P1告警。整个排查过程是这样的第一步是快速定位影响面通过监控平台按版本号、机型、网络类型维度做了下钻发现异常集中在某款Android机型上第二步是看接口错误明细发现错误码是网络超时但后端服务本身负载正常所以问题大概率出在网络链路或前端请求逻辑上第三步查代码发现新版本里有一个“预加载下一页数据”的优化逻辑会同时发起多个图片请求和接口请求在低端机上触发了并发连接数限制导致核心请求被阻塞排队第四步是快速止血先通过配置中心把预加载逻辑关闭成功率立刻恢复随后通过灰度逐步开启优化版本在预加载逻辑里增加并发数上限控制限制在2个同时请求问题再未复现。面试官听完后追问了第三步里一个细节“你怎么判断是前端的问题而不是后端的问题”我说了用后端日志和前端埋点交叉验证的方法后端服务日志显示接口耗时正常而前端上报的core web vitals数据里”连接建立时间“异常高两者对比就能看出问题出在客户端侧的网络调度上。这个回答比较完整地展示了全链路排查的思路。5.3 前端性能优化的“体检清单”滴滴面试中性能优化相关的问题几乎是必考的。这里我整理一个我在面试中反复使用的高频清单都是实际项目里能落地的手段首屏加载代码分割路由级懒加载、骨架屏、关键CSS内联、静态资源CDN加速图片性能WebP格式优先、懒加载、响应式图片srcset、CSS雪碧图在小图标场景仍然有效渲染性能避免强制同步布局、批量DOM读写、使用CSS containment、合理使用虚拟列表缓存策略静态资源用hash命名实现强缓存接口数据用Service Worker做离线缓存网络优化HTTP/2多路复用、资源预连接preconnect、DNS预解析、接口请求合并。面试官在性能优化话题上经常会把问题落到“你实际做过哪个优化量化结果是什么”上。这里要提醒大家面试时一定要准备一两个带具体数据的优化案例比如“首屏从3.2秒优化到1.8秒优化了44%”或者“长列表滚动帧率从35fps提升到55fps”。只有量化数据才能证明你真的执行过而不是停留在概念层面。6. 复盘清单我踩过的坑和再战建议6.1 我这次面试踩到的三个坑这次面试整体结果还可以但过程中我有几个明显的失误复盘写在这里希望能帮后面面试的同学避开。第一个坑是简历上写了“熟悉性能优化”但面试官一追问“具体怎么发现性能瓶颈”时我一开始只说了用Chrome DevTools的Performance面板面试官继续问“Performance面板里重点看哪些指标怎么判断是脚本问题还是渲染问题”时我明显不够深入。正确做法是准备好一套系统的性能诊断流程先用Lighthouse跑整体得分再用Performance录制看主线程的Task分布分析是长任务还是布局抖动然后针对性优化。建议不要只写“熟悉”而是写“用Performance定位过长Task并借Web Worker拆分”这样的具体经历。第二个坑是手写题没有先梳理边界情况。写异步调度器的时候我一开始忘了处理“同一个任务被并发触发多次”的情况面试官指出了这个遗漏。虽然代码整体逻辑正确但这种“少了防御性处理”的瑕疵在手写题中是很扣印象分的。后来我养成了一个习惯拿到手写题先在注释里把入参、出参、边界条件写清楚再开始写代码这个习惯对面试帮助很大。第三个坑是对某些热门工具的覆盖不够。面试官有提到一个问题域是BPMN流程设计器的自定义节点这块我在面试前没有准备回答得比较浅。如果提前了解过bpmn.js相关生态答得会更从容。这提醒我即使岗位描述里没有写流程引擎做C端业务的大厂也可能问工作流场景知识面不能只盯在主流框架上。6.2 面试过程中的加分技巧除了踩坑我也总结了一些当时实际帮助我加分的技巧整理出来供参考答题前先跟面试官确认需求边界。比如虚拟列表那题我先问了“行高固定还是不固定”面试官反而对我这个追问有印象说明你是带着工程视角思考问题而不是拿到题直接写答原理题时用“先结论、后论证”的结构。比如问“为什么用微前端”先说结论“为了多团队独立发布、技术栈异构隔离”再展开每个结论背后的细节面试官不会迷失在你的长篇解释里设计题要主动给出取舍对比。比如大屏方案中我在“WebSocket vs SSE”之间做了对比自述为什么SSE更适合单向推送场景这种对比式的表述比直接给答案更能展示思考深度在合适的时候提一下自己对代码可维护性和可测试性的考虑。面试官非常吃这一套因为这说明你有生产级项目的经验意识而不是只会在demo里跑通功能。6.3 时间安排与备战策略我从开始投简历到三面结束整个备战周期大概是三周期间把大量精力放在技术深度上。分享一下我实际执行的备战方案不一定适合所有人但可以参考。第一周盘点自己的项目集。花两天时间把所有项目从背景、职责、技术方案、结果量化四个维度梳理成文档形成“项目叙事线”再用一天对照常见的2026前端面试题类别做自查筛选出薄弱项剩余时间集中补齐弱项——我当时的弱项是Web安全和服务端知识就针对性看了CSP、SRI、HTTPS握手过程和Node事件循环。第二周手写题专项练习。每天保持3到5道手写题的节奏重点覆盖异步控制、防抖节流、深拷贝、Promise实现、数组方法、虚拟滚动、数据响应式等高频题。练的时候不要只看别人的答案一定亲手写到IDE里跑一遍最好再追问自己“这个实现有什么边界情况没处理”。第三周模拟面试和表达训练。我把高频问题列了个清单找朋友当面试官按正式流程走了一遍重点练“听题后快速组织答案”的能力。这个环节很关键因为平时自己思考时逻辑是跳跃的但面试答题需要线性表达没有一定量的模拟训练很容易卡壳。6.4 面完之后再看这些知识点哪些才是重点整个流程走完后回头看滴滴前端面试的核心其实不是单个知识点本身而是把知识点放在真实业务场景里要求你做出设计与决策。从热搜词里的“前端面试八股文汇总”到“26年最新前端面试题”各种面经都在反复强调同一个趋势基础题比如事件循环、闭包、原型链依然会问但占分比在下降场景设计和工程方案型题目在快速增加。如果你还在海量刷八股文我会建议适当把重心转向“怎么用”和“为什么这样用”。比如你会写useEffect和useLayoutEffect的代码那能不能说清楚它们分别在什么场景下解决什么问题你会配置webpack的splitChunks那能不能解释为什么某些包应该单独拆出来、拆出来对缓存命中有什么影响这种从“能写”到“能讲清楚”的转变才是大厂面试真正筛选的东西。我在面试前还专门看了滴滴技术博客以及一些公开的前端工程化文章对业务场景的理解帮助很大。出行场景里“位置实时变化、网络环境不稳定、多端屏幕适配复杂”这些特殊性反映在技术选型和面试考察重点上就是稳定性优先于酷炫兜底能力优先于功能堆砌。理解了这一点面试准备方向就不会跑偏。6.5 一些零散的注意事项最后再补几条散装经验都是面试过程中真实应验过的面试过程共享屏幕写代码的时候先把编辑器字体调大保持代码缩进清晰面试官看得舒服也会影响对你的判断遇到不会的题千万别直接说“不会”尝试把问题拆成你熟悉的部分至少给出部分思路和探索方向面试官更看重面对未知问题时的处理方式而不是单纯的知识储备面试完当天就把题目复盘记录下来不要等几天后因为记忆会很快模糊后面再战或面其他公司都是宝贵的素材HR面被问到离职原因时别抱怨上家公司尽量从“技术成长”“业务方向不匹配”等中性原因切入这是HR面里最常见也最容易踩雷的问题。我的面经到这里基本就写完了。滴滴这场面试给我最大的收获不是拿到了offer的确定性而是逼着我把很多习以为常的工程方案重新做了一次完整的逻辑梳理——从“当时这么做了”到“为什么当时要这么做、还有没有更好的做法”。这种思考过程比任何一套八股文都值钱。如果你正在准备前端面试希望这篇面经能给你一些可复用的思路祝顺利。
