面试题是大厂精选的单面面试题,大家谷歌基本都能找到。通过刷题,基本上85%以上就可以了。但是当你到了第二面的时候,你会发现难度白白增加了。一道题涉及的技术点很多,网上很少能找到原题,因为第二面的题大多是从工作中提炼出来的技术点,要求考生通过自己的想象力和技术实力设计解决方案。是对应聘者前端能力的考验。问题一:你在nodejs开发过程中处理过哪些windows和mac的平台兼容问题?水平只是从官网下载例子,随便运行一下。感觉nodejs其实也不过如此。其实如果你真的通过nodejs开发过大型工程工具cli,你会发现windows、mac等系统存在很多兼容性问题,甚至nodejs官网的API都是有问题的,不可信。随便列几个点,欢迎补充:兼容环境变量设置,使用cross-env,因为export和set有系统差异,windows不支持&,并行执行npm-script,使用npm-run-all或者并发异步同步:util.promisify+async/await不要直接使用官网的fs.readFileSync,使用fs-extra而不是拼接路径使用path.join,Unix是/,Windows是\还有很多,有更多就懒得写了好的答案或者想法请在本主题对应的github下留言:https://github.com/airuikun/Weekly-FE-Interview/issues/33问题2:设计一个方案,在浏览器中点击一个按钮,就可以在你的前端项目源码文件中添加一个index.js文件,如何实现?出题难度:阿里的p6~p7题是典型的大厂双面题。大家都知道,由于安全限制,浏览器不能直接操作你电脑中的文件系统,但是这道题让你在你的前端项目代码文件中点击一个按钮生成一个文件,那么如何实现呢?其实你看很多跨平台包的core核心文件,你会发现它们的实现原理都差不多,都是约定一个规范,然后实现一个权限穿透的桥梁。写的太多了,大家可以自己研究。还有一种思路,涉及到npm+cli+nodeserver的实现。首先实现一个npm插件,在bin中注册一个命令,当你在前端项目中运行npmrunstart时,调用这个命令,使用这个命令启动一个node-dev-server,然后请求这个node-dev-server通过http请求服务器创建index.js文件。其实这道题也有很简单的解法,有的简单有的难,而且很灵活。当然,你的答案越难越深,越能体现你的创造力和实力。如果大家有更好的想法或者问题,欢迎在本主题对应的github下留言:https://github.com/airuikun/Weekly-FE-Interview/issues/34问题3:如果是实习生,他是本地的git的一个分支被误删,A分支的代码没有推送到远程。如何查找A:阿里p6~p6+之前的提交记录和代码难度,误删除分支导致代码丢失的错误经常出现在实习生和新入职的人身上,如果你是主coder或者project一个前端团队的leader,一定要对git非常熟悉,否则经常会出现误删代码、丢失代码等问题。你怎么解决这个问题?如果你有更好的答案或者想法,请在本题对应的github下留言:https://github.com/airuikun/Weekly-FE-Interview/issues/35问题四:如果用nodejs实现爬虫服务器IP被指定网站封禁,如何解封?难度:阿里p6~p7如果用nodejs实现爬虫爬取网站内容,很可能会被别人的反爬虫机制屏蔽掉。当然,有多种解决方案。我从来没有做过大型的、完善的爬虫服务,但是我做过一个小型的。这种情况我的解决办法是做几层ip池。当爬取失败时,ip会自动随机切换。为了绕过代理池的封锁,我简单写一下ip代理实现原理的伪代码。其实就是用nodejs实现一个代理,很简单http.createServer((req,res)=>{request(`http://xxx/${req.url}`,{proxy:"xxx.xxx.xxx:xxx"},function(error,response,body){if(!error&&response.statusCode==200){res.end(body);}else{console.log(error);}});}).listen(8888,()=>{console.log('run')});问题5:用nodejs将base64转png文件难度:阿里p5~p6constfs=require('fs');constpath='xxx/'+Date.now()+'.png';constbase64=data.replace(/^data:image\/\w+;base64,/,"");//去掉图片前面部分的base64代码data:image/png;base64constdataBuffer=newBuffer(base64,'base64');//转换base64代码写入一个buffer对象,fs.writeFile(path,dataBuffer,function(err){//使用fs写入文件if(err){console.log(err);}else{console.log('Writesuccessful!');}})一般如果你做出来了,base64转换成png文件,面试官会问你从一个实例推断其他情况到另一个,会问你:实现png的转换文件转成base64,来小子,实现constfs=require("fs");constutil=require("util");constimageData=awaitutil.promisify(fs.readFileSync(fileUrl)));//例子:xxx/xx/xx.pngconstimageBase64=imageData.toString("base64");constimagePrefix="data:image/png;base64,";console.log(imagePrefix+imageBase64);问题6:请设计一个方案:npm插件有a、b、c三个,会经常更新。前端项目npmrunstart启动后,要求a、b、c三个npm插件自动更新到最新版本难度:阿里p5+~p6+的实现方案很多。这里有一个思路:自己实现一个x插件,注册一个名为xxx的全局命令,在npmrunstart时并行执行xxx命令,xxx命令会通过npminfo调用a,b,c三个插件最新的信息,分别截取版本,然后和本地三个插件的版本进行对比。如果您发现差异,请转到更新。如果你有更好的答案或想法,请在本题对应的github下留言:https://github.com/airuikun/Weekly-FE-Interview/issues/38问题7:大文件传输问题:服务器A有一个1000G的文件,需要通过B服务器转发给C服务器,但是B服务器只有1内存Ag,如何实现大文件传输难度:阿里p6+~p7+这道题首先要实现文件的转发在内存不足的情况下流。当你回答问题时,面试官肯定会问你。如何断点续传?在整个过程中,您还能想到哪些其他问题?怕代码太长就不贴了。自己想一想,欢迎告诉我们你的实现思路。问题八:如何实现内网穿透和端口转发?难点:阿里p5+~p6+针对端口转发这个经典问题,专门写了一篇文章,轻松搞笑,通俗易懂。大家可以看看放松一下《小蝌蚪传记:端口转发——夜店传说》地址:https://github.com/airuikun/blog/issues/6
