给我一个 babel,还你一条完整前端工具链

标签: babel 完整 前端 | 发表时间:2021-05-24 12:16 | 作者:zxg_神说要有光
出处:https://juejin.cn/frontend

你不知道的 babel

提到 babel,你会想到什么?

  • 可以把项目中的 es6、es7 等代码转成目标环境支持的代码
  • 可以自动 polyfill 目标环境不支持的 api
  • taro (小程序转译工具)是基于 babel 实现的
  • babel 的插件很丰富
  • 我们公司现在用 babel 来编译 typescript,不用 tsc 了
  • 我基于 babel 做过自动埋点的功能,得到了领导的夸奖
  • ...

其实 babel 能做的不只是这些,它能做 3 类事情:

转译 esnext、typescript、flow 等到目标环境支持的 js

这个是最常用的功能,用来把代码中的 esnext 的新的语法、typescript 和 flow 的语法转成基于目标环境支持的语法的实现。并且还可以把目标环境不支持的 api 进行 polyfill。

babel7 支持了 preset-env,可以指定 targets 来进行按需转换,转换更加的精准,产物更小。

一些特定用途的代码转换

babel 是一个转译器,暴露了很多 api,用这些 api 可以完成代码到 AST 的 parse,AST 的转换,以及目标代码的生成。

开发者可以用它来来完成一些特定用途的转换,比如函数插桩(函数中自动插入一些代码,例如埋点代码)、自动国际化、default import 转 named import 等。

现在比较流行的小程序转译工具 taro,就是基于 babel 的 api 来实现的。

代码的静态分析

对代码进行 parse 之后,能够进行转换,是因为通过 AST 的结构能够理解代码。理解了代码之后,除了进行转换然后生成目标代码之外,也同样可以用于分析代码的信息,进行一些检查。

babel 还能做什么?

babel 是前端业务开发和工具链开发中必不可少的工具,我们每天都在用,可是你有想过这些问题么:

  • 怎么写一个 babel 插件来做自定义的代码转换?
  • 业务开发中有哪些地方可以用 babel 来做自动化?
  • babel 是怎么实现的?

还有

  • linter 是怎么实现的?
  • typescript 类型检查是怎么实现的?
  • 压缩混淆工具的原理是什么?
  • 打包工具是如何分析代码依赖关系的?
  • api 文档如何自动生成?

上面这些都可以用 babel 来实现,或许你并没有想过 babel 有这么大的能量, 学会了 babel,绝对能让你提升一个段位

基于 babel 实现完整工具链

我们来理一下这些工具的实现思路(所有下面列的工具都有 实现代码放在 github)

自动国际化

国际化是把写死的字符串字面量换成从资源包取值的方式,babel 可以分析出代码中的字符串字面量,把它替换成一个函数调用语句,然后自动引入资源包。基于 babel,我们完全可以做到自动国际化。

自动生成 api 文档

我们在写 api 的时候,会在上方添加注释,那么是不是能把这些注释内容还有关联的函数、class 的信息提取出来,用一定的模版来生成 api 文档呢? 没错,babel 可以做到。

linter

我们整天用 eslint、stylelint 来做代码规范的检查,其实他们不过就是对 AST 做了校验,这些我们用 babel 完全可以做到。可以基于 babel 实现 eslint。

type checker

typescript 是给代码添加了静态的类型信息,可以在编译期间进行类型检查,也可以辅助做代码的智能提示,现在基本是前端必备技能了。可是你有想过 typescript 怎么实现的么?在小册中 我们会手写一个 ts type checker,让你真正理解 typescript!

压缩混淆

前端代码上生产肯定要做压缩,做混淆,这个我们整天都在用,可是你知道他的实现原理么,我们能不能用 babel 来实现一下。答案是肯定的,在 小册我们会实现压缩混淆的功能

js 解释器

v8 引擎的实现原理是什么,解释型语言都是怎么解释代码的。我们能不能实现一个 js 解释器,是可以的, 《babel 插件通关秘籍》小册中我们会基于 babel parser 实现一个 js 解释器。

手写 babel

可能你会问,上面的这些都是基于 babel,那如果没有 babel 呢?

没有 babel 我们就实现一个 babel, 小册最后 我们会实现一个简易但可用的 babel,让你真正理解 babel 的原理,真正掌握 babel

上面的解释器和类型检查的内容, 王垠卖 12000,见下图,所以这本小册绝对超值。

大纲

上面说了很多小册的内容,下面是小册的完整目录:

不只是 babel

虽然上面的实战都是基于 babel 的,可是你学到的只是 babel 么?

不是的,上面的实战案例涉及到完整的工具链,从文档生成、lint、type check、压缩混淆到 js 解释器等等,这几乎是前端开发的闭环了。 以此为抓手,学到的是整条工具链的实现思路

上面的工具还是集中在前端领域,但其中转译器、解释器的实现思路确是通用的,编译原理主要就是学编译器、转译器、解释器三部分, 学完整本小册,相信也能帮助你入门编译原理

总结

babel 是前端领域几乎是必备的工具,基于它可以完成很多功能,甚至是打造整条工具链,我们在 小册中会实现 linter、type cheker、压缩混淆、api 文档自动生成、js 解释器等等一系列功能。其中解释器和类型检查的功能在王垠那里能卖 12000,对比之下,这本小册内容和价格绝对很良心了。

如果说 babel api 是术,那么基于 babel 学到的编译原理、工具链实现思路就是道了。掌握了 babel、掌握了工具链,入门编译原理,绝对能让你提升一个段位。

相关 [babel 完整 前端] 推荐:

给我一个 babel,还你一条完整前端工具链

- - 掘金 前端
提到 babel,你会想到什么. 可以把项目中的 es6、es7 等代码转成目标环境支持的代码. 可以自动 polyfill 目标环境不支持的 api. taro (小程序转译工具)是基于 babel 实现的. 我们公司现在用 babel 来编译 typescript,不用 tsc 了. 我基于 babel 做过自动埋点的功能,得到了领导的夸奖.

Flask-Babel 简介

- yinseny - python.cn(jobs, news)
本文有一个格式好看一点,并且有语法高亮的版本放在 readthedocs,欢迎浏览. 本文是原创,不是翻译,不过本文其实是谈翻译的. 话说用 wordpress 的 WYSIWYG 编辑器写这样的文章真痛苦啊,格式一不小心就乱了,本文是用 rst 写成,编译为 html,然后贴到这边来的. 最近用 Flask 给公司做了个小 web 应用,做的时候用英文了,现在要求翻译成中文.

揭秘babel的魔法之class魔法处理

- - SegmentFault 最新的文章
2017年,很多人已经开始接触ES6环境,并且早已经用在了生产当中. 我们知道ES6在大部分浏览器还是跑不通的,因此我们使用了伟大的Babel来进行编译. 很多人可能没有关心过,经过Babel编译之后,我们华丽的ES6代码究竟变成了什么样子. 这篇文章,针对Babel对ES6里面“类class”的编译进行分析,你可以在线 测试编译结果,毕竟纸上得来终觉浅,自己动手,才能真正体会其中的奥秘.

完整

- None - 韩寒
在年29的白天,钱云会的手表视频被曝光了. 很巧,我也有一块和钱村长一样的手表,是我父亲在我今年生日的时候在上海国际赛车场里送给我的. 但是我没有怎么用过它,所以和我约会的姑娘大可放心. 我有一个朋友质疑说,为什么视频里先出现了老钱的脸,是否太欲盖弥彰了. 这个我倒是可以来解释一下,因为我这款手表的摄像头在表盘的十二点钟位置,而开摄像头的按键在右边的表盘侧面上,按压两秒就打开摄像头,这个时候摄像头的小灯会发出蓝光,5秒钟以后熄灭,表示录制开始.

前端技术

- - CSDN博客综合推荐文章
随着互联网产业的爆炸式增长,与之伴生的Web前端技术也在历经洗礼和蜕变. 尤其是近几年随着移动终端的发展,越来越多的人开始投身或转行至新领域,这更为当今的IT产业注入了新的活力. 尽管Web前端技术诞生至今时日并不长,但随着Web技术的逐渐深入,今后将会在以下几方面发力. JavaScript的兄弟们.

HDFS数据完整性

- - CSDN博客推荐文章
为了保证数据的完整性,一般采用数据校验技术:. 2、md5,sha1等校验技术. 3、CRC-32循环冗余校验技术. 1、HDFS以透明方式校验所有写入的数据,可以通过io.bytes.per.checksum属性设置,字节数默认是512 字节,创建一个单独的校验和,如果节点检测数据错误,就会报 CheckSumException异常.

Web前端优化

- - JavaScript - Web前端 - ITeye博客
优点:直接使用浏览器内存的缓存数据,减少网站后台压力,用户体验(速度)好. 缺点:对于时时变化的动态页面,这种情况就不能容忍了,因为每次访问的都是第一次访问的内容,这样即使所请求的页面已经变化了,用户也不可能知道,所以此场景必须要消除这种缓存的影响. 延迟加载,将资源延迟到需要的时候的加载,例如detail页面,相关产品推荐,当用户浏览更多的信息往下拉动滚动时,才进行加载,异步加载可以大幅减少对后端资源的使用,在需要的时候加载,是资源合理使用常用的方式,但是也带来一个问题,当往下拉才去加载,如果性能不够好,用户的体验其实是不好的,“菊花”转动的时间会比较长,同时异步加载对前端性能的作用也是非常明显的,渲染的节点数量大幅减少.

Web 前端测试

- - Web前端 - ITeye博客
Web 网站测试流程和方法(转载). 进行正式测试之前,应先确定如何开展测试,不可盲目的测试. 一般网站的测试,应按以下流程来进行:. 1)使用HTML Link Validator将网站中的错误链接找出来;. 2)测试的顺序为:自顶向下、从左到右;. 3)查看页面title是否正确. (不只首页,所有页面都要查看);.

前端xss攻击

- - SegmentFault 最新的文章
实习的时候在项目中有接触过关于xss攻击的内容,并且使用了项目组中推荐的一些常用的防xss攻击的方法对项目进行了防攻击的完善. 但一直没有时间深入了解这东西,在此,做一个简单的梳理. xss跨站脚本攻击(Cross Site Scripting),是一种经常出现在web应用中的计算机安全漏洞,它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入的恶意html代码会被执行,从而达到恶意用户的特殊目的.

关于“学习”的完整过程

- daniel - 左岸读书_blog
原文:http://iamwill.net/about-study/. 学习是怎样的一个过程,怎样才算是完全掌握了一门学问、知识、技能呢. 作为一个生存于如斯万变时代下的一个个体,“学习”是生存的基本技能. 学习有两个目的,一是学习专业知识,也就是我们在学校里、在工作中学习、领悟到的东西,目的是形成自己的专业知识,有能力养活自己;二是形成自己的人生观、价值观,这个在中国的学校里几乎学不到,这个要靠我们自己的领会,跟有思想的人学习礼仪、沟通,让我们在生活中跟人交流相处更容易,也形成自己的人格.