草庐IT

前端:说说工作中解决过的印象比较深刻的问题

欲速则不达 2023-03-28 原文

本文以本人有限的经历提供一些思路,实际真的有解决过比较棘手的问题的同学就没什么看的必要了。

我认为这个问题主要考察的一方面是求职者解决问题的能力,另一方面是求职者的总结复盘能力,有时还考察求职者是否对技术有关注和接触。这类主观题我觉得可以针对JD的要求去贴近招人需求。

平时忙于业务开发的同学,有时很容易忽略一些问题,或者有时急着完成需求和修复bug,解决问题后没及时记录下来,本文就起个抛砖引玉的作用,列举一些比较通用型的问题。

按钮重复点击的问题

其实这场景应该还蛮容易遇见的,所以我觉得比较适合做前端年限不太长比如一两年的同学来作为备选。

有时因为网络问题,或者手机性能问题,或者一些未知原因,导致用户点击按钮的操作没有及时得到响应,用户下意识的就会频繁重复点击。

如果该按钮的点击回调是去调用接口,假设用户频繁点击,不可避免的就会给服务器造成压力,最简单的处理就是在用户点击之后设置按钮为不可点击,等到接口有返回后再将按钮状态重置;如果接口没有合适的返回,为了防止因网络等原因导致的没有响应,也可以前端设置定时,使用户操作控制在一定的频率,比如发送验证码这种场景。

如果该按钮的点击回调是打开一个弹窗,频繁点击的后果可能就是打开一串的弹窗,当然也可以给按钮设置状态标记字段或者定时,此时就可以结合节流与防抖作答,正好面试中也很容易遇到节流与防抖的问题,化被动为主动更好把握面试节奏,当然前提就是对这方面的内容有所准备。

如果该按钮是与原生有交互,比如本人曾经遇到过调用原生打开新的webview或者其他app,如果原生因为某些系统原因没有及时打开,节流防抖也做了,但是如果响应延迟很久,用户可能在页面上做其他操作了,此时如果之前打开新的webview或者其他app有了响应,就有可能同时出现多个操作的交互反馈,造成混乱,后来的解决方案还是做了字段标记,在第一次打开webview的操作就作标记,如果此标记没重置(没打开新的appview),就不响应后续此页面上的其他交互,这在使用逻辑上可能有些不太合理,但是打开webview和其他app的操作原生无法取消,当时还没想到比较好的其他处理方案。

轮询接口的问题

此类场景也还算常见,适合两三年、三四年的同学作为备选。

有时我们会遇到一些需求,比如页面要定时获取最新的数据,如用户积分、app内消息通知,一般简单的处理就是使用接口轮询,定时调用后端接口,如果应用的流量不大、使用的用户不多,这么处理也没什么大问题。

但实际这样做会使请求过多,占用服务器资源,出于优化思考,可以考虑websocket,就可以提前对websocket做一些了解学习,如果项目实际开发中有使用经验就更好了。

单次加载图片过多的问题

这个问题通常发生在移动端,尤其图片体积偏大时,可能影响其他请求的发送。

比较常见的就是列表,往往这些列表的数据是用户在后台上传的,因此如果用户传一些高清图,就可能导致图片体积过大,图片压缩当要做,同时在移动端,我们也可以做图片懒加载,只渲染进入可视区域的图片,等待图片即将进入可视区域时再进行加载;现在移动端列表一般会做分页,也就是常见的上拉加载,一次不会加载太多图片,如果对性能要求比较高的时候也可以加上懒加载。

如果图片托管在OSS平台,也可以在链接后面追加处理参数(x-oss-process),对返回的图片的大小和尺寸进行限制,也是一种方法。

移动端适配问题

移动端老生常谈的问题了,css中的相对单位,常用方案rem可以说,配合了解一些webpack插件。

也可以说说vw、vh,屏幕分辨率,浏览器视口。

移动端兼容问题

移动端手机型号多,尤其安卓机型,或多或少会碰到这类问题,但这些问题又不能一概而论。

如果有同学解决过较多这方面的问题,但是平日里没有整理过,可以提前做一些整理,去mdn、caniuse等网站针对做一些补充完善,就可以在面试时发挥了。

应用性能问题

如果实在工作开发中没碰到过什么大的问题,还可以有个万能的回答,就是对应用性能进行优化,我看很多JD里也会希望候选人有性能优化方面的经验,正好可以对应上。

随着需求迭代,项目代码不可避免会增多,打包体积随之增加,用户首次打开应用也会变慢。这个问题可以从多方面着手去作答。

从交互层面,可以做骨架屏,使得页面首次加载不会长时间白屏,也能让用户预先知道页面的分布;或者增加一些等待的交互。

从代码层面,可以提取公用代码、通用代码,抽取出来做成公用函数,或者封装成组件,业务组件或者基础组件。

从构建工具方面,比如webpack,可以提前了解它的一些配置,比如代码压缩、代码拆分、tree-shaking、懒加载。

从性能工具方面,比如lighthouse,量化指标,根据提供的建议进行调优,可以提前了解一些代码和性能分析工具。

从网络请求方面,比如用户端设置缓存,可以提前预备强缓存和协商缓存方面的储备知识,一方面减少用户请求,一方面及时更新缓存;使用CDN等等。

从技术方面,可以准备微前端等相关知识。

线上问题定位

对于前端来说有个很头疼的问题,就是线上问题,不想后端一样可以有线上日志,前端问题出现在客户端时我们不知道发生了什么,用户操作了什么,就算可以联系到用户,有时他们也不一定记得自己做了什么,而往往很多时候知道原因就很容易解决问题了,难的就是不知道导致问题的原因。

这个问题我大概是五六年前的时候第一次碰见,很紧急的一个线上支付问题,前端反反复复盲改,一直没改好了,后来加了错误捕获,再通过调用接口获取到错误信息,才知道原因是什么;后来换了工作在新公司中接触到埋点,才开始了解到这一块的东西,不过当时公司的埋点主要用于用户行为分析,在用户进行一些交互操作,比如点击、进入页面、登录时,将用户行为数据上报给埋点平台,数据分析的同学会利用这些数据进行统计,可以给运营同学做一些运营策略的参考,给产品经理规划需求时做参考。

再后来在工作中又接触到监控平台sentry,使用它将应用中捕获到的错误上报给平台,在sentry平台可以看到哪些错误是比较频发的,还可以直观的看到在抛出错误时上报的相关数据,比如操作系统、用户标识、ip、错误信息等等,还可以看到问题是在哪些时间段频发,从而可以确认新发的包是否解决了之前的问题;当然还有很多功能我用的不怎么多还不知道。

如果有同学想把这个问题作为备选,可以提前了解前端的埋点和监控平台。

其实我觉得埋点的核心一个是前期将需要的数据通过接口上报,不管是用户行为数据还是错误信息数据;另一个是后期解决后确认是否该问题不会出现或者被控制在一定范围内。

手动打包问题

我最早待过的一家公司是开发自己手动打包,然后将包发给运维部署,这很容易出错,众所周知,我们通常是拉分支做需求的,如果在做新需求时要切换到旧分支,流程繁琐,很容易误操作,存在安全隐患,也影响新需求的开发效率和进度,后来我们运维就自己搞了一套自动化构建的东西,当时我也没有接触。

后来换了一家公司,接触到jenkins,才开始对自动化构建有一些了解。

如果岗位的JD有这方面的偏好,就可以从自动化构建、CICD方面做一些准备。

工作效率问题

一个是上述的手动打包问题可以说,还可以发挥的地方有,如果项目代码过多,影响构建效率,当我们的代码还在测试阶段时,有时候改bug可能要频繁构建,如果构建慢就很影响测试进度,甚至有时构建慢影响到紧急bug的修复上线,此时可以针对构建工具比如webpack做一些相关配置,相应的就是要对webpack的相关配置提前有所了解。

也可以说说单测,前提是去了解下常用的单元测试工具。

还可以从代码规范着手,讲讲eslint、husky等,提高团队的协作效率;做学习工作方面的分享,提升技术的同时防止一些问题的重复发生;提取公用代码,减少重复劳动。等等。

有关前端:说说工作中解决过的印象比较深刻的问题的更多相关文章

  1. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  2. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  3. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

  4. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  5. ruby - Ruby 的 Hash 在比较键时使用哪种相等性测试? - 2

    我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。

  6. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

    我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

  7. ruby - 通过 RVM (OSX Mountain Lion) 安装 Ruby 2.0.0-p247 时遇到问题 - 2

    我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search

  8. ruby - Fast-stemmer 安装问题 - 2

    由于fast-stemmer的问题,我很难安装我想要的任何ruby​​gem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=

  9. ruby-on-rails - rspec should have_select ('cars' , :options => ['volvo' , 'saab' ] 不工作 - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request

  10. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

随机推荐