游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

前端工程师常见面试题(前端进阶)前端工程化

  Babel的原理是什么?
  参考回答:
  babel的转译过程也分为三个阶段,这三步具体是:
  o解析Parse:将代码解析生成抽象语法树(即AST),即词法分析与语法分析的过程
  o转换Transform:对于AST进行变换一系列的操作,babel接受得到AST并通过babeltraverse对其进行遍历,在此过程中进行添加、更新及移除等操作
  o生成Generate:将变换后的AST再转换为JS代码,使用到的模块是babelgenerator
  如何写一个babel插件?
  参考回答:
  Babel解析成AST,然后插件更改AST,最后由Babel输出代码
  那么Babel的插件模块需要你暴露一个function,function内返回visitormodule。exportfunction(babel){return{visitor:{}}}
  visitor是对各类型的AST节点做处理的地方,那么我们怎么知道Babel生成了的AST有哪些节点呢?
  很简单,你可以把Babel转换的结果打印出来,或者这里有传送门:ASTexplorer
  这里我们看到constresult12中的11是一个BinaryExpression节点,那么在visitor中,我们就处理这个节点varbabelrequire(babelcore);vartrequire(babeltypes);constvisitor{BinaryExpression(path){constnodepath。node;letresult;判断表达式两边,是否都是数字if(t。isNumericLiteral(node。left)t。isNumericLiteral(node。right)){根据不同的操作符作运算switch(node。operator){case:resultnode。left。valuenode。right。value;breakcase:resultnode。left。valuenode。right。value;break;case:resultnode。left。valuenode。right。value;break;case:resultnode。left。valuenode。right。value;break;case:letinode。right。value;while(i){resultresultnode。left。value;resultresultnode。left。value;}break;default:}}如果上面的运算有结果的话if(result!undefined){把表达式节点替换成number字面量path。replaceWith(t。numericLiteral(result));}}};module。exportsfunction(babel){return{visitor};}
  插件写好了,我们运行下插件试试constbabelrequire(babelcore);constresultbabel。transform(constresult12;,{plugins:〔require(。index)〕});console。log(result。code);constresult3;
  与预期一致,那么转换constresult12345;呢?
  结果是:constresult3345;
  这就奇怪了,为什么只计算了12之后,就没有继续往下运算了?
  我们看一下这个表达式的AST树
  你会发现Babel解析成表达式里面再嵌套表达式。
  表达式(表达式(表达式(表达式(12)3)4)5)
  而我们的判断条件并不符合所有的,只符合12
  判断表达式两边,是否都是数字
  if(t。isNumericLiteral(node。left)t。isNumericLiteral(node。right)){}
  那么我们得改一改
  第一次计算12之后,我们会得到这样的表达式
  表达式(表达式(表达式(33)4)5)
  其中33又符合了我们的条件,我们通过向上递归的方式遍历父级节点
  又转换成这样:
  表达式(表达式(64)5)
  表达式(105)
  15hr如果上面的运算有结果的话
  if(result!undefined){
  把表达式节点替换成number字面量
  path。replaceWith(t。numericLiteral(result));
  letparentPathpath。parentPath;
  向上遍历父级节点
  parentPathvisitor。BinaryExpression。call(this,parentPath);
  }
  到这里,我们就得出了结果constresult15;
  那么其他运算呢:
  constresult1001050constresult60;
  constresult(1002)50constresult100;
  constresult(((1002)502)50)2constresult9;你的git工作流是怎样的?
  参考回答:
  GitFlow是由VincentDriessen提出的一个git操作流程标准。包含如下几个关键分支:master主分支develop主开发分支,包含确定即将发布的代码
  feature新功能分支,一般一个新功能对应一个分支,对于功能的拆分需要比较合理,以避免一些后面不必要的代码冲突
  release发布分支,发布时候用的分支,一般测试时候发现的
  bug在这个分支进行修复hotfixhotfix分支,紧急修bug的时候用
  GitFlow的优势有如下几点:
  并行开发:GitFlow可以很方便的实现并行开发:每个新功能都会建立一个新
  的feature分支,从而和已经完成的功能隔离开来,而且只有在新功能完成开发的情况下,其对应的feature分支才会合并到主开发分支上(也就是我们经常说的develop分支)。另外,如果你正在开发某个功能,同时又有一个新的功能需要开发,你只需要提交当前feature的代码,然后创建另外一个feature分支并完成新功能开发。然后再切回之前的feature分支即可继续完成之前功能的开发。
  协作开发:GitFlow还支持多人协同开发,因为每个feature分支上改动的代码
  都只是为了让某个新的feature可以独立运行。同时我们也很容易知道每个人都在干啥。
  发布阶段:当一个新feature开发完成的时候,它会被合并到develop分支,这
  个分支主要用来暂时保存那些还没有发布的内容,所以如果需要再开发新的feature,我们只需要从develop分支创建新分支,即可包含所有已经完成的feature。
  支持紧急修复:GitFlow还包含了hotfix分支。这种类型的分支是从某个已经发
  布的tag上创建出来并做一个紧急的修复,而且这个紧急修复只影响这个已经
  发布的tag,而不会影响到你正在开发的新feature。
  然后就是GitFlow最经典的几张流程图,一定要理解:
  feature分支都是从develop分支创建,完成后再合并到develop分支上,等待发布。
  当需要发布时,我们从develop分支创建一个release分支
  然后这个release分支会发布到测试环境进行测试,如果发现问题就在这个分支直接进行修复。在所有问题修复之前,我们会不停的重复发布测试修复重新发布重新测试这个流程。
  发布结束后,这个release分支会合并到develop和master分支,从而保证不会有代码丢失。
  master分支只跟踪已经发布的代码,合并到master上的commit只能来自release分支和hotfix分支。
  hotfix分支的作用是紧急修复一些Bug。
  它们都是从master分支上的某个tag建立,修复结束后再合并到develop和master分支上。rebase与merge的区别?
  参考回答:
  gitrebase和gitmerge一样都是用于从一个分支获取并且合并到当前分支。
  假设一个场景,就是我们开发的〔featuretodo〕分支要合并到master主分支,那么用rebase或者merge有什么不同呢?
  omarge特点:自动创建一个新的commit如果合并的时候遇到冲突,仅需要修改后重新commit
  o优点:记录了真实的commit情况,包括每个分支的详情
  o缺点:因为每次merge会自动产生一个mergecommit,所以在使用一些git的GUItools,特别是commit比较频繁时,看到分支很杂乱。
  orebase特点:会合并之前的commit历史
  o优点:得到更简洁的项目历史,去掉了mergecommit
  o缺点:如果合并出现代码问题不容易定位,因为rewrite了history
  因此,当需要保留详细的合并信息的时候建议使用gitmerge,特别是需要将分支合并进入master分支时;当发现自己修改某个功能时,频繁进行了gitcommit提交时,发现其实过多的提交信息没有必要时,可以尝试gitrebase。gitreset、gitrevert和gitcheckout有什么区别
  参考回答:
  这个问题同样也需要先了解git仓库的三个组成部分:工作区(WorkingDirectory)、暂存区(Stage)和历史记录区(History)。
  o工作区:在git管理下的正常目录都算是工作区,我们平时的编辑工作都是在工作区完成
  o暂存区:临时区域。里面存放将要提交文件的快照
  o历史记录区:gitcommit后的记录区
  三个区的转换关系以及转换所使用的命令:
  gitreset、gitrevert和gitcheckout的共同点:用来撤销代码仓库中的某些更改。然后是不同点:
  首先,从commit层面来说:
  ogitreset可以将一个分支的末端指向之前的一个commit。然后再下次git执行垃圾回收的时候,会把这个commit之后的commit都扔掉。gitreset还支持三种标记,用来标记reset指令影响的范围:
  1mixed:会影响到暂存区和历史记录区。也是默认选项
  1soft:只影响历史记录区
  1hard:影响工作区、暂存区和历史记录区
  注意:因为gitreset是直接删除commit记录,从而会影响到其他开发人员的分支,所以不要在公共分支(比如develop)做这个操作。
  1gitcheckout可以将HEAD移到一个新的分支,并更新工作目录。因为可能会覆盖本地的修改,所以执行这个指令之前,你需要stash或者commit暂存区和工作区的更改。
  ogitrevert和gitreset的目的是一样的,但是做法不同,它会以创建新的commit的方式来撤销commit,这样能保留之前的commit历史,比较安全。另外,同样因为可能会覆盖本地的修改,所以执行这个指令之前,你需要stash或者commit暂存区和工作区的更改。
  然后,从文件层面来说:
  ogitreset只是把文件从历史记录区拿到暂存区,不影响工作区的内容,而且不支持mixed、soft和hard。
  ogitcheckout则是把文件从历史记录拿到工作区,不影响暂存区的内容。
  ogitrevert不支持文件层面的操作。webpack和gulp区别(模块化与流的区别)
  参考回答:
  gulp强调的是前端开发的工作流程,我们可以通过配置一系列的task,定义task处理的事务(例如文件压缩合并、雪碧图、启动server、版本控制等),然后定义执行顺序,来让gulp执行这些task,从而构建项目的整个前端开发流程。
  webpack是一个前端模块化方案,更侧重模块打包,我们可以把开发中的所有资源(图片、js文件、css文件等)都看成模块,通过loader(加载器)和plugins(插件)对资源进行处理,打包成符合生产环境部署的前端资源。

开封菊花文化节老牌展会历久弥新菊花专题作者韶月开封,一座浸润了菊花馨香的城市,一座历史悠久的中国菊花名城。开封是菊花的发源地,是《菊谱》的问世地,也是菊花展览的创始地。2010年至今,围绕菊花这一主题,开封创……买它不掉坑4款3040万纯电精品轿车【太平洋汽车导购频道】市场上,有越来越多新能源车涌现,不管是合资车企的发力还是自主新势力的高端化,都让3040万元的新能源市场欣欣向荣。不过,想要买到称心的车型并不容易,需要横……住宅代理IP在网络攻击中的作用近期FBI警告说,网络犯罪分子使用住宅代理IP进行大规模撞库攻击而攻击源却不被跟踪、标记的趋势正在上升。该警告是联邦调查局的互联网犯罪投诉中心(IC3)上作为私营行业通知……致敬青春,我的,也是你的!青春的岁月,思维像野草般疯长,没有尽头!没有搞不定的事情,没有处不好的哥们,走到哪里哥儿都是一根梁,还是栋梁!踏出校门,走出传说的象牙塔,以为自己就像象牙一样靓丽和……全球十大顶尖的智能制造小国一、韩国韩国是全球智能制造的强国之一。韩国制造业曾排名全球第六。韩国制造业的出口额曾位居世界第六;韩国机器人利用率居世界首位。韩国在全球对应工业机器人数量指标的机器人密度……最新研究女性性工作者死亡原因一项多国研究的结果女性性工作者(FSW)是一个弱势群体,面临不良健康后果的高风险,包括过早死亡。然而,绝大多数关于FSW健康的研究都侧重于发病率,特别是艾滋病毒。尽管了解FSW的发病率原因……閱讀时间决定你会在生命中遇见谁,你的心决定你想要谁出现在你的生命里,而你的行为决定最后谁能留下。梭罗《瓦尔登湖》惟沉默是最高的轻蔑。鲁迅未曾哭过长夜的人,不足以语人生。……导热凝胶,手机散热的好伙伴知名手机大厂vivo发布过一款他们的大屏商务旗舰机,机型介绍中提到的立体散热方案中出现导热凝胶这一导热材料。来自vivo官网对于普通手机消费者来说,他们想要的效果就……江苏银行研究报告与区域经济共振,城商行业绩领跑者(报告出品方作者:兴业证券,陈绍兴,王尘,曹欣童)1、公司概况1。1、历史沿革:深耕江苏区域,综合经营实力领先的头部城商行江苏银行是由省内城商行合力组建而成的头部城……满洲里机场正式恢复中俄国际航线央广网呼伦贝尔4月13日消息(记者王秋蕾通讯员刘欣曹晗)4月12日,俄罗斯伊尔航空IO879航班自伊尔库茨克机场起飞后于20时34分平稳降落至满洲里西郊机场,标志着被冰封了11……嫁富豪的董卿彻底变了样!烫卷发化浓妆变贵妇,穿短裙不见书香气当一个人的气质发生了360度大转变的时候,那么你的颜值分和时尚分都会发生改变,对于很多有气质的女性来说,如果将自己打扮的特别高调浮夸的话,就会瞬间降低气质分。所以说,好气质和穿……疑似NothingPhone1售价曝光,骁龙778G加持,起早些时间,在海外市场拥有不俗关注的NothingPhone1真机被正式曝光,采用大胆的透明手机背板、大面积灯带环绕设计,为近年来变化不大的手机市场增添了一抹亮色。而在近日,也有……
本田怒发大动作,引进新款INSIGHT,上市后市场表现到底如汽车工业水准越来的越理想化,人们的生活水平也在不断的提高,然而在不知不觉中,汽车早已进入了人们生活当中的一部分了,它已不再是简简单单的代步工具了,更多人追求的是高品质的驾驶体验……流淌红色文化血液的千年川东古镇毛浴古镇图为毛浴古镇景观。中国网记者伦晓璇摄毛浴古镇位于四川省巴中市通江县东南部的毛浴古镇,是通江县保存较为完整的古镇之一。该镇旧名龙舌镇,明末兴场,其地北依鸡子顶山,扼县东、县……新能源汽车撞击起火问题到底出在哪里7月22日著名艺人林志颖开车载着6岁的儿子Jenson前往参加赛车比赛,不知为何驾驶的座驾特斯拉撞上分隔岛,发生严重车祸随后车子着火。好在当时附近有人,于是众人不顾危险将林志颖……它是人体最恨的老化剂,离得越近的人老得越快人人都希望青春永驻,衰老来得慢一点,但生活中总有一些东西在无形中加速各个脏器的衰老速度,腐蚀我们的健康。远离身体老化剂01肾脏盐肾脏最怕你吃太多咸的东西,当我……2019年1月汽车销量排行TOP15,你的爱车上榜没?【车主之家新闻】根据乘联会最新数据统计显示,我国1月狭义乘用车零售销量达216。1万辆,同比下滑4。厂商2019年1月汽车销量排行Top15受大环境影响不少厂商销量……今日最新油价,国内油价确定6天后将4连涨,网友我要卖车!今日最新油价:今天是2019年2月22日,星期五。现在不管是有钱没钱,小车几乎都是标配,买一辆车代步现在对很多人来说都不是什么难事,但是汽车后续的保养、加油等一系列的开支……中超第1功臣反弹3连胜远离泰山3场造1球,20登顶19轮不败聚焦中超CBA,独一无二球迷媒体点击右上角关注,不会后悔的。。。目前,国内职业联赛多场比赛延期,中超尤为明显,约有15场比赛受到影响,球迷们暂时看不到争冠对决和保级……曾经出了名的屌丝三宝,如今现状如何,现在还值得入手吗?曾经出了名的屌丝三宝,如今现状如何,现在还值得入手吗?早些年,国内的汽车市场上流出了很多关于汽车的名言名句,就比如屌丝有三宝,K5、索8、迈锐宝等。而这么多年过去了,还有……2020款沃尔沃XC90官图发布,新增6座版,KERS系统可【新车迷网沃尔沃XC90最新消息】近日,沃尔沃刚刚发布了最新XC90改款车型的官方照片,以及这款大型旗舰车型的有关详细信息。对于即将推出的沃尔沃XC90改款车型而言,最重要的改……霸道!孕妇开车硬怼直行车拒不认错称对方超速了其中黑色私家车车主是位孕妇,已经怀孕7个月了。事故发生后,第一时间送到了医院。据悉,目前来看,并没有大碍。但说起事发原因来,银色私家车的车主却是一肚子委屈。我直行,她左拐……实拍!宝马X7终于来了,比路虎更霸气,网友众泰敢不敢挑战自从奔驰GLS上市以后奥迪也按耐不住的推出了奥迪的Q8,这一消息被宝马看到后,宝马也开始着急了,加快了首款全尺寸的SUV车型设计,早在几年前宝马就已经曝光了正在开发全尺寸的SU……原装进口价格不贵4款不同级别超值SUV推荐通过国产降低价格门槛提升竞争力,这是不少品牌和车企的选择,但随着进口车关税降价和市场竞争日趋激烈,有不少原装进口车的实际售价并不比国产合资车贵,如果您比较钟情原装进口或不愿意随……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网