├── .vscode └── settings.json ├── src └── leave.md ├── LICENSE ├── .github └── workflows │ └── blank.yml ├── 2022-04-06-pm.md ├── README.md ├── 2022-06-15.md ├── 2022-06-13.md ├── 2022-06-21.md ├── 2022-03-31.md ├── 2022-04-06-am.md ├── 2022-07-01.md ├── 2022-07-06.md └── 2022-03-29.md /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "cSpell.words": [ 3 | "csdn", 4 | "echarts", 5 | "emmm", 6 | "emmmm", 7 | "gitee", 8 | "instanceof", 9 | "mork", 10 | "pinia", 11 | "pnpm", 12 | "swiper", 13 | "tian", 14 | "vant", 15 | "vuex" 16 | ] 17 | } -------------------------------------------------------------------------------- /src/leave.md: -------------------------------------------------------------------------------- 1 | # 离职原因 2 | 3 | ## 真实原因的裁员 4 | 5 | 我们公司最近我负责的业务被砍了,领导安排我转岗到其他业务线,但是对于我的个人职业规划不相符,我更希望在这个岗位,所以跳出来看看机会。 6 | 7 | ## 真实原因是工资太低 8 | 9 | 最近几年我的业务能力已经得到了显著提升,领导对我也很认可但是工作的薪资涨幅非常有限,我希望自己能够得到更好的发展,所以跳出来找机会。 10 | 11 | ## 真实原因是没有价值感的学不到东西 12 | 13 | 公司所负责工作内容更偏向于重复性的工作,无法满足我个人职业发展需求。我还这么年轻,希望找到一个更有成长空间的工作,所以决定尝试其他工作机会。 14 | 15 | ## 真实原因是无法晋升 16 | 17 | 我在公司曾经负责过多个大型项目,积累了宝贵的经验,完全可以承担更大的职责。但 是前公司,整体偏传统,晋升更看重一个人的资历,而不是个人能力,我更希望得到更大平台去发挥自己的才能。 18 | 19 | ## 真实原因是加班严重,强制加班 20 | 21 | 我自己的工作效率比较高,总是可以高效高质量完成工作,但是贵公司,安排不太合理,会定期统计各部门的加班时长,并以此统计,并且要考核,我希望进入到一家更人性化管理的公司。 22 | 23 | ## 真实原因是分工不合理,工作效 24 | 25 | 前公司在岗位分工上做得,不太合理,导致扯皮、推诿现象比较严重,大量的时间浪费在无意义的沟通上面,大家整体的效率都被拉低。所以我想换一个平台,把更多的精力放到高效工作上,而不是无意义的沟通上。 26 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Tyh2001 (田同学) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.github/workflows/blank.yml: -------------------------------------------------------------------------------- 1 | # This is a basic workflow to help you get started with Actions 2 | 3 | name: CI 4 | 5 | # Controls when the workflow will run 6 | on: 7 | # Triggers the workflow on push or pull request events but only for the master branch 8 | push: 9 | branches: [ master ] 10 | pull_request: 11 | branches: [ master ] 12 | 13 | # Allows you to run this workflow manually from the Actions tab 14 | workflow_dispatch: 15 | 16 | # A workflow run is made up of one or more jobs that can run sequentially or in parallel 17 | jobs: 18 | # This workflow contains a single job called "build" 19 | build: 20 | # The type of runner that the job will run on 21 | runs-on: ubuntu-latest 22 | 23 | # Steps represent a sequence of tasks that will be executed as part of the job 24 | steps: 25 | # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it 26 | - uses: actions/checkout@v3 27 | 28 | # Runs a single command using the runners shell 29 | - name: Run a one-line script 30 | run: echo Hello, world! 31 | 32 | # Runs a set of commands using the runners shell 33 | - name: Run a multi-line script 34 | run: | 35 | echo Add other actions to build, 36 | echo test, and deploy your project. 37 | -------------------------------------------------------------------------------- /2022-04-06-pm.md: -------------------------------------------------------------------------------- 1 | # 2022-04-06 面试下午场复盘 2 | 3 | > 杭州 道晟科技 4 | 5 | ## 技术面 6 | 7 | 我:(自我介绍) 8 | 9 | 面:你的做过的项目介绍一下。 10 | 11 | 我:(略……) 12 | 13 | 面:你主要参与什么东西呢? 14 | 15 | 我:(略……) 16 | 17 | 面:你这个写的全栈的花旗银行的投票项目,业务是不是很简单的? 18 | 19 | 我:对。 20 | 21 | 面:上一家公司的薪资是 xx,离职原因是无提升。现在期望的是 16,为什么会有这么大的变化。 22 | 23 | 我:之前做的比较简单,只有一些 h5 的页面点击弹出之类的效果,对技术没用什么提升。 24 | 25 | 面:那么你认为你为什么值 16k 了呢? 26 | 27 | 我:我感觉我技术可以啊。 28 | 29 | 面:那么你的技术也需要你的项目才能体现出来的。首先来说,你现在是达不到 16k 的,你做的都太简单了,这个项目参与比较浅,不管你是全栈还是什么。首先来说投票的项目可以直接在外面买都可以,而且有些都是可以直接免费使用的。投票的几个端进行投票? 30 | 31 | 我:只是手机端。 32 | 33 | 面:那么我认为这东西更加简单了。从业务角度来说是没什么技术难度了。你会使用 uni-app 吗? 34 | 35 | 我:我不写小程序。 36 | 37 | 面:只做 h5? 38 | 39 | 我:只做 web 端。 40 | 41 | 面:那么你觉得现在的市场,还是 web 端做的多吗? 42 | 43 | 我:但是 web 端也很多啊。 44 | 45 | 面:web 端多是多。但是现在市场的趋势你知道吗? 46 | 47 | 我:小程序也很多啊。 48 | 49 | 面:现在前端的趋势都是往移动端去做。我们公司有两条路线可以走,一种是走全栈式的,我说的全栈是 uni-app、h5、vue 包括各种框架都要懂。为什么要这样做呢?可能我们有些项目比较老旧,当时还没用 vue,这是一条方向。还有一条就是数组蓝深,就是元宇宙的一种形态,我们会做一些可视化的东西。我们可能会给用户更多的可视化的东西,比如这一幢大楼,上面有多少住户,哪里有监控,只要想看的东西就可以直接手动点击去看,还可以去控制路灯等的重启方向。现在前端就这两个方向,一个就是传统的 web 端,还有一个就是可视化的东西。还有什么想问的吗? 50 | 51 | 我:现在公司使用的是 vue2 还是 vue3 呢? 52 | 53 | 面:两个都有用,最后肯定都是往最好的用。我们对于技术这一块,并不是去追求最新的技术,你也了解,任何一个技术都是有一个成长期的,可能你说的 vue3,可也许还是在一个成长期,它并不一定兼容达到 vue2 那么稳定。对于公司来说,可能是用最稳定的,比如我使用 vue3,这个框架有些问题我解决不了的时候,肯定是高级人员才能解决的时候,那么这个成本肯定是是不消的,对吧?但是用的我们都在用,具体取决于这个项目的发展方向,比如 vue3 更加的适配物联网的东西,那么我肯定会去使用,你 vue2 不能实现一些物联网的控制。比如一些小型的项目,vue2 就已经搞定了。技术上来说并不是说谁有优势谁没有优势。 54 | 55 | 结束。 56 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Interview-record 2 | 3 | ## 🌟 关于 4 | 5 | 我的面试记录,在这里复盘一下,分享给大家,祝大家都可以拿到心仪的 offer~ 6 | 7 | 我的在线简历:[tian-classmate](https://github.com/Tyh2001/tian-classmate) 8 | 9 | ## 😏 自我介绍 10 | 11 | 您好,我叫 xxx,今年 xx 岁,毕业于 xxx。我擅长使用 vue 开发,擅长组件封转。是开源组件库 [Fighting Design](https://github.com/FightingDesign/fighting-design) 的作者,目前正在带领一群社区小伙伴做开源项目,希望有机会来贵公司任职,谢谢。 12 | 13 | ## 🌈 列表 14 | 15 | **2022 年 3 月份面试** 16 | 17 | - [2022-03-29](https://github.com/Tyh2001/Interview-record/blob/master/2022-03-29.md) 18 | - [2022-03-31](https://github.com/Tyh2001/Interview-record/blob/master/2022-03-31.md) 19 | - [2022-04-06-am](https://github.com/Tyh2001/Interview-record/blob/master/2022-04-06-am.md) 20 | - [2022-04-06-pm](https://github.com/Tyh2001/Interview-record/blob/master/2022-04-06-pm.md) 21 | 22 | **2022 年 6 月份面试** 23 | 24 | - [2022-06-13](https://github.com/Tyh2001/Interview-record/blob/master/2022-06-13.md) 25 | - [2022-06-15](https://github.com/Tyh2001/Interview-record/blob/master/2022-06-15.md) 26 | - [2022-06-21](https://github.com/Tyh2001/Interview-record/blob/master/2022-06-21.md) 27 | 28 | **2022 年 7 月份面试** 29 | 30 | - [2022-07-01](https://github.com/Tyh2001/Interview-record/blob/master/2022-07-01.md) 31 | - [2022-07-06](https://github.com/Tyh2001/Interview-record/blob/master/2022-07-06.md) 32 | 33 | ## 💣 常被问到的 34 | 35 | 技术方面 36 | 37 | - vue 的组件通信方式? 38 | - v-if 和 v-show 的区别? 39 | 40 | 其他方面 41 | 42 | - 你为什么从上一家公司离职? 43 | - 你工作中遇到的最大的困难是什么? 44 | 45 | ## 🚥 反问面试官的问题 46 | 47 | - 您为什么会选择这家公司? 48 | - 这个岗位的挑战和机会是什么? 49 | - 您感觉我还有什么需要提升的? 50 | - 您平时都是如何获取前端最新资讯的呢? 51 | - 您是如何学习新技术的呢? 52 | 53 | ## 🎢 贡献 54 | 55 | 各位也可以将自己面试作为复盘,在这里提交 `PR` ,比如问了你什么问题,你是怎么回答的,哪里回答的不好,大家一起共同进步~ 56 | 57 | ## ⚙️ 痛点 58 | 59 | - vue 响应式原理是什么? 60 | - 讲一下三次握手和四次挥手 61 | - https 和 http 有什么区别呢? 62 | 63 | ## 离职原因 64 | 65 | [leave](https://github.com/Tyh2001/Interview-record/blob/master/src/leave.md) 66 | -------------------------------------------------------------------------------- /2022-06-15.md: -------------------------------------------------------------------------------- 1 | # 2022-06-13 面试复盘 2 | 3 | ## 技术面 4 | 5 | 我:自我介绍 6 | 7 | 面:讲一下 vue3 的 setup 8 | 9 | 面:如何给自组件的子组件传递值? 10 | 11 | 面:自组件如何使用 Provide / Inject 给父组件发送数据? 12 | 13 | 面:vue3 中如何使用的 vue-router? 14 | 15 | 面:你的组件库都做了哪些组件? 16 | 17 | 面:讲一下怎么封装 axios 吧 18 | 19 | 面:请求拦截器和响应拦截器的使用场景都是什么? 20 | 21 | 面:ts 如何定义一个接口? 22 | 23 | 面:3D js 有没有了解过? 24 | 25 | 我:3D 方法没了解过 26 | 27 | ## 产品面 28 | 29 | 面:你上一家公司的离职原因是什么? 30 | 31 | 我:上一家公司资金出了问题,改变了政策,相当于是裁员吧 32 | 33 | 面:平时你开发是独立开发吗? 34 | 35 | 我:是的 36 | 37 | 面:那你如果出现联合开发的话,你是如何解决代码冲突的问题呢? 38 | 39 | 我:基本上都是代码使用 github 或者 gitlab 来管理的嘛,都是规定哪个人就负责哪个模块,就不要去改动其他人的模块,在开发前一定要拉取最新的代码,因为我也在社区中带领一些开发者去开发,也会涉及到这种问题。如果要是有冲突的话,我就直接手动解决一下,反正冲突也不会很多 40 | 41 | 面:你写的这个 vscode 主题插件可以直接下载到吗? 42 | 43 | 我:可以啊 44 | 45 | 面:已经发布了是吗? 46 | 47 | 我:对啊,我用的就说我自己的插件 48 | 49 | 面:你介绍一下你的插件吧 50 | 51 | 我:颜色主题在市场上有很多,我在使用的时候感觉不是很舒服,然后我就找到了下载到本地的文件,就看了看源码,大概了解了它是如何实现的,就手动改了一些主题的颜色,但是整体还是不舒服,后来就在 vscode 的官方文档中找到了开发指南,就自己开发了一套,然后在微软官网发布的。 52 | 53 | 面:平时会写一些博客是吗? 54 | 55 | 我:会的,使用 vitepress 写了博客,也会在掘金上发一发文章,还会在自己的群里分享一些技巧 56 | 57 | 面:你现在的 Fighting Design 组件库是用来做什么的? 58 | 59 | 我:我也希望它可以像社区中很多组件库那样,可以让大家运用到项目中去。比如在其他组件库中,不能满足某些业务场景的时候,你可以提出这个需求,我们就可以进行开发功能 60 | 61 | 面:vue 提供的组件还是很丰富的,你的组件库有什么比它们好的地方? 62 | 63 | 我:可能现在还是以学习为主吧。毕竟有很多人还是想参与到开源项目中来,但是如果参与哪些大型的组件库,想去提个 PR 也不知道如何去上手,我正好这里有一个刚刚起步的项目,我可以带领你一起写,可以给你一些技术支持等,包括如何去提交 PR,如何去做 RFC 等 64 | 65 | 面:对于 css 的布局你有没有什么心得?包括一些难调的样式 66 | 67 | 我:css 方面倒是没用遇到过特别难调的地方,大多数都是一些业务项目 68 | 69 | 面:小程序有做过吗? 70 | 71 | 我:这个没实际做过,但是我自己学习过原生开发 72 | 73 | 面:我应该没什么问题了,你有什么要问我的吗? 74 | 75 | ## 提问环节 76 | 77 | 我:咱们公司主要技术栈都用什么呢? 78 | 79 | 面:主要都是 vue,vue3 等,还有一些移动端 80 | 81 | 我:如果有幸需要加入咱们公司,我需要先学习一些什么才能更快上手工作呢? 82 | 83 | 面:主要就是 vue3,你 vue3 熟练的话,没啥问题,因为现在项目很急,压力比较大 84 | 85 | 我:都是咱们自研的产品是吗? 86 | 87 | 面:是的,都是自研的,因为项目很急,我看你最快到岗时间是 10 天后,这个确实的有点晚哈,不过咱们双向选择嘛,然后我看你的薪资写的是 15K,这个还需要和行政去确认一下 88 | 89 | 我:你感觉我还有什么需要提升的吗? 90 | 91 | 面:因为我现在不是主要做前端的,刚才那位是的,待会完事儿之后我们一起聊一聊吧,你目前需要的提升的,我没感觉有什么。看你写的开源库,我感觉很厉害,是个很好的习惯,我一会也会去看看这些,因为我以前也比较感兴趣这方面,但是后来人懒,不想写了 92 | 93 | 我:那么如果您在 github 上看到一些感兴趣的项目,您会去 fork 一下,提个 PR 吗? 94 | 95 | 面:我提过,但是没有被通过,后面就是自己写一些博客,就不写去写这的,其实我感觉你这个开源贡献还是很好的,比较开源都是程序员自己建设的 96 | 97 | 我:对啊,包括 vue 也是这样的 98 | 99 | 我:咱们的代码规范有没用有一个标准呢? 100 | 101 | 面:现在只是一些简单的规范,后面可能会进一步的规范。如果有幸一起共事,你比较了解规范这些,你可以来制定一下这些规范 102 | 103 | 我:好的,了解 104 | 105 | 面:那么你还有问题吗? 106 | 107 | 我:没用了,我都了解了 108 | 109 | 面:接下来我和行政那边聊一下,稍后人事会联系到你 110 | 111 | 我:好的,大概多久呢? 112 | 113 | 面:今天下班前应该就可以的 114 | 115 | 我:好的 116 | 117 | 面:因为我们现在项目真的比较敢,我们现在也都在加班,但是不是无偿加班,这个先和你说清楚 118 | 119 | 我:好的,了解 120 | 121 | 面:那么今天我们就聊到这 122 | 123 | 我:好的 124 | 125 | 结束 126 | -------------------------------------------------------------------------------- /2022-06-13.md: -------------------------------------------------------------------------------- 1 | # 2022-06-13 面试复盘 2 | 3 | ## 面试环节 4 | 5 | 面:你先自我介绍一下吧 6 | 7 | 面:说一下 css 水平垂直居中的方法 8 | 9 | 我:可以通过 定位来实现给里面的容器设置上下左右边距为 0,绝对定位,然后 margin auto。还可以通过 flex 实现, display: flex; justify-content: center; align-items: center; 10 | 11 | 面:常用的太行盒子有哪些? 12 | 13 | 面:在一个盒子里面有四个元素,是水平居中的,我想吧第二个 div 排到第一个 div 前面去,如何去做? 14 | 15 | 面:有一个 div,里面有一段文本,这个文本不一定有多长,然后给 div 设置了单行省略号的样式,有些功能我需要检测这个盒子是否有省略号,比如有些地方需要有省略号弹个窗,没用的话就不弹窗,这个怎么做? 16 | 17 | 我:根据字符串的长度来判断? 18 | 19 | 面:但是 div 的宽度不确定 20 | 21 | 我:可以根据文字大小吧,然后…… 22 | 23 | 面:其实没有那么麻烦,只是判断 div 就行了。 24 | 25 | 面:那你说一下常用的 es6 有什么吧 26 | 27 | 面:let const var 的区别是什么? 28 | 29 | 面:使用 let 声明一个变量 a,可以使用 window.a 访问吗? 30 | 31 | 面:我使用 const 定义了一个数组,可以往数组里面添加元素吗? 32 | 33 | 我:可以的 34 | 35 | 面:为什么可以? 36 | 37 | 我:因为这个变量是对这个数组的引用,可以进行更改内部的 38 | 39 | 面:箭头函数和普通函数的区别? 40 | 41 | 面:常用的 promise 的方法有什么? 42 | 43 | 面:什么场景使用 Promise.all 方法? 44 | 45 | 面:Promise.all 的实现原理是什么? 46 | 47 | 面:async 函数如何捕获错误 48 | 49 | 我:使用 try catch 50 | 51 | 面:async 函数的返回值是什么? 52 | 53 | 面:set 和 map 的区别是什么? 54 | 55 | 面:vue3 和 vue2 有哪些区别? 56 | 57 | 面:为什么 vite 启动速度会很快呢? 58 | 59 | 面:vite 的核心启动原理你了解吗? 60 | 61 | 面:vue 的生命周期有哪些? 62 | 63 | 面:拿到页面中的 dom 元素是在哪个生命周期中? 64 | 65 | 面:说一下组件传值的方式吧 66 | 67 | 面:自组建接收父组件传递过来的值都可以使用什么 API 接收到? 68 | 69 | 我:基本上都是使用 props 接收的 70 | 71 | 面:如果有些没有使用 props 接收,那么如何接收? 72 | 73 | 面:$attrs 有了解吗? 74 | 75 | 面:你组件库的 [Tree-Shaking(vite 文档)](https://vitejs.dev/guide/ssr.html#source-structure) 是如何做的? 76 | 77 | 我:这个还没有做 78 | 79 | 面:如何使用 ts 定义树组件的类型? 80 | 81 | 面:ts 内置的一些工具类型都有什么? 82 | 83 | 面:枚举都使用在哪些场景呢? 84 | 85 | 面:axios 你是怎么在项目中使用的? 86 | 87 | 面:拦截器有没有写多个的?比如写一个是不够的。如果我写了多个拦截器,那么它的执行顺序是怎么样的? 88 | 89 | 面:你是如何做性能优化的? 90 | 91 | 面:vue 响应式实现原理是什么? 92 | 93 | 面:有没有了解里面有一个负责渲染和更新的 watch 的类?这个有没有了解过? 94 | 95 | 面:vue 的更新是一个什么级别的更新?更新的范围是什么? 96 | 97 | 我:只更新你修改的 dom,并不是全部都更新 98 | 99 | 面:那么如何判断更新这个修改的 dom? 100 | 101 | 我:是通过一些 diff 算法来实现的 102 | 103 | 面:具体的原理是如何实现的? 104 | 105 | 我:我不太了解 106 | 107 | 面:你的函数工具库都有什么功能的函数? 108 | 109 | 面;防抖和节流的区别是什么? 110 | 111 | 面:你是如何解决跨域问题的? 112 | 113 | 面:有没有遇到过 option 请求的? 114 | 115 | 我:没用 116 | 117 | 面:http 状态码常用的都是有哪些? 118 | 119 | 面:401 和 403 有什么区别? 120 | 121 | 面:301 和 302 有什么区别? 122 | 123 | 面:keep-alive 是怎么使用的? 124 | 125 | 面:keep-alive 的参数都有什么? 126 | 127 | 面:我给组件设置 name 有什么用? 128 | 129 | 面:树型组件如何实现? 130 | 131 | 我:使用递归组件 132 | 133 | 面:递归和 name 有什么联系吗? 134 | 135 | 我:递归组件必须有 name 否则不能递归 136 | 137 | 面:sass 你都使用过什么语法? 138 | 139 | 面:你是 switch 组件是如何实现的? 140 | 141 | 面:说一说你对事件循环的了解吧 142 | 143 | 面:你有什么想要问的呢? 144 | 145 | ## 提问环节 146 | 147 | 我:咱们工作中最大的挑战是什么呢? 148 | 149 | 面:因为我们有一些老项目,需要进行重构,我感觉还是比较有挑战的。然后业务功能其实还是没那么复杂的。 150 | 151 | 我:平时的代码规范是什么样的? 152 | 153 | 面:基本上大家都是配置了相同的 eslint 格式都是比较规范的,但是没有一个明文的规范 154 | 155 | 我:你感觉我还有什么需要提升的吗? 156 | 157 | 面:还是基础为主吧,我大致看了一下你的组件库,可能功能还是比较简单的,不过也没事,比较刚开始嘛,不过这个出发点是不错的,我还在 B 站上看到过你,我也经常逛 B 站 158 | 159 | 我:如果你在 Github 上看到这个项目,你有兴趣去参与一下或者去提个 PR 吗? 160 | 161 | 面:我目前为止是不会的,哈哈,一个是时间的问题,还有就这个整体的思路需要想好久,如果想要实现一个大型的组件库,工作量还是很大的 162 | 163 | 我:您为什么会选择这一家公司呢? 164 | 165 | 面:哈哈哈,因为公司招人 166 | 167 | 我:平时加班情况怎么样? 168 | 169 | 面:平时加班倒是不多,除非项目很急的情况下,可能需要加班 170 | 171 | 我:那我都了解了 172 | 173 | 结束。 174 | -------------------------------------------------------------------------------- /2022-06-21.md: -------------------------------------------------------------------------------- 1 | # 2022-06-21 面试复盘 2 | 3 | ## 技术面 4 | 5 | 面:你先自我介绍一下吧 6 | 7 | 我:…… 8 | 9 | 面:你能说一下的项目吗?你说一下的的开源项目吧 10 | 11 | 我:平时我看社区中有很多组件库的项目,然后社区中有很多人也想参与进来,但是哪些组件库大多数都已经成型了,可能很多人不知道从何下手,我就发起了这样的一个项目,带领他们一起参与进来 12 | 13 | 面:你在这个过程中有没有遇到什么问题呢? 14 | 15 | 我:遇到了打包的问题。开始的时候我也不确定使用什么打包,技术也没用确定,有很多人推荐我使用 rollup 打包,当时就说看了看文档,自己学习了一些配置,打包之后再项目中引入也可以正常使用,但是这项目再打包的时候,使用了我的组件库之后,再打包就会报各种类型的错误。因为类型没用打包,后来就弃用了 rollup 打包,改为了 vite 打包。然后配置好了就 ok 了 16 | 17 | 面:因为我不太了解 rollup,它不能配合 ts 打包类型吗? 18 | 19 | 我:可以的,因为 vite 大多数都已经在内部集成好了,rollup 的话就各种的东西都需要配置插件 20 | 21 | 面:社区比较活跃,我也稍微看了一下你的组件,但是大部分我看都是一些简单的组件,有没有打算去做一些比较负载的组件?有没有计划? 22 | 23 | 我:有计划,未来会做一些树形组件,还有表单 24 | 25 | 面:树有开始了吗? 26 | 27 | 我:现在正在发起 RFC 讨论中,我在出设计稿 28 | 29 | 面:可以的。你这个工具库也看了一下,那我问你一些基础吧。 30 | 31 | 我:好 32 | 33 | 面:我看你都是使用 vue3 进行开发,vue2 有用过吗? 34 | 35 | 我:有的 36 | 37 | 面:那么 vue3 和 vue2 的差别有什么呢? 38 | 39 | 我:在模板层面的话,vue2 只要一个根节点,vue3 可以有多个根节点,在 js 方面,vue3 新增了 setup 语法,各种的生命周期和函数都需要引入使用,比如 ref、computed,还有声明周期前面都加了 on 40 | 41 | 面:那么底层方面呢? 42 | 43 | 我:底层方面响应式做了优化,vue2 使用的是 Object.defineProperty,vue3 改用了 es6 新增的 proxy 44 | 45 | 面:它们有没有差异? 46 | 47 | 我:Object.defineProperty 只能监视到对象中其中一个属性的变化然后执行,proxy 是对象中任何一个属性发生变化它都可执行 48 | 49 | 面:你有了解过虚拟 dom 吗? 50 | 51 | 我:了解,他就是通过 js 对象和数组嵌套的那种方式,遍历这棵树,通过原生的方式渲染 52 | 53 | 面:那么它的 Diff 算法了解吗? 54 | 55 | 我:diff 算法不了解 56 | 57 | 面:我看你的 Github 上说,基础的东西都是不变的,有数据结构、算法,这方面的,你对这方面有什么见解吗? 58 | 59 | 我:之前了解过一些简单的算法,还有设计模式 60 | 61 | 面:设计模式可以讲一讲吗? 62 | 63 | 我:设计模式比如讲一个单例模式。比如新建一个类的时候,那么每次 new 这个类的时候,它都需要重新创建一个,那么可以将这个返回值直接保存到这个类里面,那么只需要新建一次,那么每次都可以返回这个保存的变量 64 | 65 | 面:算法呢? 66 | 67 | 我:算法上了解不是很多,在 leetcode 上刷过几道题,了解过二分查找之类的 68 | 69 | 面:二分查找就是排序查找是吧?有没用了解和树相关的算法? 70 | 71 | 我:这个没有 72 | 73 | 面:那么浏览器方面呢?比如说它的渲染方面,重绘和回流啊 74 | 75 | 我:这个不是很了解 76 | 77 | 面:那么一些网络基础呢?http 之类的? 78 | 79 | 我:这个了解过一些,比如正常情况下,购买了服务器,购买域名,默认是 http 协议,那么需要配置 ssl 证书,才能变成 https 80 | 81 | 面:ssl 这一层是如何实现了了解吗? 82 | 83 | 我:这个不是很了解 84 | 85 | 面:typescript 我看你也在使用嘛,ts 类型系统有什么自己的理解嘛? 86 | 87 | 我:我的组件库也都是使用 ts,因为现在 ts 写的也比较多,所以现在也不是很喜欢看 js 代码了,因为一个函数,它的参数是什么类型,返回值是什么类型,就可以一目了然了。在我的组件库也规定了,一个函数的参数,还有返回值,就算类型系统推断出来了,但是你也要标准它的类型,而且不允许出现 any 88 | 89 | 面:有没有重构函数的类型?把函数的类型重构 90 | 91 | 我:这个没用唉 92 | 93 | 面:我想一下啊。比如 vue 的 h 函数,它不是可以通过传递进去的一个类型不一样,比如传递一个字符串,生成的就是一个字符串的 dom,那么传递的一个 VNode,那么就是一个组件 94 | 95 | 我:这个没用做 96 | 97 | 面:你写函数库的时候没有遇到吗?比如写一些类型的不同,来做一些不同的返回 98 | 99 | 我:这个倒是没有,基本上都是固定的,要么使用联合类型 100 | 101 | 面:vite 的配置,编译阶段的配置有没有了解过?比如分包啊,或者说是 cdn 的上传啊 102 | 103 | 我:emmm,我的分包啊,不知道咱俩理解的一样不一样啊,比如组件打包,和样式打包是不同的配置 104 | 105 | 面:哦~就是组件和样式打包是分离的是吧? 106 | 107 | 我:是的 108 | 109 | 面:这也是一种,但是比如一些比较大的组件,打包的体积很大,它内部可能用一些其他的库啊,这个组件打包处来可能会两兆,可能就不太适合在 web 端使用了,这种大型的组件如何打包有了解吗? 110 | 111 | 我:是将它拆分成多个组件吗? 112 | 113 | 面:是将它拆分成多个 js 文件 114 | 115 | 我:这个没有唉 116 | 117 | 面:这个超真云,是自己做的项目吗? 118 | 119 | 我:是上一家公司自研的产品 120 | 121 | 面:你这个性能优化,是指的是哪方面的性能优化? 122 | 123 | 我:使用浏览器有内置的灯塔工具 124 | 125 | 面:那么你有没有了解 SEO 优化?性能优化也涵盖了 SEO 的方面啊 126 | 127 | 我:SEO 只做了一些简单的,通过 mate 标签来做,还有一些,比如一个最简单的,图片标签都写一写 alt 属性 128 | 129 | 面:哦~那么我都大概了解了,你有什么技术方面的问题想要问我的吗? 130 | 131 | 我:我想问一下,您平时都是如何学习新的技术的呢? 132 | 133 | 面:我可能更多的是读书吧。现在比如…… 134 | 135 | 我:《vue.js 设计与实现》吗? 136 | 137 | 面:不不不,都是想一些算法相关的,计算机网络相关的,还有比如《算法导论》,还有小红书,就是没有 es6 的那一版,我建议是第三版,因为第三版我感觉还是很不错的 138 | 139 | 我:哦哦,那个我看的是第四版。那么您在平时写代码的时候,遇到问题都是如何解决的呢?都是使用什么方式解决的呢? 140 | 141 | 面:主要还是面向谷歌编程吧,大部分的问题都在谷歌可以找到,可能更深入的问题,可能就是你需要去看源码喽 142 | 143 | 我:那比如产品给到一个需求,那么这个需求你感觉不太好实现,或者技术难度比较高,这种你是如何处理的呢? 144 | 145 | 面:这个一般来说要结合给我们的周期嘛,比如实现难度比较困难,但是给我们的事件够的话,我也可以去尝试去实现的,比如我们现在有一个 3D 可视化的项目,之前根本没有接触过这方面,那么一开始也是拒绝嘛,但是给我们的时间还是比较充足的,所以就去阅读了一些文档,这样子,那么如果时间不够的话,可能是会拒绝嘛 146 | 147 | 我:最后一个问题就是,您觉得我还有什么需要提升的吗? 148 | 149 | 面:可能就是基础方面吧,比如 vue,可以去阅读一下它的源码,现在 github 上有一个开源的项目,可以看一下 150 | 151 | 我:mini-vue 吗? 152 | 153 | 面:可以看一下那个 vue3 的源码 154 | 155 | 我:那个群我也加了,只是没有买课程 156 | 157 | 面:买课程就没有必要了,可以先看看项目源码 158 | 159 | 我:我也简单的看了下 160 | 161 | 面:还有其他的吗? 162 | 163 | 我:没有了 164 | 165 | ## 产品面 166 | 167 | 面:你可以将一下你最近的工作情况吗?公司工作的内容吗? 168 | 169 | 我:…… 170 | 171 | 面:你最近一家的前端团队的成员是如何分布的呢? 172 | 173 | 我:…… 174 | 175 | 面:我看你平时在社区中也比较活跃,你可以将一下为什么会参与到社区中,然后社区带给你了什么呢? 176 | 177 | 我:因为我比较热爱前端,我发现社区中也有很多人想要参与开源,但是如果直接上手看 vue 的源码,就比较难嘛,然后我就写了一个 vue3 的组件库,在 github 上教它们怎么去提交 PR,写一写 RFC,之类的,我就在掘金上发了一些文章,招了不少了人参与了进来。有时候也会看一些其他的源码,比如看一些 ts 的类型,是如何定义的,或者有什么更好的写法,有时候可能自己想不到的,可以通过社区中看完会有更多的想法。还有就是解决问题也可以通过社区来解决,在 issues 中解决,还是比较权威的 178 | 179 | 面:那么你在社区中的工作,和在我们公司的工作,时间上如何安排呢? 180 | 181 | 我:基本上我都是下班之后做开源 182 | 183 | 面:那么你是如何解决,比如我也了解到,在社区中自己发起一个项目,然后需要和社区中的人做很多的沟通讨论,我这边肯定要做一些主导型的设计,这个你是如何解决和工作冲突的问题的呢? 184 | 185 | 我:这当然是以工作为主嘛,因为开源又不是强制要求比如哪天必须上线什么的 186 | 187 | 面:好的 188 | 189 | ## HR 面 190 | 191 | 面:我看你是住在 xx,过来有点远 192 | 193 | 我:我房子七月份到期,可以搬家 194 | 195 | 面:你觉得你能胜任岗位的优势有什么?说两个点 196 | 197 | 我:比较善于学习,基础好吧 198 | 199 | 面:之前有参与社团之类的吗? 200 | 201 | 我:没用 202 | 203 | 面:周末平时都干什么? 204 | 205 | 我:基本上可能会周边走走吧,不过最近都在家里写代码,一天提交个三四十次左右吧 206 | 207 | 面:期望新增是多少? 208 | 209 | 我:15K 210 | 211 | 面:这是最低可以接受的是吗? 212 | 213 | 我:是的 214 | 215 | 面:之前是 14 吗? 216 | 217 | 我:是的 218 | 219 | 面:你第一份工作的离职原因是什么呢? 220 | 221 | 我:工作比较简单,学不到什么新的东西了 222 | 223 | 面:炽橙这边你都学到什么了呢? 224 | 225 | 我:学到了比如桌面度的应用程序的如何写的,还有 ts 相关的也了解到更多了,还有服务器相关的 226 | 227 | 面:你还有什么其他想要了解的呢? 228 | 229 | 我:咱们公司加班情况怎么样? 230 | 231 | 面:加班的话。目前还好,看项目,如何项目很急需要加班 232 | 233 | 我:薪资结构是什么样子的呢? 234 | 235 | 面:薪资结构的话是基本工资+岗位工资+绩效 236 | 237 | 我:绩效的考核标准是什么呢? 238 | 239 | 面:绩效的考核标准就是每个月都会在你这边写一版,然后交到产品这边,然后会整体过一下标准,通过月度考核,都是根据实际情况来 240 | 241 | 我:工作时间如何安排的呢? 242 | 243 | 面:目前的话就是大小周,上面 9 点,下班是 6 点钟,中午是从 11:30 休息到 1:15 244 | 245 | 我:上面时间和下班时间有没有弹性打卡呢? 246 | 247 | 面:这个基本上没有,因为很多人都是住在附近,也并不需要,如果后期有很多人都住的很远,那么有这种的需求,后面可以加 248 | 249 | 我:好的 250 | 251 | 面:还有什么问题吗? 252 | 253 | 我:没有了 254 | 255 | 结束。 256 | -------------------------------------------------------------------------------- /2022-03-31.md: -------------------------------------------------------------------------------- 1 | # 2022-03-31 面试复盘 2 | 3 | ## 技术一面 4 | 5 | 面:先自我介绍一下吧。 6 | 7 | 我:(自我介绍) 8 | 9 | 面:你先详细介绍一下你的开源组件库吧。其实我详细看了你的组件库和 github,你认为你封装的组件的优点和缺点在哪里? 10 | 11 | 我:在大多数的组件库中它们现在大多数都是使用的 jsx,我的组件库使用的是 template 写的,更适合刚接触 vue3 的人,更适合了解组件的实现原理,使用 template 写更适合阅读,jsx 写的不是很适合阅读源码,我的组件库比较轻量级,实现了组件大多数的功能。 12 | 13 | 面:你的组件库是你自己封装的是吗? 14 | 15 | 我:嗯对。 16 | 17 | 面:vue 的一些常用的生命周期有哪些? 18 | 19 | 我:创建前、创建完成、挂载前、挂载完成、更新前、更新完成、销毁前、销毁完成。 20 | 21 | 面:vue 数据的双线绑定是怎么实现的。 22 | 23 | 我:vue3 使用的是 es6 新增的 proxy 进行的代理,使用 get 和 set 进行的数据劫持,然后更新。 24 | 25 | 面:2 呢? 26 | 27 | 我:2 是使用的 Object.defineProperty。 28 | 29 | 面:vue3 怎么实现组件传值。 30 | 31 | 我:父组件给子组件传递可以通过属性传递,子组件向父组件传递可以通过 emit 方法进行传递,如果不是父子组件可以通过 vue 内置的 provide/inject 依赖注入,可以在父组件注入一个依赖,然后不管嵌套多深的子组件都可以访问。 32 | 33 | 面:你组件库重写了 script 里面的东西,我像知道你的组件库中那一块的功能模块使用到了?还是全部重写了? 34 | 35 | 我:全部都重写了。 36 | 37 | 面:在浏览器上输入一个 url 地址之后会发生什么呢? 38 | 39 | 我:这就是会由三次握手嘛。 40 | 41 | > 这题我真不太会,没太记住。。。 42 | 43 | 面:你们性能优化是怎么优化的呢? 44 | 45 | 我:优化分为组件优化和官网优化,组件优化是将里面的组件里面的每个方法都封装成一个大的函数,然后通过解构的方式进行获取,保证暴露在外面的每个函数都是对模板有用的。官网优化,官网使用了代码优化的插件叫 highlight.js,那个包的体积非常达,我就将那个包的源码拆分出来了,拆出来了 4~5 个文件,我有将它发布成了另外的一个包,然后可以减少体积。然后第二次优化将图片转换为了在线图片的方式,减少包的体积了。 46 | 47 | > 这个包叫 [bright-code](https://github.com/Tyh2001/bright-code) 是我自己写的。 48 | 49 | 面:还有其他的吗? 50 | 51 | 我:主要是减少包的体积。 52 | 53 | 面:为什么刚开始有 2MB 那么大? 54 | 55 | 我:引入的东西全是完整引入。 56 | 57 | 面:那么你们后期是怎么引入的? 58 | 59 | 我:就保证引入的每一个函数都是有用的。 60 | 61 | 面:你们是按照函数的方式引入的是吧?那么你们有没有考虑从组件的方面进行入手呢? 62 | 63 | 我:组件的话,只是有一些细微的减少代码量,做到用最少的代码实现相同的效果。 64 | 65 | 面:vue 的 v-if 和 v-show 的区别是什么? 66 | 67 | 我:v-show 如果等于 false,那么就会在标签上作用 display: none 的属性,如果 v-if="false" 如果频道的进行现实和隐藏,可以使用 v-show 如果只显示一次或者少次就使用 v-if。 68 | 69 | 面:css 中怎么实现垂直居中? 70 | 71 | 我:可以使用 flex 布局。给父级的容器设置为 display: flex,然后 justify-content: center;align-items: center;。 72 | 73 | 面:还有吗? 74 | 75 | 我:还有通过定位,给父元素设置相对定位,然后给子元素设置绝对定位,上下左右都是 0,然后 margin: auto。 76 | 77 | 面:call、apply、bind 直接的区别是什么?共同点是什么呢? 78 | 79 | 我:call 和 apply 都是可以立即调用函数,bind 是返回一个函数再进行调用。call 传递是字符串,apply 传递是是数组,它们都可以改变 this 的指向。 80 | 81 | 面:vue 的实例都是挂载到 html 的哪个标签上的呢? 82 | 83 | 我:#app 标签上。 84 | 85 | 面:是对 html 页面的标签,不是对 vue 里面的#app,就是 #app 挂载到的是 html 页面的哪个标签上的? 86 | 87 | 我:body 标签里面。 88 | 89 | 面:vuex 里面的几个特性是什么? 90 | 91 | 我:state、Mutation、Action,还有一个类似于计算属性的那个,还有一个不记得了。 92 | 93 | 面:computed 和 watch 有什么区别? 94 | 95 | 我:computed 是计算属性,可以返回一个计算的结果,watch 是监视一个值,如果这个值发生变化了,就会执行。 96 | 97 | 面:你认为你们开发的组件库有什么缺点?或者是后期有待提升的是哪一点? 98 | 99 | 我:我现在主要在做项目的构建方面,还有组件想让它有更多的功能。 100 | 101 | 面:你认为你的组件库哪里比较优秀,对比其他的第三方组件库来说。 102 | 103 | 我:比较轻量级,体积非常小。 104 | 105 | 面:element 都很轻量级,都可以按需加载。那么你的相对于它们的来说,有什么更由于它们的呢? 106 | 107 | 我:更适合新手使用。 108 | 109 | 面:我看了一些你们的组件库,感觉你们的 ui 好丑。因为你们的 css,可以更细致化一点。 110 | 111 | 我:哈哈。 112 | 113 | 面:let、var、const 的区别是什么?还有变量提升? 114 | 115 | 我:var 的变量可以全局访问的,作用在 window 下的,let 不能重复声明,有块级作用域,它不能通过 window 访问。const 是常量,不能重复声明,一旦声明就不能更改。 116 | 117 | 面:什么是闭包? 118 | 119 | 我:会导致内存泄漏。 120 | 121 | 面:js 中有哪些会导致内存泄漏的呢? 122 | 123 | 我:(略) 124 | 125 | 面:怎么解决闭包这种显现呢?因为在外面函数就不能调用内部的函数了呀。 126 | 127 | 我:尽量少使用闭包吧。 128 | 129 | 面:节流和防抖的区别是什么? 130 | 131 | 我:节流的话,比如说一个浏览器滚动才会触发的逻辑,那么它会在滚动停止会触发一次,节流是在指定毫秒后触发一次。 132 | 133 | 面:你对接使用过 axios 吗? 134 | 135 | 我:我的组件没用使用过。其他的项目使用过。 136 | 137 | 面:promise 有什么特点呢? 138 | 139 | 我:promise 有三种状态,一个是等待状态,一个是可以的状态,还有一个是拒绝的状态。它有 then 方法,可以处理成功和失败,还有点 then 可以处理异常的状态。 140 | 141 | 面:你说的是它的方法,其实我像问的是它有哪些特点? 142 | 143 | 我:它是解决回调地狱的。 144 | 145 | 面:微任务宏任务了解吗?那你说一下什么是微任务什么是宏任务。它们的执行顺序是怎么样的呢? 146 | 147 | 我:任务分为主进程,微任务,宏任务,类似与异步的定时器,就属于的宏任务,promise 就是微任务,那么执行顺序就是:主任务先执行,然后是 promise 然后是定时器的异步函数。 148 | 149 | 面:你们上线都是怎么上线的啊? 150 | 151 | 我:上线就说直接将本地打包好的放到服务器上就好了。 152 | 153 | 面:是你自己放的吗? 154 | 155 | 我:对呀。 156 | 157 | 面:如果你本地打包以后并没有办法双击本地运行,那么你这是怎么解决的呢? 158 | 159 | 我:在 vite.config.js 配置 baseUrl 为 ./ 160 | 161 | 面:./ 还是打不开的。 162 | 163 | 我:对 vite 的是打不开的,webpack 是可以打开的。我之前配置了 ./ 也是不生效,然后我丢到服务器上然后就可以了。要不也可以启动一个本地服务也可以打开。 164 | 165 | 面:如果现在就是一个 vite 项目,然后就想在本地打开,让其他程序去嵌它,怎么搞呢? 166 | 167 | 我:这个没有做过。 168 | 169 | 面:如果现在让你去做这些,你会从那个方面去入手呢? 170 | 171 | 我:我认为是 vite 的配置的问题。 172 | 173 | 面:你认识是配置的问题是吧?那么你感觉你会在这上面话费多少时间去做呢?比如现在让你去做这种嵌的功能,让你做需要多长时间? 174 | 175 | 我:我认为如果是配置的问题,应该是比较快呢。 176 | 177 | 面:但是其实官方就是不支持。因为我也试过。 178 | 179 | 我:本来就是不支持的吗? 180 | 181 | 面:对,本身就是不支持,因为如果配置为 / ,是可以的,如果是 ./ 是不支持的。es6 新增的 ... 是干什么的? 182 | 183 | 我:数组的话可以展开数组,对象的话可以展开对象。 184 | 185 | 面:数据扁平化了解吗? 186 | 187 | 我:不太了解。 188 | 189 | 面:你做过什么小程序之类的吗? 190 | 191 | 我:小程序有做过,但是小程序比较少。 192 | 193 | 面:有上线的吗? 194 | 195 | 我:上线的有一个是我自己做的。 196 | 197 | 面:是什么类型的呢?因为我看简历上面并没有写。 198 | 199 | 我:那个是我给我女朋友做的一个小程序。 200 | 201 | 面:哦~秀恩爱的。 202 | 203 | 我:哈哈。 204 | 205 | 面:你的小程序是用的什么技术栈做的? 206 | 207 | 我:小程序就是…… 208 | 209 | 面:原生的吗? 210 | 211 | 我:对,原生的。 212 | 213 | 面:我看你组件封转这一块写的比较多,然后还写了组件库,那么你在组件封转这一块,是怎么样的思想去封转的呢?你认为什么样的组件是需要封装的。因为我们公司也有很多组件,那么你认为什么样的组件值得你去封装呢?那么怎么样算是比较好的组件呢? 214 | 215 | 我:组件的话就是可以在项目中会出现很多次嘛,就像这种就会抽离出来。就比如封装的组件配置项比较多,体积比较小,这样的组件算是比较好的组件。 216 | 217 | 面:组件是直接 import 方法导入的吗? 218 | 219 | 我:对啊。 220 | 221 | 面:如果你在使用其他的一些组件库是将全部的组件库都导入进去吗? 222 | 223 | 我:直接导入啊。 224 | 225 | 面:如果一次全部导入会引入很多组件,体积会很大,那么你会怎么处理? 226 | 227 | 我:可以按需导入嘛。可以通过结构的方式,使用哪个就导入哪个。 228 | 229 | 面:如果你在一个页面中,使用到了四个组件,但是这四个组件很消耗内存,现在让你处理这一块你会怎么处理?就是我们公司同事写的,他写了四个组件,在一个页面中使用。 230 | 231 | 我:一个页面导入四个组件,然后这个组件太大了吗? 232 | 233 | 面:是的,让你做性能优化。因为 vue 就是这样只要是有关系有关联,它都会打包进去。我现在以为按需加载,执行到哪一步就加载哪个组件。 234 | 235 | 我:这个我没用做过,这个可能就是尽可能减少组件内部的代码吧。 236 | 237 | 面:其实可以使用动态组件去导入,执行到哪一个再去执行它对应的方法,接下来可能就是使用 v-if 这些,就是说不要一次性导入那么多,让它导入有先后及,可能就是一个页面中,有些方法和组件可以让他提前去加载,加载完之后让他再去加载一些其他的组件或内容。 238 | 239 | 我:哦哦~ 240 | 241 | 面:或者 css,我们可能会使用 cdn 的方式进行加载,或者是第三方库。 242 | 243 | 我:哦哦~ 244 | 245 | 面:我看你下面是有一个花旗银行的项目是吧?下面使用了一个 localStorage 和 vuex 缓存用户数据,那么你这里面有存在一个子域共享的一个问题吗? 246 | 247 | 我:我没太明白。 248 | 249 | 面:子域共享,就是我将项目部署到服务器上了之后,地址就是一个 url 嘛,我们可能在它旗下还有有个服务,我们希望它们之间的数据可以存在互通。 250 | 251 | 我:就是在一个域名下是吗? 252 | 253 | 面:对。 254 | 255 | 我:这个没用做唉。 256 | 257 | 面:既然上面使用了 localStorage,那么为什么还会用到 vuex 呢? 258 | 259 | 我:因为 vuex 不能数据持久化呀,就想保留用户的登陆信息。 260 | 261 | 面:vuex 页面一刷新页面数据会丢失吗? 262 | 263 | 我:是的,会丢失。 264 | 265 | 面:那么你是怎么优化的呢? 266 | 267 | 我:所以这个使用了 localStorage 里面了呀。 268 | 269 | 面:那么你怎么没用存储到 sessionStorage 里面呢? 270 | 271 | 我:这个其实都是类似的,只不过那个关闭浏览器就会删除嘛。 272 | 273 | 面:你在这个投票系统中主要负责哪些功能呢?我看你就是做了一个事实展示的平台。你们这个功能大概有哪些功能呢?这是一个在线项目吗? 274 | 275 | 我:嗯嗯,是的。这个项目是我做的全栈,前端有一个用户输入 id,然后还有投票页面和结果页面。 276 | 277 | 面:那你用过 echarts 吗? 278 | 279 | 我:用到,在结果页面中,用柱状图展示了投票结构。 280 | 281 | 面:如果让你用 echarts 做一个效果,那么在 demo 里并没有你想要的效果,那么你会怎么做? 282 | 283 | 我:那么可能会换一个其他的可视化平台吧。 284 | 285 | 面:换一个其他平台是吧?有没用考虑从它的 api 方面入手呢?因为它的 demo 也是,它肯定会有一些 api 没有在 demo 中显示出来的。 286 | 287 | 我:我对 echarts 了解并不是很多。 288 | 289 | 面:你在做你的项目中难点有什么? 290 | 291 | 我:花旗的项目之前遇到过跨域的问题,还有传参的问题。 292 | 293 | 面:跨域你是怎么解决的? 294 | 295 | 我:我在后端设置为请求头设置为\*,就可以全部都访问了,或者在前端设置服务器代理。 296 | 297 | 面:还有其他的吗? 298 | 299 | 我:还有 jsonP 跨域,那个在项目中没有使用。在组件库中有些组件设计起来比较难的,也参考了一些其他组件库的源码。 300 | 301 | 面:我看了你的组件库,我下载下来看了,有 44 个人关注,有 5 个人收藏了你。 302 | 303 | 我:哈哈哈。 304 | 305 | 面:我看你一般学习都通过什么途径呢? 306 | 307 | 我:最近在看书,那本《Vue.js 设计与实现》,还有看文档。 308 | 309 | 面:一般都是通过书籍和文档入手是吧? 310 | 311 | 我:嗯。 312 | 313 | ## 技术二面 314 | 315 | 面:我看你前面一家公司写的是那边已经达到巅峰没用提升了。 316 | 317 | 我:哈哈哈哈,对。 318 | 319 | 面:我看你这边的项目中,哪些是你们公司的项目呢? 320 | 321 | 我:花旗的是。 322 | 323 | 面:做了多久? 324 | 325 | 我:做了一个月。 326 | 327 | 面:还有没有其他的项目可以说一下的?你是觉得都太简单了吗? 328 | 329 | 我:基本都是一些 h5 的项目,除了投票的项目还有一个问卷调查,上面有一些选项的,给花旗那边使用的。 330 | 331 | 面:你是觉得那边技术栈太简单了是吗?那边都是静态页面,都是 h5? 332 | 333 | 我:对。 334 | 335 | 面:你希望下一份工作在技术上,你有哪些要求? 336 | 337 | 我:我感觉性能这一块还是比较有挑战的。 338 | 339 | 面:还有其他的吗? 340 | 341 | 我:还有就说整体的复杂度。 342 | 343 | 面:希望有挑战性更高的? 344 | 345 | 我:对。 346 | 347 | 面:你前面这些静态页面有什么收获呢?或者在这工作一年,有什么收获呢? 348 | 349 | 我:收获是让我接触到一些后端还有服务器相关,这是我之前没接触过的。然后包括花旗的后端也是我写的。 350 | 351 | 面:你们之前的人员结构是怎么样的? 352 | 353 | 我:一共开发就两个人。 354 | 355 | 面:一个就两个?一个后端一个前端? 356 | 357 | 我:对,另一个是后端和前端都会,但是主要是做后端。但是我们之前的公司并不是主要做开发,公司有 50 多个人分成很多模块,有做电商直播的,有做广告的,有做设计的,还有我做开发的。 358 | 359 | 面:你有什么想要了解的吗? 360 | 361 | 我:请问咱们公司主要做什么呢? 362 | 363 | 面:(略) 364 | 365 | 我:那您感觉我还有需要提升的吗? 366 | 367 | 面:你现在的重点全部都是放在了封装组件这一块,其实你对实际的项目开发还有很多是没有了解透的,但是像我们公司的请求这一块,可能没有怎么去了解,然后 css 这一块我只是问了一些简答的 css,感觉还可以,主要是在开发上的一些功能的实际开发经验偏少,你现在缺少的是项目去支撑你的那些理论知识。因为你很多都是去封装组件,因为我也是去看了你在组件库,因为在实际开发中,我这边,可能在优化上缺少一些经验,其实你们包的体积还是蛮大的。后期可以再去优化一下你们的组件库。 368 | 369 | 我:如果我有幸拿到咱们公司的 offer 的话,那么我需要提前先学习哪些东西可以上手工作呢? 370 | 371 | 面:也不用学习什么,因为你的技术很够,很我们也没差多少,我们现在使用的是 vue2,axios,或者 element-ui,还有小程序和 app,小程序使用的是 uni-app 或者 vant,可能会配置离线打包,因为你这边应该是没有离线打包的经历,离线打包我们是要配合安卓进行的。其实我们的技术栈蛮丰富的。 372 | 373 | 我:平时咱们公司管理代码都是使用什么呢? 374 | 375 | 面:gitee,你还有什么想问的呢? 376 | 377 | 我:没用其他的了。 378 | 379 | 结束。 380 | -------------------------------------------------------------------------------- /2022-04-06-am.md: -------------------------------------------------------------------------------- 1 | # 2022-04-06 面试上午场复盘 2 | 3 | > 杭州 悠银科技 4 | 5 | ## 技术第一轮 6 | 7 | 面:你为什么从上一家公司离职呢? 8 | 9 | 我:(略……) 10 | 11 | 面:你后面的打算是怎么样的? 12 | 13 | 我:我打算就是一直做前端。 14 | 15 | 面:前端也有很多方向,看你向往哪个方向发展?我指的是全站,或者是以图形为主。 16 | 17 | 我:我可能更倾向于全栈。 18 | 19 | 面:组件库开发了多久? 20 | 21 | 我:从 2021 年的 8 月份开始开发的,当时是做的 vue2 的版本,从 10 月份开始 vue2 版本就不在维护了,就开始做了 vue3 的版本,一致到现在。 22 | 23 | 面:你的组件库我大概看过,你是如何解决你的组件库用户自定义的程度的呢?可能你的库有时候不能满足用户,可能用户不可能去改你组件库全局的内容,因为这个是整个框架都会动,这个你是怎么解决的呢? 24 | 25 | 我:这个我还在升级中,就可以有更多的配置项来让用户更灵活的配置。 26 | 27 | 面:现在用的人多吗? 28 | 29 | 我:平均每周 npm 下载量七八百吧,感觉还挺少的。 30 | 31 | 面:你是如何理解 js 的隐式类型转换的呢? 32 | 33 | 我:隐式类型转换不太了解。 34 | 35 | 面:比如数字转换为字符串,你是怎么做的? 36 | 37 | 我:我都是使用 toString() 方法进行转换的。 38 | 39 | 面:这只不过是基本类型的,比如不同的引用类型相加是怎么转换的? 40 | 41 | 我:这个不太了解。 42 | 43 | 面:平常开发的问题,有遇到过 js 浮点运算精度不准确的情况吗?那么你是怎么解决这个问题的? 44 | 45 | 我:之前有遇到过数字过大的问题,因为 js 有一个安全整数范围嘛,叫 jsonbig 的一个包可以转换为正常现显示的范围。 46 | 47 | 面:那么你知道 js 的安全整数范围是多少吗? 48 | 49 | 我:xxxx 50 | 51 | 面:刚才我问的是浮点类型,就是小数点,你是怎么解决的? 52 | 53 | 我:这个没用遇到过爱。 54 | 55 | 面:平时项目有做过类型金额方面的项目吗? 56 | 57 | 我:没用。 58 | 59 | 面:你简单说一下深拷贝和浅拷贝之间的作用吧。 60 | 61 | 我:浅拷贝的话就是拷贝一个对象,对象里面都是数字或者字符串可以将其拷贝过来,就是赋值了一个相同的对象,因为对象之间是相互引用的,如果直接将对象赋值为另外一个名字的话,那么它们还是相互引用的,那么将对象拷贝过来之后再进行修改的话,不会影响到原对象。但是这个对象里面还有对象的话,那么里面的对象修改的话,还是会影响到对象内部的对象,深拷贝就是将里面的基本类型和引用类型全部都拷贝一遍,这个可以使用 json 拷贝,也可以使用 instanceof 方法进行判断,如果是 Object 类型的话,就再创建一个新的对象,再进行递归拷贝。 62 | 63 | 面:如果对象被冻结了可以拷贝吗? 64 | 65 | 我:也可以拷贝,只不过不能被修改。 66 | 67 | 面:平时做项目的时候有用 ts 吗? 68 | 69 | 我:我的组件库用的就是 ts。 70 | 71 | 面:.d.ts 文件会被编译成实体的 js 文件吗? 72 | 73 | 我:编译方面我不太清楚。 74 | 75 | 面:你有用过 ts 的 info(不一定对) 关键词吗? 76 | 77 | 我:好像没用。 78 | 79 | 面:平时你是怎么做类型推导的呢? 80 | 81 | 我:因为每一个函数返回什么我都是知道的。 82 | 83 | 面:如果不是固定的呢?通过传入的参数不同返回的类型也不同。 84 | 85 | 我:这个实际没有碰到过,基本都是固定的,然后返回什么我都写上就行了。 86 | 87 | 面:最后再问你一个基础问题哈,不知道你对内存结构有没有了解,反正这是一道内存结构的问题。32\*32 等于多少? 88 | 89 | 我:这不是很了解。 90 | 91 | 面:好吧 92 | 93 | 我:这应该等于多少呢? 94 | 95 | 面:1024 啊。 96 | 97 | 我:哦哦。 98 | 99 | 面:平常算法有了解吗? 100 | 101 | 我:有了解一些基础的,在力扣上刷过。 102 | 103 | 面:力扣还是相对比较简单的。有其他的吗? 104 | 105 | 我:没有了。 106 | 107 | 面:两数之和在不用加减乘数的情况下,你怎么做? 108 | 109 | 我:创建了一个对象,每次循环的时候,都将数组的索引为键元素为值,每一次循环的时候都将其添加到对象中去,然后判断如果这个对象中有这个值就代表找到了,就说以对象进行存储。 110 | 111 | 面:你这样有点奇怪,平时位运算有接触过吗?平时开发都是以 vue 为主是吧?vue2 和 vue3 都接触过吧? 112 | 113 | 我:对的。 114 | 115 | 面:平时源码有看过吗? 116 | 117 | 我:源码还没用仔细的看过,只是了解一些基本的架构和实现方法。 118 | 119 | 面:可以具体说一说你具体看过和了解过哪一块? 120 | 121 | 我:了解过响应式方面。 122 | 123 | 面:其他的呢? 124 | 125 | 我:因为最近不是有一本《vue.js 设计与实现》那本书嘛,我刚刚看到响应式这一块。 126 | 127 | 面:那么如果有一个变量 a,它既全等于 1,又全等于 2,又全等于 3,这个等式你怎么成立? 128 | 129 | 我:不太清楚了。当时在掘金上看到了,但是不太记得了。 130 | 131 | 面:vue3 还 vue2 的响应式原理有做过改变吗?可以说一下 2 和 3 相比最核心的功能吗? 132 | 133 | 我:vue2 使用的是 Object.defineProperty() 方法,vue3 使用的 proxy 方法,Object.defineProperty() 只能监视对象中的其中一个属性,一旦发生变化就会触发 get 和 set 事件,proxy 方法只要监视的对象上有任何一个属性发生改变都可以触发 get 和 set 事件。 134 | 135 | 面:还有其他的吗? 136 | 137 | 我:我知道的就说这么些。 138 | 139 | 面:如果在 vue 文件中既写了 template 又写了 render,那么会执行哪个呢? 140 | 141 | 我:我认为执行先会执行 render。 142 | 143 | 面:那么 template 还会执行吗? 144 | 145 | 我:不会了。具体怎么实现的我不太清楚。 146 | 147 | 面:那么具体 template 怎么编译成 render 不太清楚是吧? 148 | 149 | 我:是的,这涉及到模板编译嘛。 150 | 151 | 面:组件通信你都会使用什么方式呢? 152 | 153 | 我:xxx 154 | 155 | 面:provide/inject 是双向绑定的是吗? 156 | 157 | 我:是的。 158 | 159 | 面:vue2 是吗? 160 | 161 | 我:不太清楚。 162 | 163 | 面:vue3 确实是,后面为什么会把它绑定为双向绑定的呢?为什么是双向绑定的呢? 164 | 165 | 我:为什么我不太清楚。 166 | 167 | 面:像 vue 中的 key 具体的作用是什么? 168 | 169 | 我:给每一个循环让它是唯一的。 170 | 171 | 面:一般你是使用 index 还是其他的 id 之类的? 172 | 173 | 我:我都是使用 index。 174 | 175 | 面:那么 diff 算法有了解过吗? 176 | 177 | 我:diff 好像是使用了算法中的最长递增子序列,然后在 vue 的源码中我还找到了最长递增子序列的函数,就是实现的还是比较复杂的,没怎么看懂,每一个变量都是使用一个字母来代替的。 178 | 179 | 面:性能优化你都是以一个什么样的方案呢? 180 | 181 | 我:首先是将包的体积缩小,保证每一个引用的东西都是有用的,当时我的官网使用了 highlight.js,当时是引用了很多东西,包的体积就特别大,后来我就抽离出来了四个文件,提供给我的项目使用的,就减少了很多,再一个是将图片转换为在线的图片,也会减少体积。还有图片可以使用懒加载的形式。还有数据量比较多的时候使用分页。其他就说使用相同的代码实现相同的功能,还有减少网络请求。 182 | 183 | 面:base64 相对文件来说,是体积增大还是减小了? 184 | 185 | 我:减少了吧。因为全部都是字符串编码了。我认为的体积减小了,但是需要 cpu 去加载它。 186 | 187 | 面:它的好处就是体积变小吗? 188 | 189 | 我:我认为是。 190 | 191 | 面:其实是体积变大了。 192 | 193 | 我:那么它有什么好处呢? 194 | 195 | 面:image 有时候不能直接使用 file 格式,但是相对来说使用 base64 做一些图片上面的操作相对于比 file 来说更加方便一些。 196 | 197 | 我:哦哦。 198 | 199 | 面:你对你的项目是如何进行工程化管理的呢? 200 | 201 | 我:就是指的是项目构建方面吗? 202 | 203 | 面:对。 204 | 205 | 我:构建方面的话,因为我有一些合作的伙伴嘛,我会指定一些规范。比如提交的 commit 规范,是以一个指定的关键词,比如 docs、fest、fix 等,然后冒号跟着一个描述信息,还有代码的格式规范,每一次提交的时候会自动格式化所有的文件,还有就说报错不能提交。 206 | 207 | 面:其他的还有吗?整体代码结构工程。比如你是这个项目的架构师,你会注意什么呢?你在整理你的项目的架构的过程中你的想法是什么呢? 208 | 209 | 我:这个我感觉主要是提交规范上,因为我看过一些组件库的源码,比如 element-plus 或者 naive-ui 它们就是有一套规范的,都有一个描述文件嘛,包括你修改的某个组件还有某个功能还是某个 bug,都有详细的体积规范,如果你修复了某个 issues,还需要添加这个 issues 的编号。 210 | 211 | 面:平时有给一些大型的源码库提交过 pr。 212 | 213 | 我:其实给它们提交 pr,开始就是比如文档哪里写错了,修修错别字什么的,但是内容方法还是帮不到什么太大的忙。 214 | 215 | 面:你问什么选择做前端呢? 216 | 217 | 我:首先是因为我学的就是做这个的,再一个就是你做一些网页,做一些什么项目,直接一个链接给朋友,就可以立即让别人看到成果,感觉还挺好的。 218 | 219 | 面:工作的时候有遇到过什么困难吗? 220 | 221 | 我:当时遇到了跨域问题,还有就说通过 post 传参,当时在前端传递不过去,然后当时找到了一个叫 qs 的包,然后解决了传参的问题。 222 | 223 | 面:跨域是什么问题?你后面是怎么解决的? 224 | 225 | 我:当时有两者方式,在后端设置了请求头为\*,然后就可以了。 226 | 227 | 面:太危险了。 228 | 229 | 我:还有就说在 vue.config.js 中设置了服务器代理,也可以。 230 | 231 | 面:你们部署到服务器上之后还有 config.js 的文件嘛?还是直接打包好了? 232 | 233 | 我:没有了,直接打包好了。 234 | 235 | 面:平时使用框架的时候,有没有遇到过感觉框架有问题的情况,或者说你遇到问题的情况下,你的出发方向的怎么样的?我看源码还是找资料还是其他方式? 236 | 237 | 我:遇到问题可能是去网上查一查资料,查一下报错信息。然后我加了很多的前端的群,就会去群里向它们咨询咨询,可能别人会遇到这种问题,看看他们是怎么解决的。 238 | 239 | 面:平时会从源码层解决问题吗? 240 | 241 | 我:源码层倒是不会。 242 | 243 | 面:好,我这里了解就这么多,你有什么想问我的吗? 244 | 245 | 我:咱们公司主要做什么项目或者业务呢? 246 | 247 | 面:我们主要做游戏平台这一块的,主要和玩游戏的人挂钩。技术栈主要是 vue + ts 为主,后端全部都是 node。(略……) 248 | 249 | 我:平时怎么管理代码的呢? 250 | 251 | 面:我们也是使用 git,也是使用 xxx 那一套规范,我们主要有三个分支,beta、dev 和 master,平时开发就是在 dev 上开发,beta 就是一个测试版了,master 就是一个线上。我们代码的规范的严格按照 ts 的规范来的,除非万不得已的情况下,一般情况下我们是不允许有 any 存在的。 252 | 253 | 我:每一个都会由直接的类型。 254 | 255 | 面:对,要么你做类型推倒,要么你自己好好的完善。然后你在代码旁边必须要写上注释,这样别人才能看懂。 256 | 257 | 我:那这样看起来就很舒服了,既有注释,又有详细的类型。 258 | 259 | 面:是的。 260 | 261 | 我:那么您感觉我还有什么需要提升的吗? 262 | 263 | 面:挺好的啊,挺好的,工作一年到这种程度也挺好的。其实很多时候解决问题都是在源码上找,我们现在的解决方案来说,因为网上很多的解决方案都是不合理的,要么就说在官网 issues 上找,或者 [stackoverflow](https://stackoverflow.com/),但是 stackoverflow 上也有很多人瞎扯淡其实很多时候我们还是准确自己的判断,比如这里出现了问题,和预期不太符合我们就会直接去源码上看一看,这一块是怎么写的,第一解决问题方法是从源码上寻找的。 264 | 265 | 我:stackoverflow 那个还是可以的,不过现在网上很多搜出来的结构都是 csdn 什么的。 266 | 267 | 面:stackoverflow 有些其实回答还是不错的,但是有些也是瞎扯淡,还是去官方的 issues 上找一下,或者是一些已经 open 的,那么就可以直接去源码上看看就行,大概就是这样。 268 | 269 | 我:哦哦,好的,那么都了解了。 270 | 271 | 结束。 272 | 273 | ## 技术第二轮 274 | 275 | 我:(自我介绍) 276 | 277 | 面:你的组件库实现了哪些功能。 278 | 279 | 我:相比其他的组件库,大概实现了 80%左右的组件吧。比如常用的按钮表格弹窗等都是有的。 280 | 281 | 面:你认为最复杂的是那个? 282 | 283 | 我:我认为是 message 弹出框。(后面略……) 284 | 285 | 面:message 可以用在什么场景呢? 286 | 287 | 我:就是一个提示框啊,比如登陆功能,登陆成功和失败都会有一个提示的信息,是登陆成功还是失败,那么就会在上方提示登陆成功还是登陆失败的信息提示给用户啊。 288 | 289 | 面:你刚刚说的登陆,我倒是有一个问题啊,比如让你实现一个登陆的功能,你会怎么设计? 290 | 291 | 我:登陆就是需要用户名还有密码,然后下面会有登陆按钮。首先的话是一个表单验证,如果你的用户名和密码是空的时候,或者长度或者格式不匹配,密码的长度和格式的不匹配,那么点击登陆是不能发送请求的,就会有弹出哪里不符合规范,当所有的规范都合理的情况下,你点击按钮首先按钮会触发 lading 状态进行禁用,然后会触发请求,通过请求返回的数据,会提示成功或者失败。失败的话就会有失败的提示,如果成功的话,就会有成功的提示,或者还有页面跳转。 292 | 293 | 面:你刚才说的有没有感觉漏点什么? 294 | 295 | 我:emmmm,那是漏了点什么呢? 296 | 297 | 面:你怎么看待登陆的安全问题? 298 | 299 | 我:安全问题都是后端解决的吧。 300 | 301 | 面:前端也需要去考虑,后端确实会去做。不知道你有没有实战过,或者自己做一个登陆的表单。 302 | 303 | 我:做过,都是使用的这一套方法做的。 304 | 305 | 面:那么你是怎么登陆这个人,是一个正常的人还是一个机器人呢? 306 | 307 | 我:比如用一些脚本登陆的是吗? 308 | 309 | 面:对的。 310 | 311 | 我:这个我倒是没用做过。 312 | 313 | 面:那么你之前做的那么些系统中就是有这个漏洞了,我是不是可以这么理解? 314 | 315 | 我:啊,哈哈哈。这个倒是没有考虑到。 316 | 317 | 面:token 是什么呢? 318 | 319 | 我:token 就是一个用户的唯一标识嘛,比如咱们常用的软件,都会有专属的 token,比如在另外一台设备上登陆就会被挤掉。 320 | 321 | 面:这个是指什么 token? 322 | 323 | 我:就是后端返回回来的。 324 | 325 | 面:这算不算是单点登录呢。具体这个技术实现你有去了解过吗?你了解后端是怎么做的吗? 326 | 327 | 我:后端我不清楚唉。 328 | 329 | 面:前端确实就是给你一个 token。这个是没错。 330 | 331 | 我:然后就是用户每次请求都需要携带 token 才能获取到数据。我就知道这些。 332 | 333 | 面:Cookie Session 有什么区别呢? 334 | 335 | 我:一个是存储到本地的,一个是存储到服务器上的。我就知道这些。 336 | 337 | 面:http 状态码有没有了解? 338 | 339 | 我:201 就是请求成功,30 几就是重定向,404 是请求资源不存在,500 是服务器的错误。 340 | 341 | 面:那么 301 和 302 呢? 342 | 343 | 我:这个我不太清楚。 344 | 345 | 面:除了 message 你还觉得还有哪些比较难的? 346 | 347 | 我:基本上弹出类的组件都是比较难的,还有就是 Dialog 弹出等。 348 | 349 | 面:有做过弹窗上面还有弹窗的设计吗? 350 | 351 | 我:做了,也可以弹出里面再继续弹出,这个是有优先级的。都是可以正常显现的。 352 | 353 | 面:这个是怎么实现的? 354 | 355 | 我:就是增加 z-index 值,就可以了。 356 | 357 | 面:你之前的工作中,还有封装过什么业务组件吗? 358 | 359 | 我:有封装过,比如列表,它左边有图片,中间是内容,右边还有编辑的按钮,每一个列表都是一个组件,然后通过循环组件来实现的。还有就是一个顶部导航栏等。 360 | 361 | 面:你理解的网络协议是什么? 362 | 363 | 我:网络协议了解的不是很多。比如 http 和 https,https 就会比较安全嘛,它是配置域名了 ssl 证书就可以了。 364 | 365 | 面:在哪里配置呢? 366 | 367 | 我:在服务器上配置。 368 | 369 | 面:它是什么原理呢? 370 | 371 | 我:原理我不是很懂。 372 | 373 | 面:最核心的是什么? 374 | 375 | 我:这个我不了解。 376 | 377 | 面:那么常用的加密算法有了解过吗? 378 | 379 | 我:加密算法我只了解过 md5 加密。 380 | 381 | 面:md5 严格来说不算是加密。也就说说哈希和加密你了解的不是很多是吗? 382 | 383 | 我:嗯嗯,是的。 384 | 385 | 面:你能讲出网络协议的结构是什么吗? 386 | 387 | 我:我不了解唉。 388 | 389 | 面:Websocket 有了解过吗? 390 | 391 | 我:我只是了解它是干什么的,比如了解就是使用 Websocket。还有一些小游戏,比如五子棋。 392 | 393 | 面:那么 http 可以实现吗? 394 | 395 | 我:应该是可以的吧。 396 | 397 | 面:ts 你用的多不多。 398 | 399 | 我:我是最近开始学的。在我组件库的项目中使用到了。 400 | 401 | 面:那么你认为 ts 的作用是什么呢?有哪些特性是你最喜欢的? 402 | 403 | 我:它主要的特性就是标记类型嘛,当你阅读源码的时候,可以看到每一个变量,每一个函数的返回值和类型都是什么,再加上注释,看代码就会容易一些。主要就是这个。我喜欢的地方的话,比如枚举,我还是比较喜欢的,可以让代码变得更健壮。 404 | 405 | 面:枚举 js 也可以啊。还有其他的吗? 406 | 407 | 我:我认为他就是让代码变得更加健壮,容易阅读的。 408 | 409 | 面:我看你写的是 monorepo + pnpm 构建项目是吧?为什么会选择这一套方案呢? 410 | 411 | 我:因为社区里面比较火嘛,当时我的组件库的项目分成了好几个项目。组件库的源文件是一个项目,又是一个项目,当时就是需要维护两个项目,两个仓库同时提交,它们也有很多公共的依赖。后来在社区中看到一些项目,它们的目录结构还是比较奇怪的,我就去了解了一些搭建的方式,又自己去查了资料学习了一段时间按,后来将项目重新构建了一遍,将两个项目都放到一个项目中了,公共的依赖都放到最外层了,每个项目也由自己的依赖性,然后每个项目之间还会相互依赖。 412 | 413 | 面:它和单个的仓库有什么区别呢?根本上的区别是什么呢? 414 | 415 | 我:根本上就是几个项目可以共享同一个依赖嘛。就可以省去了多个项目安装的时间。 416 | 417 | 面:你写了两次的性能优化,你这是做了什么样的事情进行优化的? 418 | 419 | 我:我将 highlight.js 的源码都看了,将里面的好几百个文件,只抽离出了四个文件,提供我的项目使用,就是仅仅支持我的项目使用的,这个优化减小的非常大,然后其他的依赖也都是按需引入。再一个是将代码尽可能的减少,实现使用尽可能少的代码实现相同的功能。还有就说将图片转换为在线的图片。 420 | 421 | 面:少量的代码实现相同的功能这个是干了什么? 422 | 423 | 我:这里还涉及到一个封装的问题,每个组件里都有很多函数,我将组件实现都封装到一个大函数中,就保证暴露在外面的都是有用的。 424 | 425 | 面:你了解面向对象的开发模式吗? 426 | 427 | 我:(略……) 428 | 429 | 面:有了解过其他语言吗? 430 | 431 | 我:php。 432 | 433 | 面:这个 js 基本一样,就没必要说了。那么你还有什么像问我的吗? 434 | 435 | 我:您感觉我还有什么需要提升的吗? 436 | 437 | 面:你现在可能是对前端这一块比较精,但是问你有些网络或者是一些横向的技能你是掌握的不多的。 438 | 439 | 我:那么如果我有幸加入咱们公司,我还有需要什么准备的吗?可以更快的上手工作呢? 440 | 441 | 面:干活的话那倒是没有,主要就是 ts,如果你要是对 ts 了解不是很深的话,那可能不太行。 442 | 443 | 我:您认为 ts 的好处有什么呢? 444 | 445 | 面:主要就是类型约束。因为 js 好就好在灵活,坏就坏在太灵活了。太灵活有些东西可能就会没办法保证准确度。 446 | 447 | 我:那么我都了解了。 448 | 449 | 结束。 450 | -------------------------------------------------------------------------------- /2022-07-01.md: -------------------------------------------------------------------------------- 1 | # 2022-07-01 面试复盘 2 | 3 | ## 面试阶段 4 | 5 | 面:你先自我介绍一下吧 6 | 7 | 我:…… 8 | 9 | 面:你是去年毕业是是吗? 10 | 11 | 我:是的,去年毕业的 12 | 13 | 面:你是什么时候开始做开源项目的? 14 | 15 | 我:去年的八月份 16 | 17 | 面:是什么契机让你做开源项目的呢? 18 | 19 | 我:当时很多项目都使用 element 组件,当时也不是很了解那些组件是如何做出来的,也不清楚为什么在 vue 中写一个 el- 什么的标签就可以实现组件展示,后来就在 b 站上看到一个视频,讲解了一些组件的实现原理,后来就明白了组件是如何实现的,又去看了看那些组件库的源码,就都了解了,就开始自己做了 20 | 21 | 面:我看你的 fighting-design 项目的 Contributors 成员还是挺多的,你是如何组织这个团队如何开发的呢? 22 | 23 | 我:现在提交了大概 700 多次了,基本上前 300 次提交都是我自己在做,后来我去掘金上发了一些文章,后来又去群里分享了一波,就又很多人来加入了进来,后来我就创建了一个群,平时都是在群里进行分享的 24 | 25 | 面:那你能不能介绍一下你的 fighting-design 是如何设计的,中间有没有遇到过什么挑战,你是如何解决的呢? 26 | 27 | 我:组件设计方式的话,都是先从简单开始,我先用 figma 做出设计稿,在 github 发起 rfc,将设计稿和配置项都列举出来,还有一些参考文档,还有一些难点之类的,我都会列举出来,之后在群里给他们分享,然后有人就会想要参与这个组件,就有他来写,他写完之后我看过之后会给一些修改的建议再进行修改,或者有些组件直接我自己来写。然后有什么难点呢,之前有遇到过打包相关的问题,当时使用 rollup 进行打包,打包之后可以在 vue3 的项目中进行使用,但是这个项目再打包之后就会报很多类型的错误,后来找到原因就是,打包没有把类型打包进行,因为都是使用 ts 来写的,后来感觉 rollup 打包比较复杂,就改为使用 vite 打包了,将打包类型也都配置好了,就实现了打包,大概就是这样 28 | 29 | 面:rollup 相比 vite 复杂在哪里呢? 30 | 31 | 我:rollup 打包,比如打包 css、vue、ts 都需要专门的配置插件,都需要依赖它们才可以正常打包,但是 vite 底层使用的是 rollup,它内置集成的比较好,所以配置起来比较简单 32 | 33 | 面:那你有没有了解像 rollup、vite 这种新型的构建工具相比于 webpack 它们的区别是什么? 34 | 35 | 我:它们的区别不太了解 36 | 37 | 面:那么你自己项目中写业务的时候有没有使用 webpack? 38 | 39 | 我:webpack 现在用的很少,都是使用 vite 40 | 41 | 面:你是去年 5 月份才开始工作是吗? 42 | 43 | 我:是的,五月十号 44 | 45 | 面:你在做组件库的时候,我看你使用了 monorepo,那么这个 monorepo 是什么东西呢? 46 | 47 | 我:比如咱们按照以往的方式,要是写一个项目,组件库是一个项目,官方文档也是一个项目,这样的话可能就会分成两个仓库来管理,每次都需要拉取两次代码,安装两次依赖进行管理,这样就比较麻烦嘛,那么 monorepo 就是将文档、组件、样式什么的都混到一个项目中,通过 pnpm 统一管理依赖,将公共的依赖安装到最外层,然后每个项目还都有单独的依赖项,然后就可以通过一个命令将所有的依赖全部安装上了,方便管理 48 | 49 | 面:前面讲到的 pnpm 相对于 npm 还有什么区别吗? 50 | 51 | 我:它下载速度块,安装的 node_modules 体积非常的小 52 | 53 | 面:有没有了解底层的实现,或者说 pnpm 是如何做到这一点的? 54 | 55 | 我:这个了解过一些但是我现在不太记得了 56 | 57 | 面:你觉得你做的组件库和市面上流行的组件库有什么区别呢? 58 | 59 | 我:世面上大多数组件都已经成型了,比如一些新手也想去参与开源的贡献去提个 pr,那么已经成型的组件库可能不是很好入手,不太了解整体是一个什么样子的流程。正好我这个组件库我刚刚起步的一个,那么我可以从 0 到有带着你实现一个完整的组件。 60 | 61 | 面:你对于模块化的了解吗? 62 | 63 | 我:了解啊 64 | 65 | 面:那么你的组件库打包出来模块化是如何处理的呢? 66 | 67 | 我:模块化的话,我打包自动根据我的目录结构实现了啊。每个工具函数工具类都抽离出来了,然后在项目中进行安装,就可以再任何地方使用到了 68 | 69 | 面:就是我像问一下,你有没有考虑过兼容方面的问题呢?比如你的组件库能否在 ie8 的版本上走?考虑过这个问题吗? 70 | 71 | 我:因为现在不是微软已经不再维护了嘛,我现在只要把一些 Safari 浏览器、火狐浏览器、谷歌浏览器主流的浏览器兼容了就可以我感觉 72 | 73 | 面:但是主流的浏览器也是有比较老的版本,因为你现在使用的工具都是比较新的,那么不管它们的构建流程还都是比较新的。那么我再问的具体一点,那么有没有了解过 esModule 和 commonJs? 74 | 75 | 我:了解过,我现在打包都是使用 ES 打包的 76 | 77 | 面:esModule 是吗? 78 | 79 | 我:之后那些打包都会配置,都会加 80 | 81 | 面:那 esModule 和 commonJs 它们之间有什么区别有了解吗? 82 | 83 | 我:了解,比如 esModule 就是使用 import 导入,export default 导出。commonJs 使用 require 导入 84 | 85 | 面:你做组件库有没有写过单元测试? 86 | 87 | 我:写单元测试 88 | 89 | 面:你是如何实现的呢? 90 | 91 | 我:单元测试使用了两个工具,一个是 vitest 和 utils-test,这两个结合来使用的 92 | 93 | 面:具体是怎么做的呢? 94 | 95 | 我:比如组件都有很多的参数,就拿按钮组件来说,它可以通过不同的 type 来实现不同的样式展示,实现的方式是根据不同的类型进行 class 拼接,那么就测试传入不同的 type 能不能拼接成预期的 class 类名 96 | 97 | 面:你的组件里有没有用到过 slot? 98 | 99 | 我:用过啊,就是插槽啊 100 | 101 | 面:你能讲讲 vue 的插槽,或者你对插槽的理解 102 | 103 | 我:比如按钮组件,按钮组件中间有一段文字嘛,那么直接在组件的标签中写入内容,就可以插入你指定的 slot 的位置,还用到了具名插槽,给 slot 设置 name 属性,插槽使用 template 标记 name 属性,就可以插入指定 name 的位置 104 | 105 | 面:你的组件样式是怎么设计的?是你自己设计的吗? 106 | 107 | 我:对,自己设计,使用 figma 108 | 109 | 面:你对这种组件的设计规范有没有了解 110 | 111 | 我:我的规范就是,我有一套统一的色号,所有的组件都是遵循那一套标准的色号来进行设计的,还有一套规定的尺寸 112 | 113 | 面:你是怎么部署的? 114 | 115 | 我:是哪方面部署? 116 | 117 | 面:没事没事,你现在是纯 github 的开源代码是吧? 118 | 119 | 我:你说文档是怎么部署的吗? 120 | 121 | 面:对,是这个意思 122 | 123 | 我:文档的话我使用 vitepress 来写的,我本地打包之后,我有一个自己的服务器,直接打包放到服务器上就好了 124 | 125 | 面:你在公司使用的也是 vue3 吗? 126 | 127 | 我:vue3 和 vue2 都有 128 | 129 | 面:那么 vue3 和 vue2 有什么区别呢? 130 | 131 | 我:在模板层面的话,vue3 可以有多个根节点,vue2 只能有一个根节点。在 js 方面 vue3 新增了 setup 语法糖,composition API,声明周期钩子前面都加入了 on,没有了 this,比如计算属性和监视器都需要引入才能使用,还有响应式变量都需要通过 ref 进行包裹,底层方面更新了响应式 api,vue2 使用的是 Object.defineProperty,vue3 改用了 es6 新增的 proxy 132 | 133 | 面:proxy 相比 defineProperty 它的优势是什么? 134 | 135 | 我:defineProperty 的话只能监视到对象中某一个属性发生变化它才会执行内部的函数,proxy 可以监视到整个对象,这个对象中的任何一个属性发生变化它都可以执行 136 | 137 | 面:vue 是如何实现 data 里面的响应式?响应式原理有了解嘛 138 | 139 | 我:了解一些,用 ref 包裹之后就是一个响应式数据了,比如一个 p 标签里面有一段文字,用 proxy 监视到内部的文字发生变化它可能就会重新执行一下 innerText 赋值的操作,将新的对象属性重新 innerText 到这个标签里面。因为它可以监视到对象中的数据发生变化嘛,标签里面的文字就是对象里的文字,当它发生变化就会重新执行一下渲染的函数,大概这样 140 | 141 | 面:vue3 的 composition API 相比 vue2 的选项式 API 它的优势是什么呢? 142 | 143 | 我:vue2 的 option API 将生命周期啊,计算属性啊,监视器全部都在组件里面,就算你用不用它都会打包进去,影响打包体积,vue3 你需要什么引入什么,这样可以减少打包体积,主要这一点 144 | 145 | 面:我看你项目中有一个数字化全端 3D 云平台能介绍一下吗? 146 | 147 | 我:这个是我上一家公司自研的产品,里面有很多 3D 的东西,比如桌子,电脑什么的,3D 模型,我通过调用 3D 那边的接口我将 3D 展示到页面上可以进行拖动,看到各种的角度,还可以产生爆炸效果,看到它每一个零件是干什么的? 148 | 149 | 面:前端这一块是怎么实现的? 150 | 151 | 我:都是调用 3D 的接口,使用 canvas 来展示的 152 | 153 | 面:canvas 展示的,3D 的接口是指的什么? 154 | 155 | 我:3D 的接口,因为我们那边有 3D 的开发工程师,我们是协同配合开发的项目,他复杂写 3D,我负责调用它的接口进行展示 156 | 157 | 面:那么他返回给你的数据是什么样的数据? 158 | 159 | 我:大概就是对象类型的 160 | 161 | 面:你是怎么用 canvas 来渲染的呢? 162 | 163 | 我:我想想啊,这个不太记得了 164 | 165 | 面:那么你这边渲染层面实际上做的不多是吧? 166 | 167 | 我:对,其实主要是写业务 168 | 169 | 面:canvas 主要也没怎么写是吧? 170 | 171 | 我:对,主要调用它的接口,基本上可以直接展示了 172 | 173 | 面:你上面写的这些性能优化,讲讲吧,必须首屏加载之类的 174 | 175 | 我:当时性能还是比较差的,使用浏览器自带的灯塔工具可以测试性能的评分嘛,当时减少了一些依赖的引入,将那些第三方库的完整引入都变成按需引入了,然后组件改用了异步组件的方式,大概主要这种比较大型的性能优化,提示了大部分性能,还有一些小的优化 176 | 177 | 面:组件太大,是有多大啊?我不太能明白大的话能大到哪里去 178 | 179 | 我:大组件大概有 500 行代码左右吧,逻辑还是比较多的,比如首页,会由不同的展示状态,比如有 3 中展示状态,那么这三种展示状态都对应的 3 个组件,如果将这个三个组件全部引入进去,那么它都会全部打包进去,那么如果使用异步组件,按需引入的话,需要哪个使用哪个 180 | 181 | 面:异步组件按钮引入是如何实现的? 182 | 183 | 我:按需引入 vue 中有内置的 API 可以使用啊 184 | 185 | 面:看你有一个 Electron 的项目,可以讲讲吗? 186 | 187 | 我:这是 vue + Electron 做的,这是一个桌面端的应用程序,可以唤醒本地应用程序的一个项目,它就是一些基本的业务逻辑,登陆什么的,还有轮播图,主要是它可以后台返回的路径打开本地电脑其他的应用程序 188 | 189 | 面:那么这也没需要 Electron 什么事情啊 190 | 191 | 我:对,它就是需要一个应用程序 192 | 193 | 面:axios 有做过处理是吧?你都是怎么处理的? 194 | 195 | 我:用了响应拦截器和请求拦截器什么的,比如请求拦截器要发送一些 token 之类的,还有一些其它加密字段之类的,响应拦截器统一处理了响应结果,因结果中可能是 res.data.data,然后就通过拦截器统一返回需要的数据了 196 | 197 | 面:比如我在这里想要做一个防重复点击,需要怎么做? 198 | 199 | 我:是在哪里? 200 | 201 | 面:就在拦截器里面 202 | 203 | 我:比如点击请求一次的话,那么就不要每次点击都重复发送是吗? 204 | 205 | 面:就是上一次返回结束之后才可以继续请求 206 | 207 | 我:这个我想一想哈,因为这个是一个异步操作嘛,使用 async 函数,在 await 没有出来结果的时候,点击就 return 返回出去,就不要再继续发送请求了 208 | 209 | 面:你这个不是在拦截器里面做 210 | 211 | 我:哦,是要在拦截器里做是吧? 212 | 213 | 面:也不一定是在拦截器里做,但是不能说每一次点击都调用接口,那么每次都写这样一个判断,那么如果请求很多不是就会增加代码量吗?所以写在拦截器里面比较好 214 | 215 | 我:但就在拦截器里面做,如果这次请求还没有完全返回的时候,再请求就让他直接返回,就不要让它继续发送了 216 | 217 | 面:我们一般请求都会有一个 loading 的状态,有一个圈圈在哪里一直转,那么我现在有很多个请求,这么多个请求在第一个请求进来的时候,就开始转,在最后一个请求出去的时候,在这个转结束,那么你觉得怎么处理这个逻辑比较好,就比如说我怎么知道最后一个请求结束? 218 | 219 | 我:这个可以使用 promise.all 方法可以处理所有的 promise,就可以通过它来判断,就将所有的请求都发送完成之后,将 loading 变成 false,正常发送之后变成 true 220 | 221 | 面:promise 除了 all 之外还有哪些方法? 222 | 223 | 我:promise.resolve 成功的,promise.reject 失败的,还有方法可以处理最快请求的,那个叫什么不记得了 224 | 225 | 面:你对这个网络协议有什么了解? 226 | 227 | 我:了解一些基础的,了解一些状态码之类的 228 | 229 | 面:又遇到 401 吗? 230 | 231 | 我:401 没有,都是 404 232 | 233 | 面:我看你了解后端开发逻辑,你是写过后端吗? 234 | 235 | 我:是的,我之前使用 php 的 thinkPhp 框架写过后端 236 | 237 | 面:是什么时候写的? 238 | 239 | 我:是去年的六七月份左右 240 | 241 | 面:写了多长时间 242 | 243 | 我:当时就是写了一些博客的增删改查的东西 244 | 245 | 面:那么你最近有没有学到一些前沿的技术,或者看过什么? 246 | 247 | 我:最近一些前沿的技术……我感觉我就是用到了一些比较好用的插件 248 | 249 | 面:你说 250 | 251 | 我:比如做组件库嘛,每个组件都需要 name 的属性,那么在 vue3 不能在 setup 直接设置 name,那么有一个 vite 的插件可以直接在 setup 的 script 标签上设置 name。我还看了眼它的源码,虽然是这样设置 name 的,但是底层的实现逻辑,还是重新创建了一个 script 标签设置了 name,只不过使用了插件可以直接在 script 上设置 name 252 | 253 | 面:那这个实现的挺简单的,那么你为什么做了 fighting-design 之后,后面有做了后面别的组件库 254 | 255 | 我:tyh-ui 那个是我第一次做的练手的项目,实现了不少的组件,后面这个我感觉是社区中我带领着团队做的,因为之前的组件库也不是很完善,功能也比较少 256 | 257 | 面:你这个 vscode 主题插件是怎么做的,可以讲一下吗? 258 | 259 | 我:当时我在 vscode 的市场上找了很多的主题插件,也没什么喜欢的。都看着不舒服,然后就把我下载到本地主题的源码全部都看了一遍,就了解了如何开发的主题的,后来就自己配置了一套色号,自己开发了一个,然后现在 vscode 就是用自己开发的主题来写代码 260 | 261 | 面:你这个函数工具库是干嘛用的? 262 | 263 | 我:因为非常非常火的 lodash 是用 js 写的嘛,因为 ts 现在这么流行,我就将我平时使用的一些函数封装到这个,发布到 npm 上了,也使用 ts 进行重构了 264 | 265 | 面:就是使用 ts 写的工具库是吧? 266 | 267 | 我:对的 268 | 269 | 面:都有哪些工具呢? 270 | 271 | 我:比如说判断一个值是否为数字,判断是否为 null,还有防抖,节流,数组克隆,数组去重,对象的克隆,对象深克隆这种 272 | 273 | 面:你讲讲这个防抖和节流的实现逻辑 274 | 275 | 我:防抖,比如说一个事件反复触发的逻辑,就是不要让它反复触发,节约性能。比如浏览器滚动事件,在滚动的时候会输入一些日志,那么用防抖的函数的话,当你滚动停下来的时候它才会触发一次,节流的话,会在你设置的指定时间后触发一次 276 | 277 | 面:行,我这边问的差不多了,您这边有什么问题吗? 278 | 279 | ## 提问阶段 280 | 281 | 我:咱们公司主要做什么呢? 282 | 283 | 面:基于区块链做的………… 284 | 285 | 我:咱们技术方面都是什么呢?用什么框架之类的? 286 | 287 | 面:现在招的这个岗位主要使用 vue3、Git 之类的做主要的开发,但是有一些老的项目是用 react 写的,也需要维护,大概是这样 288 | 289 | 我:平时咱们管理代码有什么规范吗? 290 | 291 | 面:管理代码,现在在招的这个岗位,小组只有一个前端,就是说规范比较随意一些 292 | 293 | 我:那咱们公司有多少人啊? 294 | 295 | 面:整个公司吗? 296 | 297 | 我:对的 298 | 299 | 面:整个公司大概有 300 人左右吧 300 | 301 | 我:前端和后端的开发团队有多少人? 302 | 303 | 面:这个有点数不过来了,估计整个研发有 100 多个人,但是现在正在招的这个岗位小组比较特殊一点,只有一个前端,两个后端,因为它们主要做底层这一块建设的,所以不需要太多人 304 | 305 | 我:您平时都是如何获取到前端最新的技术的呢? 306 | 307 | 面:我一个就是 github,我逛的最多的就是 github,因为上面有一个趋势,它会有最流行的,或者大家最新的东西,看一看这个,其次的话就是我自己也有微信群嘛,大家也都会分享一些前沿的技术,一起讨论讨论,然后的话,说实话掘金这种的话,面试题比较多上面,前沿的东西不会第一时间让你知道,第一时间让你知道的还是自己上一些国外的网站吧,然后还有很多开发者大会 308 | 309 | 我:您平时经常使用 github,如果您看到感兴趣的项目会去提 PR 之类的吗? 310 | 311 | 面:那肯定是我平时会用这个东西,并且我遇到了 bug,就会提一下,不多哈,不是说为了提 pr 去提 pr 312 | 313 | 我:您平时遇到问题,或者遇到 bug 有什么比较好的解决方式吗?通过什么方式进行解决呢? 314 | 315 | 面:基本上开发的话,都会打断点,最直接有效的,让你知道你在哪个作用域里面,这个作用域里面的活动对象是什么样的,通过断点配合谷歌的提示是最有效的。其次的话,要对 js 这一块比较熟悉一点,这样可以更快的找到问题,基础打好 316 | 317 | 我:您觉得我还有什么需要提升的吗? 318 | 319 | 面:你的话其实也刚毕业一年,本身我对你这块的要求不会太高,比如你的亮点是有足够的驱动力,去做一些工作和开源的工作和对于自己的项目优化,但是你的这个缺点就是说:钻研的还不够深,我们自己有这个驱动力来做做这个自己感兴趣的东西是正确的,但是更好的就是,我既然做了,我就直接做到底,我是像把这东西研究的头侧一点,现在这是我对你的建议。就是说不是做个东西做出来就好了,做出来的同时,我需要去看,我这个东西的优势和劣势和其他人比这差在哪里,但是不一定和其他人一模一样,但是一定要知道我差在哪里,就说我可以明确的指定。然后就是你有这个兴趣和这个驱动力是很好的,就说在往深钻研一些吧 320 | 321 | 我:那您是看了我的项目是吧? 322 | 323 | 面:我有看了一些,就说和你聊的过程中我就在看,包括之前问你的防抖和节流,在问的途中我就打开了,你这写的还是比较简陋的,就是说既然写了,就写好一些,我哪怕我直接拷一个过来,我也要拷一个好一些的过来,对不对?但是拷过来要理解,拷过来了,理解了,那么就是我的,对不对? 324 | 325 | 我:对啊 326 | 327 | 面:对啊。你既然做了,很多人根本没有迈出这第一步,你既然已经迈出这第一步了,那么就可以往后面多迈几步,那么对你以后的帮助就会非常大,这样子的 328 | 329 | 我:您感觉我 fighting-design 的项目还有什么需要提升或者有什么缺点吗? 330 | 331 | 面:那个项目我是昨天看了一点,今天没打开有点忘了,我就讲讲我跟你面试过程中给我的感觉哈,你学习的东西还是比较浅,实际上组件库我们能写代码的都能写,但是就说我既然写了,我的组件有什么优势呢?你就没有讲的特别好,你没有说的很清楚,就比如我设计这个组件库,我肯定是奔着别人会用,那么别人为什么会用呢?我觉得你在设计的时候可以多考虑一下。包括之前问你的 monorepo 这个架构包括 pnpm 这些东西实际上做组件库都会用到,pnpm 的核心原理使用了内容巡视,相比于 npm 的巡视方案是更优的,然后它使用了这个硬连接去查找这个文件,并且做了引用,它的核心原理你是可以去再往深入钻研一些,既然我用了,就需要知道它为什么好,包括 vite、rollup、webpack 这些我问你都不是白问的,就说我感觉你是对技术感兴趣的人,可以再往这里边多看一看 332 | 333 | 我:好的 334 | 335 | 面:我不知道你现在是 6-10 号离职的是吗?然后到现在还都没有找到工作是吗? 336 | 337 | 我:前一段时间休息了一段时间,然后最近在家里写开源 338 | 339 | 面:好的,那么开源你可以多做一些。然后我就和你讲吧:**我这块面你纯粹是处于我的个人兴趣,就是说他们都在招 3 年工作经验以上的,我看你是在开源这块自驱力我就面你,然后呢,我一会会和他们讲一下你的这个情况,我会和他们说这是一个有自驱力的小伙子,虽然工作经验不多,但是开源工作做的还是可以的,我和他们这样说,具体他们后面怎么说后面我们也不知道是吧,我就先这样和你说,你就先等通知吧,然后你这块再往深看一看** 340 | 341 | 我:好的好的 342 | 343 | 面:那么咱们今天就先聊到这 344 | 345 | (结束) 346 | -------------------------------------------------------------------------------- /2022-07-06.md: -------------------------------------------------------------------------------- 1 | # 2022-07-06 面试复盘 2 | 3 | [2022-07-01 面试](https://github.com/Tyh2001/Interview-record/blob/master/2022-07-01.md) 第二轮面试 4 | 5 | ## 技术面 6 | 7 | 面:你先做个自我介绍吧,再介绍一下你的项目 8 | 9 | 我:(自我介绍 + 项目介绍) 10 | 11 | 面:你的超真云手册是什么项目? 12 | 13 | 我:(项目介绍) 14 | 15 | 面:你觉得你这些项目中,哪个是可以代表你水平的项目? 16 | 17 | 我:那当然是我的开源项目了 18 | 19 | 面:那么代表你水平的呢? 20 | 21 | 我:就是我的开源项目啊 22 | 23 | 面:开源项目是你发起的是吧? 24 | 25 | 我:对啊 26 | 27 | 面:平时和社区团队开发维护是什么样的? 28 | 29 | 我:我之前做了一个 tyh-ui 组件库,那个是我自己写的,大概实现了 30 多个组件,内部我感觉有很多东西不完善,功能也比较少,后来我就重新创建了一个,重新写了一个组件库。首先我先用 figma 做出设计稿,我会将配置项和设计稿还有难点,参考资料都发起一个讨论,然后我会在讨论中来写如何开发 30 | 31 | 面:那么定下来之后如何进行呢? 32 | 33 | 我:进行的话,因为是分工的嘛,不一定是我来写的,有可能是别人来写的,写好之后会提交 pr,然后我来查看,然后我会找出问题,如果有问题,我会在之前的讨论中发起,然后进行修改,或者有些时候我直接自己来改 34 | 35 | 面:那么有多少人提交过 pr 呢? 36 | 37 | 我:20 多个人 38 | 39 | 面:那么这个项目就是你工作外的时间在维护是吧? 40 | 41 | 我:对 42 | 43 | 面:你写这个代码规范,提交规范,文档规范,目录规范是什么样子的呢? 44 | 45 | 我:代码格式规范之前没有安装 eslint 哪些工具,我自己默认的一套规范,我列举了文案,比如代码的缩进必须是 2 个空格,不是 4 个空格,全部使用单引号,不能使用分号这种,后来加入 eslint 就可以有代码提示了,目录规范是在源码的目录中组件的文件,都包含 props 文件,将 props 和 emit 拆分出来和 vue 文件是源码,还有接口文件,组件的任何的 ts 类型全部都写到 interface.d.ts 中,工具文件要单独抽离出来,因为分成好多目录,有源码目录,还有 utils 目录,还有样式目录,文档规范的话,文档是使用 vitepress 生成的,就说将 markdown 文件来编写的,每个文件的格式我都使用文案来写出来了 46 | 47 | 面:那么你以后如何平衡你的开源项目和你工作中项目的时间分配啊? 48 | 49 | 我:这当然以工作为主嘛,因为开源项目并不是,比如做某个组件,你必须在规定的时间内做出来,因为都是不着急的嘛 50 | 51 | 面:你有统计你的项目有哪些使用者吗? 52 | 53 | 我:现在还没有啊,因为现在还是 beta 版本,还没有发布正式版本,所以还没有必要统计 54 | 55 | 面:那么你对 git 是比较熟悉是吧? 56 | 57 | 我:熟悉 58 | 59 | 面:那么你的开源项目分支你是如何管理的呢? 60 | 61 | 我:分支之前有人让我新建一个别的分支,但是后来我感觉我们这个项目人还没有那么多,所以就没有创建别的分支,基本上要是避免冲突的话,我都是让他们拉取最新的代码,反正现在冲突比较少,有一些简单的冲突很容易就搞定了 62 | 63 | 面:为什么要避免冲突啊?冲突应该是写代码时候一种很正常的显现,代码分支管理不是为了去避免冲突,而是说让多人协作的时候,以及版本更新迭代的时候,去做管理,这才是分支管理的目标。它的目标不是去避免冲突,有冲突就去解决冲突,是吧?所以,你现在可以将有没有代码分支的管理,多人协作这种 64 | 65 | 我:这个没有 66 | 67 | 面:我的理解是一个分支是吗?然后 pr 合并进来之后直接合并到 master 是吧? 68 | 69 | 我:是的 70 | 71 | 面:好的,我了解了。那么我问一下,git 有过回滚吗? 72 | 73 | 我:目前还没有 74 | 75 | 面:如果我要是出去一个分支,操作一个分支,要如何操作? 76 | 77 | 我:那就是新建一个分支嘛 78 | 79 | 面:对啊,你平时都是怎么做的? 80 | 81 | 我:我都是敲命令啊 82 | 83 | 面:怎么写的? 84 | 85 | 我:就是 git checkout 切换一个分支嘛,然后进行更改再提交 86 | 87 | 面:因为 vue 的生态已经完善了,为什么你又要去封装一个组件库呢? 88 | 89 | 我:因为 vue 的组件库的组件库确实比较多,但是社区中有很多人也想要参与到开源贡献中,因为开源中成熟的组件库可能不是很好入手去新增某个组件或者更改某个组件,正好我这个组件库是刚刚起步的,可以让你从 0 到有实现一个组件 90 | 91 | 面:就是号召很多人一起参与是吧? 92 | 93 | 我:对 94 | 95 | 面:那么你觉得你组件的优势是什么? 96 | 97 | 我:我认为刚才说的就是优势,不管你的水平有多高,都可以进行参与到开源贡献中 98 | 99 | 面:那么你是相当于提供了一个平台? 100 | 101 | 我:对 102 | 103 | 面:那么你开发的组件中,你能介绍一些比较复杂的组件,你是如何开发的呢? 104 | 105 | 我:比较复杂的,emmm,比如按钮组件的某些功能还是比较复杂的,虽然看上去比较简单,我对于按钮组件还是做了很多优化的,比如它有鼠标移入的 hover 的效果,还有点击时候有颜色加深的效果,这个都可以通过按钮的 type 值进行更改,都是写好的样式,但是我加入了自定义颜色的功能,自定义颜色之后按钮就不能使用 css 写死一套样式来实现了,后来我把这个功能也都实现了。也实现了按钮点击的涟漪效果,就是扩散的效果,这个我专门写了一个类进行实现的,还有图片展示的组件,我感觉逻辑比较多,它实现了正常的 src 加载,但是这个 src 加载失败的话,还有备用的 src 加载,还有图片懒加载等功能,还有比如图片加载成功或者失败都有回调参数 106 | 107 | 面:form 组件有开发吗? 108 | 109 | 我:那个还没有,我想在开发之前先把 switch 开关啊,input 输入框啊,写好了之后再做 110 | 111 | 面:我看你有开发过 vscode 主题插件,可以介绍一下你的思路吗? 112 | 113 | 我:因为在世面上那些插件我看着都不太舒服,不太好看,我就把下载到本地的插件源码看了一遍,就说一个 JSON 文件,里面配置了菜单啊,代码字体的颜色,后来就在 vscode 官网找了些教程进行开发的,后来发布到市场上,现在都是使用自己开发的主题进行开发 114 | 115 | 面:下载量多吗? 116 | 117 | 我:这个下载量并不是很多,因为我没怎么推广它 118 | 119 | 面:你主要改了什么样式? 120 | 121 | 我:代码的样式,还有 vscode 的边框啊,背景颜色之类的 122 | 123 | 面:有开发过功能性的插件吗? 124 | 125 | 我:这个没有 126 | 127 | 面:我看你在项目中进行了项目管理,绘制设计稿,设计稿也是你来绘制的吗? 128 | 129 | 我:对,我在自己的项目中要进行自己设计 130 | 131 | 面:你可以介绍一下 rfc 吗? 132 | 133 | 我:rfc 就是一个讨论,比如开发一个新的组件的话,我会发起一个新的 rfc,会把它的配置项、设计稿、难点、参考资料都放到 rfc 里面 134 | 135 | 面:我们常见的命名规范都有哪些呢? 136 | 137 | 我:有驼峰命名法,还有短斜杠连接的,基本上我的组件库文件名都必须是短斜杠连接,不能有大写字母,class 名是短斜杠连接,组件名是大小写的 138 | 139 | 面:你刚才说有短斜杠链接嘛,有没有看过其它开源组件库,有两个下划线进行链接的? 140 | 141 | 我:两个下划线是吧? 142 | 143 | 面:这个有了解过吗? 144 | 145 | 我:我感觉这个应该是适配不同的浏览器兼容是吧? 146 | 147 | 面:这种的 class 命名,有注意到吗? 148 | 149 | 我:有注意到啊,我知道啊 150 | 151 | 面:你对组件的单元测试了解吗? 152 | 153 | 我:我的组件库单元测试使用的是 vue3 官方的 test-utils 还用了 vitest,这两个结合来使用的 154 | 155 | 面:可以介绍一下超真云手册项目吗? 156 | 157 | 我:超真云手册是一个 3D 可视化平台,里面有很多的 3D 模式,大概有 200 多个吧,都是一些物品,比如有钻头,还有电脑,大型的还有卡车、房子,还有一些生活用品之类的,有 3D 的模式,可以使用鼠标进行拖动,展示各个角度是什么样子的,还有爆炸效果,可以看到这个模型的每个零件都是有什么功能 158 | 159 | 面:这个 3D 的效果是你来实现的吗? 160 | 161 | 我:这个是 3D 开发那边实现的,我们是协同配合的 162 | 163 | 面:那么你的主要工作是什么呢? 164 | 165 | 我:我主要工作是,3D 那边会有一个在前端可以展示的接口,我将其展示到页面上,再将那些功能实现 166 | 167 | 面:有没有做过 3D 和可视化相关的? 168 | 169 | 我:3D 我了解过 three.js 可视化我了解 Echarts 170 | 171 | 面:做过什么样的效果 172 | 173 | 我:就说做过一些销量的柱状图折线图那种的 174 | 175 | 面:我看你对首屏加载时间有做过优化,你是怎么做的? 176 | 177 | 我:超真云手册的首页,根据不同的用户登陆状态,会有不同的展示状态,比如有三种效果,对应的三个效果就是三个组件,但是如果将这三个组件全部引入到 home.vue 中的话,那么它的体积会非常的大,后来改用的是 vue 内置的按需导入的异步组件,就减少了打包的体积,实现了加载速度变快 178 | 179 | 面:那么性能优化从 70 到 90 是怎么评估性能的呢? 180 | 181 | 我:谷歌浏览器有灯塔的性能测试工具进行测试的 182 | 183 | 面:只是看评分,有没有看一些性能分析? 184 | 185 | 我:工具下面还有很多小的优化建议嘛,会按照它的建议进行优化 186 | 187 | 面:有没有一些由于代码引起的阻塞啊,进行优化的 188 | 189 | 我:这个有,在 vue2 中,如果将所有的变量都放到 data 中,因为放到 data 中都是响应式的嘛,因为不是所有的变量都是需要放到 data 中,这个有做过优化,就将不需要响应式的直接抽离出来 190 | 191 | 面:那么怎么判断阻塞时间是由于数据引起的呢? 192 | 193 | 我:因为内存占用率比较高 194 | 195 | 面:那么针对于打包压缩,对于构建有没有了解?webpack 有了解过吗? 196 | 197 | 我:构建,我组件库之前构建也是挺麻烦的,构建的挺久的。当时使用 rollup 进行打包的,后来打包之后的文件,发布到 npm 上嘛,但是后来下载到项目中可以正常使用,但是如果这个项目再进行打包,就会报很多类型的错误,是由于我的组件库影响的,后来找到问题是,因为是使用 ts 写的,有很多类型没有打包进去,后来有找到了专门打包 ts 的配置,将其配置上去了。后来又感觉 rollup 打包优点太复杂了,配置各种东西都需要各种插件,就改为使用 vite 打包了,将哪些 ts 类型的都配置好了,就实现了效果,就没有 ts 类型的错误了 198 | 199 | 面:你最开始为什么会使用 rollup? 200 | 201 | 我:之前我也没用接触过 rollup,顺便学习一下嘛 202 | 203 | 面:有了解过 rollup 的打包原理嘛? 204 | 205 | 我:这个没有 206 | 207 | 面:还是针对首屏加载的速度哈,就说我们浏览器打开一个页面,第一次需要的时间多一些,那么第二次明显感觉快一些了,这是为什么? 208 | 209 | 我:因为浏览器有缓存 210 | 211 | 面:那么是怎么样的缓存机制呢? 212 | 213 | 我:这个不了解 214 | 215 | 面:那么针对于 http 网络协议有了解吗? 216 | 217 | 我:这个了解一些基础的 218 | 219 | 面:比如 tcp 连接?有了解过吗? 220 | 221 | 我:这个不了解 222 | 223 | 面:那么能说一下你了解的吗? 224 | 225 | 我:我大概知道一些 http 状态码之类的,之前有配置过,将 http 配置成 https,配置服务器的 ssl 证书,这个做过 226 | 227 | 面:配置 ssl 证书也是你来配置的吗? 228 | 229 | 我:对,因为我也有自己的服务器嘛,所以就说自己来配置的 230 | 231 | 面:能说一下怎么配置的吗? 232 | 233 | 我:我的域名是在阿里云买的,那边可以下载免费的证书,然后将它放到服务器的指定目录,再修改一些配置文件就好了 234 | 235 | 面:那么需要在 nginx 上配置的吗? 236 | 237 | 我:对的 238 | 239 | 面:能说一下你是如何配置的吗? 240 | 241 | 我:我用了服务器的可视化软件,就像我们电脑中的目录结构一样,可以直接将文件拖到服务器上就可以了 242 | 243 | 面:然后我看你还有一个桌面端的应用开发嘛,有时候打包体积非常大,有没有做过类似的打包优化? 244 | 245 | 我:这个没有 246 | 247 | 面:我看你还有一个 3D 的轮播图,也是你开发的是吗? 248 | 249 | 我:对 250 | 251 | 面:这你是怎么做的? 252 | 253 | 我:因为世面上我找了很多的轮播图插件,还有 swiper 之类的,都没有类型的效果,它大概是只展示 5 长轮播图,中间的是最大的,两边会递减,可以实现无线循环的轮播,后来我在 vue 中通过 dom 操作来实现的,还有 css 动画之类的 254 | 255 | 面:3D 效果你是如何实现的? 256 | 257 | 我:就是一个放大的效果嘛,将最后一个节点放到第一个节点,然后另一边是将第一个节点放到最后 258 | 259 | 面:你这个和我理解是不太一样,你这个是平铺嘛?那么 3D 是如何实现的? 260 | 261 | 我:3D,轮播图有个背景图是 3D 效果的 262 | 263 | 面:平时在封装请求的时候,请求拦截器和响应拦截器你都会做什么事情? 264 | 265 | 我:请求拦截的话,我会配置一些加密的字段之类的,登陆之后还需要将 toke 也传入进去,统一处理 token,响应拦截器我做过统一处理错误信息,还有返回统一的数据,比如 res.data.data,直接返回需要的数据 266 | 267 | 面:你了解 promise 吗? 268 | 269 | 我:了解 270 | 271 | 面:你都是怎么使用的? 272 | 273 | 我:基本上都是请求会使用,都是使用语法糖 async await 函数 274 | 275 | 面:那么为什么我们现在使用 async await 函数?而不使用 promise? 276 | 277 | 我:因为 async await 函数最终返回的也是 promise,因为 ES6 新增了它嘛,写起来更简单更方便 278 | 279 | 面:那么有没有了解 async await 背后的一些原理? 280 | 281 | 我:这个不了解 282 | 283 | 面:你对携程有了解吗? 284 | 285 | 我:那是什么? 286 | 287 | 面:就是 async await 的一些原理,你可以了解一下 288 | 289 | 我:好 290 | 291 | 面:你对线程有了解吗? 292 | 293 | 我:emmmm,因为对应的线程还有进程嘛,只要有大概了解过一些,比如浏览器没开启一个标签,之前好像每个标签都是一个进程,后来因为这个比较占用内容,就将其优化为每个标签是一个线程了 294 | 295 | 面:这个你可以再了解一下 296 | 297 | 我:好的 298 | 299 | 面:js 有一个事件循环机制有了解吗?比如 setTimeout,它会引入这个事件循环的机制,这个有了解过吗? 300 | 301 | 我:循环机制? 302 | 303 | 面:或者说我们平时的异步是如何实现的异步? 304 | 305 | 我:异步的话,因为 js 分为不同的任务队列嘛,将主要的任务都放到任务队列中,然后将主要的任务都执行完毕之后再执行异步的 setTimeout 306 | 307 | 面:那么我们刚才聊到的 promise 它属于一个什么样的任务呢? 308 | 309 | 我:它属于微任务,setTimeout 属于宏任务 310 | 311 | 面:那么微任务的具体执行时机是什么样的呢? 312 | 313 | 我:先是主线程的任务,执行完之后再执行微任务,最后执行宏任务 314 | 315 | 面:那么我有多个 setTimeout 呢? 316 | 317 | 我:那么就会按照顺序以此的放到宏任务的任务队列中去,然后按照顺序执行 318 | 319 | 面:那么我的 setTimeout 中又嵌套了 setTimeout 改如何执行呢? 320 | 321 | 我:宏任务中又套宏任务是吧? 322 | 323 | 面:嗯 324 | 325 | > 接下来面试官拿起电脑像我展示了一个效果,问我如何实现 326 | > (略) 327 | 328 | 面:项目中会使用 mock 接口吗? 329 | 330 | 我:会用的,之前在我自己的项目中使用过,我在本地配置了一套我可以使用的 JSON 文件,然后将它放到接口上了,后来就通过请求后台的数据方式获取到数据进行使用 331 | 332 | 面:你平时都是如何学习的? 333 | 334 | 我:大概就是看书吧,还有在开源中看一些其他的项目 335 | 336 | 面:最近在学习什么? 337 | 338 | 我:最近在看 vue3 原理的方面,在看《vue.js 设计与实现》那本书 339 | 340 | 面:你可以介绍一下你的强项或者长处,因为刚才都是我们在问你,你可以自己夸奖一下你自己 341 | 342 | 我:(尴尬……此处省略) 343 | 344 | 面:可以说一下你自己有哪些缺点吗? 345 | 346 | 我:我喜欢熬夜写代码 347 | 348 | 面:还有吗,这也不算是缺点吧,只能说是一种习惯 349 | 350 | 我:可能有些技术上的缺点吧 351 | 352 | 面:比如什么呢 353 | 354 | 我:比如更深层的不是很了解吧,比如刚才问的打包原理不是很懂,还有一些 vue 底层的方面 355 | 356 | 面:平常自己是以工作结果为导向的吗? 357 | 358 | 我:工作结果? 359 | 360 | 面:就说评价你这段时间工作怎么样是以结果为导向的吗? 361 | 362 | 我:应该也不算吧,还有是在写代码中解决问题的能力吧 363 | 364 | 面:那么这种评价你可以接受吗?就说以工作结果占比比较大 365 | 366 | 我:就是只看结果不看过程是吗? 367 | 368 | 面:也不是,就是结果看的比较多,过程也看,因为结果是实质上对公司有产出的 369 | 370 | 我:可以啊 371 | 372 | 面:那么比如说我,个具体的任务,很多时候你需要自己去制定完成的目标,你觉得你是这样的一种人吗?你会自己制定吗? 373 | 374 | 我:会啊 375 | 376 | 面:你现在处于一种什么样的状态?还在上班中吗? 377 | 378 | 我:我已经离职了 379 | 380 | 面:目前期望薪资是多少? 381 | 382 | 我:15k 383 | 384 | 面:对于区块链合约这块有没有了解或者接触过? 385 | 386 | 我:这个没有唉 387 | 388 | 面:比特币有没有了解过? 389 | 390 | 我:这我知道啊 391 | 392 | 面:就说接触比较少? 393 | 394 | 我:是的 395 | 396 | 面:你第一家公司的离职原因是无提升,无提升是怎么样的? 397 | 398 | 我:我第一家公司做的项目比较简单。大多数是一些 h5 的页面,很多是使用 jquery 来实现的,各种的点击实现效果,当时项目只有一些上海花旗银行的项目,有投票的项目,功能比较少,实现起来比较简单,我感觉没有什么提升 399 | 400 | 面:那么你期待是怎么样的工作环境? 401 | 402 | 我:就是更能接触复杂度比较高或者要求的项目,然后可以学到一些别的技术等 403 | 404 | 面:别的技术值得什么? 405 | 406 | 我:因为前端有很多新的技术嘛,还有一些解决问题的方式 407 | 408 | 面:好的 409 | 410 | ## 人事面 411 | 412 | 面:你先自我介绍一下吧 413 | 414 | 我:(略) 415 | 416 | 面:你之前的任职经历可以讲一下嘛? 417 | 418 | 我:(略) 419 | 420 | 面:大致参与过哪些项目呢? 421 | 422 | 我:(略) 423 | 424 | 面:第一家公司的离职原因是什么呢? 425 | 426 | 我:(略) 427 | 428 | 面:第二家公司的离职原因是什么呢? 429 | 430 | 我:(略) 431 | 432 | 面:这家公司在哪里? 433 | 434 | 我:在 xx 435 | 436 | 面:那么离你住的地方还是挺远的啊 437 | 438 | 我:大概 40 分钟地铁 439 | 440 | 面:你对自己找工作有什么打算呢? 441 | 442 | 面:你学习的专业是什么? 443 | 444 | 面:你是什么时候接触前端的呢? 445 | 446 | 面:什么时候开始接触前端呢? 447 | 448 | 面:对于自己想要从事的行业有什么规划吗? 449 | 450 | 面:你都是如何学习到一些前沿的技术的呢? 451 | 452 | 面:评价一些你的技术是一个什么样的水平呢? 453 | 454 | 面:之前的工作中有遇到过什么难点吗? 455 | 456 | 面:是你自己解决的吗? 457 | 458 | 我:对,自己解决的,当时周末在家里解决的 459 | 460 | 面:你是哪里人? 461 | 462 | 面:为什么会到杭州来呢? 463 | 464 | 面:有其他同学一起过来吗? 465 | 466 | 面:那么现在是和同学一起租房子吗? 467 | 468 | 面:你父母同意你来杭州吗? 469 | 470 | 面:你是东北哪里的? 471 | 472 | 面:你现在住的地方到这里要多久啊? 473 | 474 | 面:你期望新增是多少? 475 | 476 | 面:你之前薪资是多少? 477 | 478 | 面:你有什么要问我们的? 479 | 480 | 我:咱们的工作时间是如何安排的? 481 | 482 | 我:那么按周来算的呢? 483 | 484 | 我:我面试这个部门有多少成员呢? 485 | 486 | 我:是第一场面试的面试官他是区块链部门的成员吗? 487 | 488 | 面:你之前的团队氛围怎么样? 489 | 490 | 面:之前工作加班情况怎么样? 491 | 492 | 面:你对于团队有什么要求吗? 493 | 494 | 面:有女朋友吗? 495 | 496 | 面:女朋友在哪里工作? 497 | 498 | 面:她是做什么行业的? 499 | 500 | 面:有面试过其他公司吗? 501 | 502 | 面:现在有比较心仪的吗? 503 | 504 | 我:有啊。对于咱们公司还是很有意向的 505 | 506 | 面:除了咱们公司还有吗? 507 | 508 | 面:你已经离职随时上岗是吧? 509 | 510 | 我:如果我有幸加入咱们团队的话,我还有什么需要准备的吗? 511 | 512 | 我:咱们的新增结构是什么样的? 513 | 514 | 我:有什么补贴呢? 515 | 516 | 我:打开有弹性的规则吗? 517 | 518 | 我:一个月有几次补卡的机会? 519 | 520 | 我:全勤奖有多少? 521 | 522 | 面:其它还有什么问题吗? 523 | 524 | 我:其它没有了 525 | 526 | (结束) 527 | 528 | ## 录用电话 529 | 530 | 我:咱们每月薪资是在几号发放? 531 | 532 | 我:一年有几次调薪机会? 533 | -------------------------------------------------------------------------------- /2022-03-29.md: -------------------------------------------------------------------------------- 1 | # 2022-03-29 面试复盘 2 | 3 | ## 第一轮 - 前端面 4 | 5 | 面:vue 的生命周期都有什么? 6 | 7 | 我:(略……) 8 | 9 | 面: vue 响应式原理是什么? 10 | 11 | 我:vue3 使用 ES6 新增的 [proxy](https://tianyuhao.cn/blog/javascript/proxy.html) 进行实现响应式的。 12 | 13 | 面:你上手的时候就是 vue3 了吗? 14 | 15 | 我:我上手的时候是 vue2,vue2 使用的是 [Object.defineProperty()](https://tianyuhao.cn/blog/javascript/methods-object.html) 做代理。 16 | 17 | 面:你现在起项目的时候都是 vue2 还是 vue3? 18 | 19 | 我:我都是使用的 vue3。 20 | 21 | 面:你直接使用的是 vue3 是吧?那你有没有碰到过 vue2 的项目把它升级成 vue3? 22 | 23 | 我:这个我没有,当时我的组件库写的时候是 vue2 的版本,后来我将它升级为 vue3。 24 | 25 | 面:那你可以你在升级过程中碰到哪些坑了呢?因为如果开始比较早的时候升级是会有一些破坏性的,你有碰到过什么坑吗? 26 | 27 | 我:我升级的时候我在去年 8 月份的时候,当时我就说把它的写法都改变了,全部都使用的 script setup 写法写的,包括那些引入什么的 ref,和声明周期都是通过引入的写法使用的。 28 | 29 | 面:还有吗?就是 2 升到 3 对你来说花的最大的精力是在那个地方?或者是那个地方,因为你的升级而导致会画出更多的时间在这上面? 30 | 31 | 我:这我倒是没用踩过什么坑,就是我感觉 vue3 的写法更舒服了。 32 | 33 | 面:那么它舒服在什么地方呢? 34 | 35 | 我:它所有的生命周期函数都是可以通过引入来使用,vue2 里面就是全部都是集成好的,这样打包的话就会体积很小。使用 setup 语法糖的话,写起来会很简洁。 36 | 37 | 面:你原来的组建项目就是说是改写了一次?那么本来打包和后面打包,大概相差多少数量值的?打完包的体积 38 | 39 | 我:打包还在做,还没有做完。 40 | 41 | 面:常用的组件通信有哪几种? 42 | 43 | 我:父子组件通信的方式就是,父组件给子组件传递可以通过属性传递,通过给子组件绑定属性传递;自组建给父组件传递通过 emit 方法传递;兄弟组件可以使用 vue 内置的 provide/inject 那个依赖注入的方法,不管组件嵌套的有多深,只要父组件注入一个依赖,那么不管子组件嵌套的有多深,都可以访问;还有可以通过 vuex 来进行组件通信;vue2 还有新建 bus 的方法可以实现通信,但是 vue3 没用这种方式,它需要下载一个特殊的依赖再进行使用,来实现类似的方法。 44 | 45 | 面:这个特殊的依赖是什么呢? 46 | 47 | 我:这个我了解过,没用真正用过。 48 | 49 | - 注:这两个依赖是 [mitt](https://github.com/developit/mitt) 和 [tiny-emitter](https://github.com/scottcorgan/tiny-emitter) 50 | 51 | 面:没有用过是吧?那比如说 vue 生态中你常用的还有哪些东西呢? 52 | 53 | 我:还有 vite。 54 | 55 | 面:那你能稍微讲一讲 vite 的一些对你来说提效的地方有哪些? 56 | 57 | 我:它主要是启动快,打包快。 58 | 59 | 面:那我在考一个常见的网络题吧,讲一下三次握手和四次挥手 60 | 61 | 我:这个我不太能讲出来。 62 | 63 | 面:三次握手可以讲吗? 64 | 65 | 我:就是客户端先向服务器发送一个请求,然后服务器接收到这个请求,那么服务器接受到这个请求之后呢,客户端不知道服务区到底有没有收到这个请求,然后服务区再给客户端发送一个响应,然后服务端收到这个响应之后再告诉服务区,它们之间像对话一些,对话几次之后,就确定了连接没用问题了。 66 | 67 | 面:更安全的 https 和 http 有什么区别呢? 68 | 69 | 我:我只知道安全的问题。 70 | 71 | 面:那么你只知道它是什么样的协议,然后或者是怎么使用的是吗? 72 | 73 | 我:我知道怎么配置 https 协议,因为我也由域名嘛,在没用配置 ssl 证书的时候,就说 http 协议,配置了证书之后在服务器上部署,就说 https 了 74 | 75 | 面:你现在的服务区上主要部署的是组件库是吧? 76 | 77 | 我:组件库还有博客之类的。 78 | 79 | 面:v-if 和 v-show 有什么区别? 80 | 81 | 我:v-show 是在标签上作用了 display: none 或者 display: block 的属性,它适合经常性的现实和隐藏操作。v-if 是如果 v-if="false" 的时候,那么标签直接在页面中不会渲染,它擅长哪些渲染一次或者很少几次的那种。v-show 适合经常会弹出的东西。 82 | 83 | 面:从性能角度来看,它适合怎样的组件,通常什么样的组件来使用它们? 84 | 85 | 我:类似与提示框组件,就比较适合 v-show,比如登陆的功能,在没有登陆和登陆之后的显现是不一样的,这样的内容就使用 v-if。 86 | 87 | 面:那你讲一下 keep-alive 吧,keep-alive 是什么东西,主要用在什么场景? 88 | 89 | 我:它是可以做缓存的,比如说有选项卡,选项卡下面有列表当你切换了选项卡之后,你再切换会原来的选项卡,它可能就又回到初始的位置了,使用了时候,它就可以还停留在之前的位置上。 90 | 91 | 面:然后它在切换的时候,有哪两个生命周期的钩子函数你知道吗? 92 | 93 | 我:这个我不太清楚。 94 | 95 | 面:vuex 你之前用过是吧?现在主要是 pinia,你可以讲一些 vuex 的工作原理吗? 96 | 97 | 我:会有数据定义在 state 中,然后在所有组件中都可以获取到了。 98 | 99 | 面:vuex 中几个的核心的关键字有什么?都是做什么的呢,然后在组件中都是怎么调用它的呢? 100 | 101 | 我:有 state,Mutation。state 主要是定义数据的,Mutation 是用来修改它的数据,还有些方法是可以异步获取数据的。 102 | 103 | 面:哪些方法是可以异步获取数据的呢? 104 | 105 | 我:那个我忘记怎么读了。 106 | 107 | 面:你熟悉后端的开发逻辑,那么后端你主要是做了什么呀? 108 | 109 | 我:当时投票项目的后端是我做的,当时主要是数据的增删改查还有数据库什么的。 110 | 111 | 面:有几张表呀? 112 | 113 | 我:有一个用户表,还有一个投票的信息表。 114 | 115 | 面:http 常用状态码都是什么意思呢? 116 | 117 | 我:状态码我定义了 201 是请求成功,404 就是资源不存在,500 是服务器的错误,301 重定向。 118 | 119 | 面:你的重定向的怎么做的呀?因为重定向前端也可以重定向,后端也可以重定向,那么你的重定向都是怎么做的呢? 120 | 121 | 我:重定向就是一个用户只能投票一次,如果他输入这个 id 之后,这个后端检测这个 id 一次存在了,那么就返回重定向。 122 | 123 | 面:你是直接返回一个的地址是吗? 124 | 125 | 我:如果用户没用投票,就可以进入投票页面,如果已经投票了,就直接进入结构页面。 126 | 127 | 面:你一开始就使用 TypeScript 了是吗? 128 | 129 | 我:TypeScript 是最近开始做的。 130 | 131 | 面:那么你感觉 TypeScript 给你带来的收益是什么呢? 132 | 133 | 我:我感觉它的代码更健壮了,因为有很多类型的约束。 134 | 135 | 面:TypeScript 有哪些基础类型? 136 | 137 | 我:string 字符串,number 数字,object 对象,array 数组,null,undefined,any,void。 138 | 139 | 面:还有吗?我觉得还有一个挺常用的,枚举的那个,enum。 140 | 141 | 我:哦哦。 142 | 143 | 面:如果想在一个项目中编译 TypeScript 的命令语句是什么? 144 | 145 | 我:当时我运行一个 ts 文件都是使用 node-ts.xxx 来运行测试的。 146 | 147 | 面:TypeScript 当中的模块主要用的是什么? 148 | 149 | 我:这个不了解。 150 | 151 | 面:各位知道在 vue 中有一个叫 Mixins 的东西吗?但是如果 mixins 使用的也别多,然后这个项目还不是你一个人的时候,大家可能就会乱用这个东西,可能就会泛滥,这个你知道怎么解决吗? 152 | 153 | 我:我不太了解。 154 | 155 | - [Mixins 文档在这里](https://v3.cn.vuejs.org/guide/mixins.html#mixin),这我是真一点不知道。。。。 156 | 157 | 面:你的组件库是在这一家公司的经历吗? 158 | 159 | 我:这是我自己做的。 160 | 161 | 面:那么你在 xx(我之前的公司名)主要是做什么呀? 162 | 163 | 我:主要一些 h5 的页面,还有一些前端的项目开发。 164 | 165 | 面:全是 pc 端吗?是他们的主站还后台吗? 166 | 167 | 我:全是 pc,主要是一些外包的项目,主要是和花旗银行合作的。 168 | 169 | 面:你平时的工作和学习是怎么安排的呢? 170 | 171 | 我:下了班之后基本上晚上就是看看书加写写自己的项目。 172 | 173 | 面:你平时有写博客的习惯吗? 174 | 175 | 我:有的。 176 | 177 | 面:感觉用是都用过,很扎实还差一点点。 178 | 179 | 我:呵呵。 180 | 181 | 面:ssr 有了解过吗? 182 | 183 | 我:没怎么了解过。 184 | 185 | 面:路由有了解吧?像 hash 路由和 history 路由了解吗? 186 | 187 | 我:这只是了解一点。在 vue 中启动地址会带#,我只知道是否带#的区别。 188 | 189 | 面:那 history 呢? 190 | 191 | 我:不太了解。 192 | 193 | 面:vue 本身使用的是什么设计模式?是观察者模式还是发布订阅模式呢? 194 | 195 | 我:这个我自己学习时候看视频说过,vue 主要是观察者模式。 196 | 197 | 面:这两种模式的区别有了解吗? 198 | 199 | 我:不了解。 200 | 201 | 面:声明周期里的 computed 和 watch 有什么区别呢? 202 | 203 | 我:watch 是监视一个数据 204 | 205 | 面:可以监视哪一个数据? 206 | 207 | 我:可以随意监视啊,可以监视数字字符串…… 208 | 209 | 面:我的意思是,可以监视的是 data 里的呢?还是 props 210 | 211 | 我:主要监视 data。 212 | 213 | 面:其实 props 也可以监视,还有一个是哪一个是有缓存性的? 214 | 215 | - 注:这里我就很无语,我居然说主要监视 data。。。。 216 | 217 | 我:computed 是有缓存性的。 218 | 219 | 面:你现在使用的 vue 全家桶都是用的哪些吗? 220 | 221 | 我:vite、vue-router、vuex。vue2 中还有 vue-cli、vue-loader 222 | 223 | 结束。 224 | 225 | ## 第二轮 - 技术面 226 | 227 | 面:你之前花旗银行的项目大概做的多久? 228 | 229 | 我:它们每个项目都不大,但是比较多。 230 | 231 | 面:就是比较杂的东西是吧? 232 | 233 | 我:对。 234 | 235 | 面:我看有一个部署上线测试,那么部署的实现过程大概的怎么样的?你们用了一些自动化的工具吗? 236 | 237 | 我:这个没用用到的,部署是使用 winScp 的软件来部署的。 238 | 239 | 面:那么你下一次上传部署是对之前的文件做一个替换吗? 240 | 241 | 我:是的。 242 | 243 | 面:那么上传会停服吗? 244 | 245 | 我:不会的。 246 | 247 | 面:这个组件库是做了有半年时间? 248 | 249 | 我:对。 250 | 251 | 面:你现在说要筹备开发新的组件库是什么意思呢? 252 | 253 | 我:当时做这个组件库的时候,并没有想做这么完善的,当时就是我在网上看到一个做组件库的视频,然后就自己尝试做了三四个,然后发现自己做的还不错,就自己慢慢做的越来越多了,之后就发布了,但是我感觉我的组件库做的没有什么特色,就行重新找一下特色的东西重新构建一个。 254 | 255 | 面:你这块说的特色是指的是设计还是实现呢? 256 | 257 | 我:都有吧。 258 | 259 | 面:我看你的网站性能评分,80~98 分,这个是怎么实现的? 260 | 261 | 我:主要是开始将包的体积进行优化,开始的时候大概是 1.5MB,然后优化到了 800kb,这次优化主要是减少依赖的体积,当时很多的代码段使用的是 highlight.js 的插件,那个包体积特别大,然后我就将需要的抽离出来了,实现按需引入。第二次通过将图片转换成在线的图片了,现在优化到了 500kb 左右。 262 | 263 | 面:你在做组件的时候,你认为最复杂的组件是什么? 264 | 265 | 我:最复杂的是 message 弹窗组件。 266 | 267 | 面:这个是在 pc 上弹窗是吧? 268 | 269 | 我:在 pc 和手机端都可以使用,当然我这个组件是 pc 端的。 270 | 271 | 面:你认为这块复杂的点是在哪里? 272 | 273 | 我:因为弹窗是通过引入之后,点击按钮,然后调用组件库内部的一个函数,然后实现弹窗,这种的不像是使用父子组件通信使用 props 传参,它这种需要用到的是 vue3 内置的 h 函数和 render 函数,主要是考 js 来实现的,然后再将传递的参数渲染到组件里面去。 274 | 275 | 面:弹窗有个管理过程吗?比如说连续弹出 10 次或者 20 次,的先后顺序? 276 | 277 | 我:这个没有的。 278 | 279 | 面:如果我要给弹出的信息,要是不是纯文本,比如说弹出的是有图片的话,这个可以吗? 280 | 281 | 我:现在只能是纯文本。 282 | 283 | 面:那么纯文本的话,有没用字数的限制?最多传递多少个? 284 | 285 | 我:这个我做的限制是如果过长就自动换行。 286 | 287 | 面:它是宽高是会随着内容自动撑开的是吧?那么它能定位弹出左上角左下角之类的功能吗? 288 | 289 | 我:message 弹出不能,Notification 的提示框是可以的。 290 | 291 | 面:那么你说的这个和 message 提示框是一样的吗? 292 | 293 | 我:它俩是一样的,用的是一个函数的文件。 294 | 295 | 面:逻辑是一样的,只是最终弹出的效果是不一样的是吧? 296 | 297 | 我:是的。 298 | 299 | 面:那么它其实是两个组件是吧? 300 | 301 | 我:是的。 302 | 303 | 面:你认为这块复杂,是因为使用了 vue3 的 h 函数和 render 函数吗? 304 | 305 | 我:嗯嗯。 306 | 307 | 面:除了这个组件,还有哪些组件比较麻烦的? 308 | 309 | 我:基本上静态的组件,都是比较简单的,都是通过传参实现的,像这种提示框,还有确认框,弹出类的组件都是比较复杂的。 310 | 311 | 面:组件的层级管理是怎么做的? 312 | 313 | 我:层级管理是弹出组件有层级管理,比如一个按钮点击了弹出第一层,那么弹出层里面又有一个按钮,那么点击之后又可以弹出第二层,这样是可以的。 314 | 315 | 面:那么第二层和第一次的区别是,你会去改变层级值还是通过其它方式改变的? 316 | 317 | 我:通过层级值。 318 | 319 | 面:那么层级值每次都是加一吗? 320 | 321 | 我:这个我没用具体做过加一什么的,但是我测试是没有问题的。 322 | 323 | 面:也就是说它是靠浏览器自己的能力去做的一件事是吧?那么你这个项目在做的工程中有没用其他同学参与进来啊? 324 | 325 | 我:有的。 326 | 327 | 面:这两个小伙伴也都是你们公司的吗? 328 | 329 | 我:不是的,都是在开原社区里认识的。 330 | 331 | 面:那么你们三个都主要是怎么分工的? 332 | 333 | 我:我是主要做项目的组件的开发,还有一个是配置的开发,他配置了 eslint,还有提交规范,代码格式化规范,另一个他主要是给我们一些技术支持,他会指出我们做的哪里有问题之类的,或者一些新技术之类的。 334 | 335 | 面:他更多扮演的是一个帮助你们测试还有提出一些建议,但是真正动手做的主要你和另一个同学是吧? 336 | 337 | 我:是的。 338 | 339 | 面:那么你们三个会开会吗?对组件做一些评审或者一些规范之类的? 340 | 341 | 我:规划的话就是通过聊天的方式去说哪里有问题,然后会在项目中新建一个目前存在的问题的文件,会按按照那个问题,以后会做什么优化,现在哪个组件有什么 bug,会列出来,然后按照清单进行优化。 342 | 343 | 面:那么你做组件到现在遇到的最棘手的一些 bug 有什么呢? 344 | 345 | 我:组件倒是没用什么,但是在升级项目的时候还是有一些问题的,当时我上传的项目就是一个 vue3 的项目,然后我在社区里接触了 monorepo 的开发方式,当时从 vue3 的项目进行升级的时候,是遇到很多问题的。 346 | 347 | 面:这块比较繁琐,是因为升级项目中功能和旧版本的兼容问题和改造问题是吧? 348 | 349 | 我:这倒不是,主要是当时我们名不了解这种的项目的构建和使用,后来我们在网上边学习边升级。 350 | 351 | 面:那么现在的组件管理方式大概是怎么管理的?本地开发,到官网,到发布?还是靠手动打包上传的? 352 | 353 | 我:打包都是我手动上传的。 354 | 355 | 面:那么如果你上传的包和你合作的小伙伴的打包冲突了怎么办? 356 | 357 | 我:现在发包都是我来发。 358 | 359 | 面:就是你把发包的权利控制在自己手里是吧? 360 | 361 | 我:是的。 362 | 363 | 面:在花旗这边的时候,你们前端是多少人? 364 | 365 | 我:两个人。 366 | 367 | 面:他也是刚刚毕业吗? 368 | 369 | 我:他工作一年了。 370 | 371 | 面:那么你这次走,他有没有也有像离职的想法? 372 | 373 | 我:他并没有。 374 | 375 | 面:他还想继续干下去是吗? 376 | 377 | 我:对。 378 | 379 | 面:你们平时项目开发的话,这个需求产生到上线的流程是怎么样的? 380 | 381 | 我:之前在公司的流程还比较简单的,我们的 AE,她接到花旗银行的项目之后,会有一个文档,告诉我怎么做,都有什么功能,然后设计会开始做图,我就按照设计做出来,写出功能,写完之后先给 AE 进行测试。 382 | 383 | 面:这个 AE 扮演的角色就像是一个项目经历+测试是吧?那么这个文档是她写的吗? 384 | 385 | 我:文档是花旗那边给的。 386 | 387 | 面:如果有什么功能需要确认的话,也是她进去确认是吧? 388 | 389 | 我:是的。 390 | 391 | 面:她将是一个需求的接口人,加上一个项目的测试和验收是吧?那么你和后端都是怎么合作的呢? 392 | 393 | 我:后端就是另一个小伙伴,他其实更精通于后端,他也是前端也可以做,我刚到的时候,他教了我一些后端,然后花旗银行的后端也是我写的,有些更复杂的就是他来写。 394 | 395 | 面:你们后端使用的语言是什么? 396 | 397 | 我:PHP。 398 | 399 | 面:那么你们团队的 50 多个人,剩下的人都是干什么的? 400 | 401 | 我:因为主要是做电商的,分成很多模块,有做电商直播的,还有开发的,还有做广告的,还有做设计的。 402 | 403 | 面:那么你们不同的业务线和不同的产品线直接是互相独立的是吧? 404 | 405 | 我:也部署,有些广告那边会接到一些 h5 的页面,然后我们帮忙做一下。 406 | 407 | 面:但是这家工作本质上并不是花旗银行自己的子公司,只是接到花旗的需求去做实现的 408 | 409 | 我:对的。 410 | 411 | 面:那些电商的项目是和花旗没用关系的是吧? 412 | 413 | 我:是的。 414 | 415 | 面:业务属于是有的是自己的业务,有的是你们公司业务。那么最盈利的业务是什么呢? 416 | 417 | 我:广告。 418 | 419 | 面:这个项目是长期可以接到是吧? 420 | 421 | 我:是的是的。 422 | 423 | 面:这个投票项目面向的员工是谁呢? 424 | 425 | 我:是花旗的内部员工。 426 | 427 | 面:就是它们内部的投票系统,然后给到你们公司来做是吧? 428 | 429 | 我:是的。 430 | 431 | 面:那么一个投票为什么要开发这么久啊?投票的复杂点是在哪里啊? 432 | 433 | 我:它并不是很复杂,主要是改动的次数比较多。经常会有改版和小更新之类的。 434 | 435 | 面:了解了也就是说他们是甲方,你们是乙方,很多项目的周期变得很长,就是大部分的时机都是做改动了是吧?那么如果说他不是一个外包项目的话,那么自己内部做是很快的吧? 436 | 437 | 我:是的。 438 | 439 | 面:这就是做外包项目比较难做的点。那么你平时学前端的话都是通过什么渠道啊? 440 | 441 | 我:看书、看文档、看视频。 442 | 443 | 面:你平时做代码调试的时候的时间多吗?比如调试到一两点的时候? 444 | 445 | 我:倒是没有。 446 | 447 | 面:毕业之后做前端,当时是一个什么样的契机做的前端啊? 448 | 449 | 我:我学的就是这个专业。 450 | 451 | 面:你们学校教这个专业吗? 452 | 453 | 我:对,我们学校教的就是这个专业。 454 | 455 | 面:教前端我倒是很少听说。主要就是教前端是吧? 456 | 457 | 我:对,就是教前端的。 458 | 459 | 面:这倒是有点意思,很少有见到学校就是教这专业的。那么你们当时同一批的学生多吗? 460 | 461 | 我:40 个人。 462 | 463 | 面:那么它这个还可以,我感觉能有学校教这个还是很不错的。那么接下来我叫后端的人过来和你聊一聊。 464 | 465 | 我:好。 466 | 467 | 结束。 468 | 469 | ## 第三轮 - 后端面 470 | 471 | 面:你在上一家公司的收获有什么? 472 | 473 | 我:也了解一些后端和服务器的知识,了解了不少前端的新生事物。 474 | 475 | 面:有没有让你在项目中印象深刻的事情? 476 | 477 | 我:有时候第一次自己做出了全栈的东西还有数据打通还是挺高兴的。 478 | 479 | 面:你们和后端的协作方式是怎样的啊? 480 | 481 | 我:前端和后端是分离的嘛,然后通过在线的接口进行访问。 482 | 483 | 面:协作的过程是怎么样的? 484 | 485 | 面:会给你提供 mock 接口吗? 486 | 487 | 面:你们现在的协作方式有没有可以优化的地方? 488 | 489 | 面:怎么样可以一个高效的协作?就是让你作为前端可以更爽、更顺利一些? 490 | 491 | 面:你为什么会离开那边呢? 492 | 493 | 我:因为前端的项目并不是很多,也比较简单,所以想要做一些比较有挑战性的项目。 494 | 495 | 面:你怎么定义有挑战的项目?有些的功能多,有些是性能方面,有些是体验方面。 496 | 497 | 我:功能多的。 498 | 499 | 面:我们做的并不是一个很庞大的项目,功能没用那么多,我们主要体现在性能方面和交互上面,要求非常非常多,可能在功能模块上要求并没有那么多,其实也是比较简单的,就是这样子,那么技术方面他对你也是比较认可的。那么你未来要是可以过来的话,接手的肯定就是这种项目,你可以吗? 500 | 501 | 我:我可以的。 502 | 503 | 面:你为什么认识功能多就是有挑战呢,那种就是日复一日的代码啊,并没用实际技术上的提上啊。 504 | 505 | 我:啊,哈哈哈 是的。 506 | 507 | 面:其实真正的提升是在交互上和性能上。 508 | 509 | 我:是的是的。 510 | 511 | 面:你在那边的薪资是怎么样的? 512 | 513 | 我:这个不太方便透露哦。 514 | 515 | 面:那么你的期望薪资是多少? 516 | 517 | 我:期望 14K。 518 | 519 | 面:如果要是可以,你什么时候可以入职? 520 | 521 | 我:最快要下周一。 522 | 523 | 面:因为那边还没用办理离职是吗? 524 | 525 | 我:已经办理离职了。 526 | 527 | 面:会有自己的事情是吧? 528 | 529 | 我:是的。 530 | 531 | 面:如果让你去维护一个项目,这个项目可能会由很大的坑在里面,你会去怎么做? 532 | 533 | 我:是报错类型的吗? 534 | 535 | 面:可能在性能,可能在语法,也可能是语法之类的。 536 | 537 | 我:就说像性能优化的更好? 538 | 539 | 面:对对对。 540 | 541 | 我:有句话叫:用最少的代码实现一样的效果。 542 | 543 | 面:如果这个项目你会选择怎么去优化? 544 | 545 | 我:我会选择重写。 546 | 547 | 面:一般都是选择重写,都是放弃治疗,哈哈哈哈。 548 | 549 | 我:哈哈哈。 550 | 551 | 面:我没用别的什么问题。要不你这样,你先回去,我这边会和人事那边沟通一下,如果没有问题,他应该会今天或者明天给你通知,好吧? 552 | 553 | 我:好。 554 | 555 | 结束 556 | --------------------------------------------------------------------------------