范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

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

  Babel 的原理是什么?
  参考回答:
  babel 的转译过程也分为三个阶段, 这三步具体是:
  o 解析 Parse: 将代码解析生成抽象语法树( 即 AST),即词法分析与语法分 析的过程
  o 转换 Transform: 对于 AST 进行变换一系列的操作, babel 接受得到 AST 并通过 babel-traverse 对其进行遍历, 在此过程中进行添加 、更新 及移除等操作
  o 生成 Generate: 将变换后的 AST 再转换为 JS 代码, 使用到的模块是 babel-generator
  如何写一个 babel 插件?
  参考回答:
  Babel 解析成 AST, 然后插件更改 AST, 最后由 Babel 输出代码
  那么 Babel 的插件模块需要你暴露一个 function, function 内返回 visitor module.export = function(babel){  return {  visitor:{  }  }  }
  visitor 是对各类型的 AST 节点做处理的地方,那么我们怎么知道 Babel 生成了的 AST 有哪些节点呢?
  很简单, 你可以把 Babel 转换的结果打印出来, 或者这里有传送门: AST explorer
  这里我们看到  const result = 1 + 2  中的  1 + 1  是一个  BinaryExpression  节点, 那么在 visitor 中, 我们就处理这个节点 var babel = require("babel-core");  var t = require("babel-types");  const visitor = {  BinaryExpression(path) {  const node = path.node;  let result;  // 判断表达式两边, 是否都是数字  if (t.isNumericLiteral(node.left) && t.isNumericLiteral(node.right)) {  // 根据不同的操作符作运算  switch (node.operator) {  case "+":  result = node.left.value + node.right.value;  break  case "-":  result = node.left.value - node.right.value;  break;  case "*":  result = node.left.value * node.right.value;  break;  case "/":  result = node.left.value / node.right.value;  break;  case "**":  let i = node.right.value;  while (--i) {  result = result || node.left.value;  result = result * node.left.value;  }  break;  default:  }  }  // 如果上面的运算有结果的话  if (result !== undefined) {  // 把表达式节点替换成 number 字面量  path.replaceWith(t.numericLiteral(result));  }  }  };  module.exports = function (babel) {  return {  visitor  };  }
  插件写好了, 我们运行下插件试试 const babel = require("babel-core");  const result = babel.transform("const result = 1 + 2;",{  plugins:[  require("./index")  ]  });  console.log(result.code); // const result = 3;
  与预期一致, 那么转换 const result = 1 + 2 + 3 + 4 + 5;呢?
  结果是: const result = 3 + 3 + 4 + 5;
  这就奇怪了, 为什么只计算了 1 + 2 之后, 就没有继续往下运算了?
  我们看一下这个表达式的 AST 树
  你会发现 Babel 解析成表达式里面再嵌套表达式。
  表达式( 表达式( 表达式( 表达式(1 + 2) + 3) + 4) + 5)
  而我们的判断条件并不符合所有的, 只符合  1 + 2
  // 判断表达式两边, 是否都是数字
  if (t.isNumericLiteral(node.left) && t.isNumericLiteral(node.right)) {}
  那么我们得改一改
  第一次计算 1 + 2 之后, 我们会得到这样的表达式
  表达式( 表达式( 表达式(3 + 3) + 4) + 5)
  其中 3 + 3 又符合了我们的条件, 我们通过向上递归的方式遍历父级节点
  又转换成这样:
  表达式( 表达式(6 + 4) + 5)
  表达式(10 + 5)
  15
  // 如果上面的运算有结果的话   if (result !== undefined) {   // 把表达式节点替换成 number 字面量   path.replaceWith(t.numericLiteral(result));   let parentPath = path.parentPath;   // 向上遍历父级节点   parentPath && visitor.BinaryExpression.call(this, parentPath);   }   到这里, 我们就得出了结果 const result = 15;   那么其他运算呢:   const result = 100 + 10 - 50 >>> const result = 60;   const result = (100 / 2) + 50 >>> const result = 100;   const result = (((100 / 2) + 50 * 2) / 50) ** 2 >>> const result = 9; 你的 git 工作流是怎样的?   参考回答:   GitFlow 是由 Vincent Driessen 提出的一个 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 的区别?   参考回答:   git rebase 和 gitmerge 一样都是用于从一个分支获取并且合并到当前分支.   假设一个场景,就是我们开发的[feature/todo]分支要合并到 master 主分支,那么用 rebase 或 者 merge 有什么不同呢?   o marge 特点: 自动创建一个新的commit 如果合并的时候遇到冲突,仅需 要修改后重新commit   o 优点: 记录了真实的 commit 情况, 包括每个分支的详情   o 缺点: 因为每次 merge 会自动产生一个 mergecommit, 所以在使用一些 git 的 GUI tools, 特别是 commit 比较频繁时, 看到分支很杂乱。   o rebase 特点: 会合并之前的 commit 历史   o 优点: 得到更简洁的项目历史, 去掉了merge commit   o 缺点: 如果合并出现代码问题不容易定位, 因为re-write 了 history   因此,当需要保留详细的合并信息的时候建议使用gitmerge,特别是需要将分支合并进入 master 分支时; 当发现自己修改某个功能时, 频繁进行了 git commit 提交时, 发现其实 过多的提交信息没有必要时, 可以尝试 git rebase. git reset 、git revert 和 git checkout 有什么区别   参考回答:   这个问题同样也需要先了解 git 仓库的三个组成部分: 工作区 ( Working Directory) 、 暂存区 (Stage) 和历史记录区 ( History) 。   o 工作区: 在 git 管理下的正常目录都算是工作区, 我们平时的编辑工作 都是在工作区完成   o 暂存区: 临时区域 。里面存放将要提交文件的快照   o 历史记录区: git commit 后的记录区   三个区的转换关系以及转换所使用的命令:   git reset 、git revert 和 git checkout 的共同点: 用来撤销代码仓库中的某些更改。 然后是不同点:   首先, 从 commit 层面来说:   o gitreset 可以将一个分支的末端指向之前的一个 commit。然后再下次 git 执行垃圾回收的时候,会把这个 commit 之后的 commit 都扔掉。gitreset 还支持三种标记, 用来标记 reset 指令影响的范围:   1 --mixed: 会影响到暂存区和历史记录区 。也是默认选项   1 --soft: 只影响历史记录区   1 --hard: 影响工作区 、暂存区和历史记录区   注意:因为 gitreset 是直接删除 commit 记录,从而会影响到其他开发人员的分 支, 所以不要在公共分支 (比如 develop) 做这个操作。   1 git checkout 可以将 HEAD 移到一个新的分支, 并更新工作目录。 因为可能会覆盖本地的修改, 所以执行这个指令之前, 你需要 stash 或者 commit 暂存区和工作区的更改。   o git revert 和 gitreset 的目的是一样的, 但是做法不同, 它会以创建新的 commit 的方式来撤销 commit,这样能保留之前的 commit 历史,比较安 全 。另外, 同样因为可能会覆盖本地的修改, 所以执行这个指令之前, 你需要 stash 或者 commit 暂存区和工作区的更改。   然后, 从文件层面来说:   o gitreset 只是把文件从历史记录区拿到暂存区,不影响工作区的内容,而 且不支持 --mixed 、--soft 和 --hard。   o git checkout 则是把文件从历史记录拿到工作区, 不影响暂存区的内容。   o git revert 不支持文件层面的操作。 webpack 和 gulp 区别 (模块化与流的区别)   参考回答:   gulp 强调的是前端开发的工作流程,我们可以通过配置一系列的task,定义 task 处理的 事务 (例如文件压缩合并 、雪碧图 、启动server 、版本控制等) , 然后定义执行顺序, 来让 gulp 执行这些task, 从而构建项目的整个前端开发流程。   webpack 是一个前端模块化方案, 更侧重模块打包, 我们可以把开发中的所有资源 (图 片、js 文件、css 文件等) 都看成模块,通过 loader (加载器) 和 plugins (插件) 对资源 进行处理, 打包成符合生产环境部署的前端资源。

阿杜用了15年达成25000分成就,作为对比,乔科詹用了几个赛季?在联盟能够拿下25000分的球员是屈指可数的,能够获得这么多的分数,那么未来势必都是能够进入名人堂的球员。而在之前篮网以及凯尔特人的比赛中,杜兰特也是将自己的总得分提升到了2500双赢!湖人步行者酝酿3换1交易!布罗格登辅佐詹姆斯争冠?据TA名记SamAmick透露,本赛季结束后威少将铁定离开湖人,目前威少的合同还剩一年,价值4700万美元,如果下赛季之前湖人队无法交易掉他,总经理佩林卡会选择用延伸条款将威少裁掉CSGOESL职业联赛S15赛季A组分组情况和晋级预测,G2稳稳晋级关注我提前了解赛事信息和不为人知的幕后花絮今天要跟大家同步的内容是ESL职业联赛S15赛季A组的分组情况和晋级预测大概率晋级的队伍是G2,MOUZ,NIP在经过IEM卡托维兹202在国王队考利斯坦拿过场均13分的数据,加盟76人后,他表现如何说起威利考利斯坦这名球员,有些球迷会对他报以嘘声,认为他拥有不错的天赋,却白白浪费掉了。在2015年,考利斯坦决定参加NBA选秀大会,那时的他,受到众多NBA球队的关注,成为选秀热坏消息!辽篮锋线大将常规赛报销,杨鸣措手不及俞泽晨迎上位机会第3阶段的辽宁男篮表现得并不出色,在目前的4场常规赛当中仅取得了1胜3负的战绩,其中三场分别输给了青岛上海和浙江,赢下的一场也是在郭艾伦复出的情况之下对青岛队完成了复仇,总体表现的春天宁可不吃肉,也要多吃三菜二果,营养又美味,越吃越健康春天天气干燥,特别是三四月的时候,气温一直上升,可雨水就是不下来几场。这样的天气容易导致人肝火旺盛,脾气也变得很不好,经常会动怒。动怒多了就会损伤肝脏。所以笔者建议大家要多吃三菜二今年这条瘦瘦裤火了,跟风衣卫衣都很合拍,时髦显瘦有气质虽然已经到了早春季节,大家可以考虑换新衣,但温度没有彻底回升,建议大家不要太早穿裙子,不够保暖!多穿裤子,时髦洋气还保暖,腿粗腿瘦都很合适!与往年的流行趋势不一样,今年不流行穿烟管忘掉争议!张常宁面色圆润三八节送寄语,女排主攻说得挺精彩中国女排国家队,目前正在新的主教练蔡斌的带领下集训。对于中国女排来说,今年的任务非常重,因为今年有亚运会和世界锦标赛的比赛。大家希望中国女排能够在这两项赛事上拿出好的表现,争取能够孙杨沉浸式直播惹争议,人数5万笑一下,网友各种讽刺经常关注直播的小伙伴最近这段时间应该都看到了,我们国家著名的游泳运动员孙杨,开始直播带货已经有一段时间了。在孙杨第一场直播带货的时候因为商品是不是免税商品而一度引起了争议,然而近期C罗前任伊莲娜近况独自1人养女儿老了许多,当初放弃总裁后悔吗有媒体关注到C罗前任伊莲娜的最新情况,这位优质的俄罗斯名媛和俄罗斯超模如今的生活状态令大家非常担心,曾经的她是超级巨星C罗的女朋友,一举一动都能够得到媒体的关注,而如今喜欢和关注伊5036!欧文神了,创三大纪录,庄神梦回巅峰,罗齐尔空砍308北京时间3月9日,东部迎来一场卡位战,夏洛特黄蜂在主场迎战布鲁克林篮网,这是一场东部第八和东部第九之间的较量,因此,这场比赛的重要性不言而喻。在此之前,黄蜂取得了2连胜,篮网遭遇了
那些充当过客的难过时光图片来源网络,侵删什么算难过?是生活困难,是身体不适,还是心情不痛快?这话如何说得准确呢。它们看上去是单独存在着,实际上,当我们作为局内人涉事其中,你会发现,原本单独存在的难过被串双十一即将来临,东莞消委会发布消费提醒2022年双11大幕已拉起,各大电商平台直播间双11氛围已热火。今年的双11让消费者感受到似乎简单了,告别了0点熬夜抢免单,各种满减优惠不再那么烧脑,部分电商平台保价期延长,还能一华为6G领跑世界,为什么却不作为主力?三个致命缺点道出真相hello我是你们的der(得儿)一个爱好数码喜欢谈论时事热点,挖掘性价比东西的宅,der友们点个关注叭!自从5G逐渐商用了以后,6G就开始各种造势和布局了。这不前段时间,任正非称A股ampampquot数字货币ampampquot时代将来临,6家龙头领跑前沿,将迎来光速发展数字货币时代将来临,6家龙头领跑前沿,将迎来光速发展先人一步,读懂数字货币近几月,数字货币DCEP将以交通补贴的方式首次在苏州落地使用。从研究到落地,历时多年,DCEP终于要面世了你是我一生的在乎,我爱你想和你一起煮饭,一起散步,一起坐在小院中的阳光下,说着最美丽的情话,一起将寻常的日子经营成人间的诗意。在我心中,关于你,还有好多未曾实现的梦想,只可惜,梦想那么美丽,终究无法再触及王者荣耀七周年共创之夜即将来袭!全英雄全皮肤大奖花落谁家?随着七周年限定皮肤鬼谷子五谷丰年的推出七周年返场票选结束盾山梦圆繁星航天联动皮肤上架,大家都以为王者荣耀七周年将落下帷幕的时候,官方终于揭晓了七周年日历上11月12日的神秘惊喜七周德国队世界杯26将来自何方?哪家俱乐部造血最多?文黄思隽关注国际足球的同学们,今天应该都被一条视频刷屏了,就是乌拉圭国家队公布世界杯26人名单的短片。跟一般国家队以场上位置或球员所属俱乐部作为线索不同,乌拉圭队的26名球员是由各三七粉虽好,但不能乱吃!尤其这四类人更要小心三七粉很多人都在吃,但是绝大多数人都吃错了!甚至有些人不能吃!三七粉既能活血,又能止血,活血不伤血,止血不留瘀,是一个很好的保健食品!三七粉是以活血止血为主,但进补方面很弱!可是看小心肝!会出现哪些情况,你都知道了?什么是肝病?肝病分几种?肝病有哪些症状?你是不是听说过,但是分不清楚,今天我来3分钟教你分清肝病!一什么是肝病?肝肝病指的是肝部发生病变。二肝病有哪几种?包括乙肝,甲肝,丙肝,肝硬冬天进补有4症状小心!医警告胀气恐过头了冬天许多人会吃姜母鸭或羊肉炉等进补。(示意图记者周宸亘摄)记者张乃文综合报导立冬的到来也代表正式进入冬天了,而冬天许多人会以食补来进补,麻油鸡姜母鸭或羊肉炉在冷天的生意也特别盛行。网络钓鱼将IceXLoader恶意软件投放到数以千计的家庭企业设备正在进行的网络钓鱼活动已经感染了新版本的IceXLoader恶意软件,从而感染了数千名家庭和企业用户。IceXLoader是今年夏天首次在野外发现的恶意软件加载程序,其作者发布了3