拼多多 前端 秋招面经,攒人品

拼多多 前端 秋招面经,攒人品
最新回答
酷到乏味

2026-03-15 05:45:15

拼多多前端秋招面经分享

一面流程与问题

自我介绍

需清晰阐述个人教育背景(学校、专业、学位等)、相关项目经历(项目名称、担任角色、技术栈、项目成果)、技能掌握情况(前端相关技术如 HTML、CSS、JavaScript 掌握程度,框架使用经验等)以及个人优势特点(如学习能力、团队协作能力等)。

对目标部门有什么要求吗
  • 回答思路:可从个人职业发展规划、技术兴趣方向、期望的工作内容等方面入手。例如,若对前端性能优化感兴趣,可表示希望进入负责核心业务性能优化的部门,能接触到大量用户流量和高并发场景,提升自己在性能优化方面的能力。
  • 示例:我希望进入一个注重技术创新和用户体验优化的部门。我对前端性能优化和交互设计有浓厚兴趣,期望能在部门中参与到核心业务的开发,通过不断优化代码和交互流程,提升产品的性能和用户满意度。
对拼多多有什么了解
  • 公司业务:拼多多是一家专注于 C2M 拼团购物的第三方社交电商平台,通过沟通分享形成的社交理念,形成了独特的新社交电商思维。其业务涵盖多个品类,以低价、拼团的模式吸引了大量用户,尤其在下沉市场具有强大的竞争力。
  • 公司文化:强调“本分、用户导向、结果导向、敢为极致、共同成长”的价值观。注重用户体验,以用户需求为出发点进行产品开发和优化;鼓励员工勇于尝试和创新,追求极致的工作成果。
  • 发展前景:在电商领域持续保持高速增长,不断拓展业务边界,如开展跨境电商业务等。同时,积极投入技术研发,提升平台的性能和智能化水平,为用户提供更好的购物体验。
作息能接受吗

拼多多工作节奏相对较快,可能会有一定的加班情况。回答时需表明自己能够理解并接受合理的工作强度和加班安排,同时强调自己注重工作效率,能够在规定时间内高质量完成任务。

  • 示例:我了解到拼多多工作节奏较快,但我相信合理的工作安排和高效的工作方式能够保证任务的顺利完成。我能够接受一定程度的加班,并且会注重工作效率,在保证工作质量的前提下,尽快完成各项任务。
美团实习使用的技术栈、负责的业务挑重点讲讲
  • 技术栈:详细介绍在美团实习期间使用的前端技术栈,如使用的框架(Vue、React 等)、构建工具(Webpack、Vite 等)、状态管理工具(Vuex、Redux 等)以及相关的测试工具和性能优化工具等。
  • 负责业务:阐述负责的具体业务模块,如用户界面开发、功能模块实现、与后端接口对接等。重点说明在业务开发过程中遇到的问题及解决方案,以及通过该项目所获得的技能提升和经验积累。
  • 示例:在美团实习期间,我主要使用了 Vue 框架进行前端开发,搭配 Webpack 进行项目构建,使用 Vuex 进行状态管理。我负责的是用户订单页面的开发,包括订单列表展示、订单详情查看、订单状态更新等功能。在开发过程中,遇到了订单数据量大导致页面加载缓慢的问题,通过采用虚拟滚动技术优化了页面性能,提高了用户体验。
你接受去写 flutter 吗

表明自己对新技术的学习态度和接受能力,若有过相关学习或实践经验可详细介绍。

  • 示例:我接受去写 flutter。我对新技术有强烈的学习兴趣和探索欲望,并且已经对 flutter 进行了一定的学习和实践。我了解 flutter 的跨平台开发优势,能够使用 Dart 语言进行开发,实现一套代码在多个平台上运行,提高开发效率。如果有机会参与 flutter 项目开发,我会积极投入,不断提升自己的技能水平。
讲讲 flutter、跨段技术
  • flutter:介绍 flutter 的特点,如跨平台性(一套代码可运行在 iOS 和 Android 等多个平台上)、高性能(使用自己的渲染引擎,不依赖原生控件)、丰富的组件库等。同时,可以提及 flutter 的开发流程和常用工具。
  • 跨段技术:除了 flutter,还可以介绍其他跨平台开发技术,如 React Native、Weex 等。对比它们与 flutter 的优缺点,如 React Native 使用 JavaScript 开发,社区资源丰富,但在性能方面可能不如 flutter;Weex 是阿里巴巴推出的跨平台解决方案,与 Vue 语法相似,但在生态和性能上也有一定的局限性。
vuex 原理、mutation、action 的区别
  • vuex 原理:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。其核心概念包括 State、Getters、Mutations、Actions 和 Modules。Vuex 通过 Store 对象来管理状态,组件可以通过 dispatch 方法触发 Action,Action 再通过 commit 方法触发 Mutation,Mutation 最终修改 State。
  • mutation 和 action 的区别

    同步与异步:Mutation 必须是同步函数,它直接修改 State;Action 可以包含任意异步操作,通过提交 Mutation 来间接修改 State。

    触发方式:组件中使用 this.$store.commit('mutationName') 触发 Mutation;使用 this.$store.dispatch('actionName') 触发 Action。

vue3 和 vue2 的区别
  • 组合式 API:Vue3 引入了组合式 API(Composition API),允许开发者根据逻辑关注点组织代码,而不是像 Vue2 那样按照选项(Options)组织代码,提高了代码的可复用性和可维护性。
  • 性能优化:Vue3 对虚拟 DOM 进行了优化,采用了更高效的编译方式,减少了不必要的更新,提高了渲染性能。同时,Vue3 的响应式系统也进行了改进,使用 Proxy 代替了 Object.defineProperty,能够更好地处理数组和对象的变化检测。
  • 其他改进:Vue3 还支持 Fragment(片段),允许组件有多个根节点;提供了 Teleport 组件,用于将组件渲染到 DOM 中的其他位置;改进了 TypeScript 支持,提供了更好的类型推断和类型检查。
nextTick 原理

在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。其原理是利用了 JavaScript 的事件循环机制,将回调函数放入一个异步队列中,等待当前同步任务执行完毕后,再按照顺序执行异步队列中的任务。在 Vue2 中,nextTick 默认使用微任务(Promise、MutationObserver 等),如果浏览器不支持微任务,则降级使用宏任务(setTimeout、setInterval 等);在 Vue3 中,优先使用 Promise,如果不支持则使用 MessageChannel,最后才使用 setTimeout。

开源贡献 element-plus 源码怎么组织的
  • 项目结构:Element Plus 的源码通常按照组件类型进行分类组织,例如有专门的 components 目录存放各个组件的代码,每个组件有自己的目录,包含组件的模板、样式和逻辑代码。同时,还有 utils 目录存放一些通用的工具函数,mixins 目录存放可复用的混入代码等。
  • 代码规范:遵循一定的代码规范和风格,如使用 ESLint 进行代码检查,保证代码的一致性和可读性。同时,采用模块化的开发方式,每个组件和工具函数都尽量保持独立,方便维护和扩展。
  • 开发流程:通常采用 Git 进行版本控制,通过分支管理进行功能开发和问题修复。在开发过程中,会编写详细的文档和测试用例,确保代码的质量和稳定性。
手撕代码
  • Vue Hook - 定时按钮:实现一个定时按钮,点击按钮后开始倒计时,倒计时结束后按钮恢复可点击状态。可以使用 Vue3 的组合式 API 来实现,利用 ref 或 reactive 来管理按钮的状态和倒计时时间,使用 setInterval 进行倒计时操作。
import { ref, onMounted, onBeforeUnmount } from 'vue';export default function useCountdownButton(initialTime = 10) { const time = ref(initialTime); const isDisabled = ref(false); let timer = null; const startCountdown = () => { if (isDisabled.value) return; isDisabled.value = true; timer = setInterval(() => { time.value--; if (time.value <= 0) { clearInterval(timer); isDisabled.value = false; time.value = initialTime; } }, 1000); }; onBeforeUnmount(() => { if (timer) clearInterval(timer); }); return { time, isDisabled, startCountdown };}
  • Promise.allSettled:实现一个类似 Promise.allSettled 的方法,该方法接收一个 Promise 数组作为参数,返回一个新的 Promise,当所有输入的 Promise 都完成(无论是成功还是失败)时,返回一个包含每个 Promise 结果的对象数组。
function promiseAllSettled(promises) { return new Promise((resolve) => { const results = []; let completedCount = 0; promises.forEach((promise, index) => { Promise.resolve(promise) .then( (value) => { results[index] = { status: 'fulfilled', value }; }, (reason) => { results[index] = { status: 'rejected', reason }; } ) .finally(() => { completedCount++; if (completedCount === promises.length) { resolve(results); } }); }); });}
  • LRU 缓存:实现一个 LRU(Least Recently Used)缓存算法,该算法根据数据的历史访问记录来进行淘汰数据,核心思想是如果数据最近被访问过,那么将来被访问的几率也更高。可以使用 Map 来存储缓存数据,同时维护一个双向链表来记录数据的访问顺序。
class LRUCache { constructor(capacity) { this.capacity = capacity; this.cache = new Map(); this.head = { key: null, value: null, prev: null, next: null }; this.tail = { key: null, value: null, prev: null, next: null }; this.head.next = this.tail; this.tail.prev = this.head; } get(key) { if (!this.cache.has(key)) { return -1; } const node = this.cache.get(key); this.moveToHead(node); return node.value; } put(key, value) { if (this.cache.has(key)) { const node = this.cache.get(key); node.value = value; this.moveToHead(node); } else { if (this.cache.size >= this.capacity) { const tailNode = this.tail.prev; this.removeNode(tailNode); this.cache.delete(tailNode.key); } const newNode = { key, value, prev: null, next: null }; this.addToHead(newNode); this.cache.set(key, newNode); } } addToHead(node) { node.prev = this.head; node.next = this.head.next; this.head.next.prev = node; this.head.next = node; } removeNode(node) { node.prev.next = node.next; node.next.prev = node.prev; } moveToHead(node) { this.removeNode(node); this.addToHead(node); }}反问环节

可以询问关于岗位的具体职责、团队的技术栈和发展方向、公司的培训和学习机会、项目的业务规划等问题,以更好地了解公司和岗位情况,同时也展示自己对工作的积极态度和求知欲。