babel转换es6方法实现

这次给大家带来babel转换es6方法实现,babel转换es6的注意事项有哪些,下面就是实战案例,一起来看一下。

我们在项目中都是通过配置插件和预设(多个插件的集合)来转换特定代码,例如env、stage-0等。

实际上babel可以通过自定义插件的方式实现任何代码的转换,接下来我们通过一个“把es6的 class 转换为es5”的例子来了解一下babel。

内容如下:

webpack环境配置

大家应该都配置过babel-core这个loader,它的作用是提供babel的核心Api,实际上我们的代码转换都是通过插件来实现的。

接下来我们不用第三方的插件,自己实现一个es6类转换插件。先执行以下几步初始化一个项目:

npm install webpack webpack-cli babel-core -D

新建一个webpack.config.js

配置webpack.config.js

如果我们的插件名字想叫transform-class,需要在webpack配置中做如下配置:

babel转换es6方法实现

接下来我们在node_modules中新建一个babel-plugin-transform-class的文件夹来写插件的逻辑(如果是真实项目,你需要编写这个插件并发布到npm仓库),如下图:

babel转换es6方法实现

红色区域是我新建的文件夹,它上面的是一个标准的插件的项目结构,为了方便我只写了核心的index.js文件。

如何编写bable插件

babel插件其实是通过AST(抽象语法树)实现的。

babel帮助我们把js代码转换为AST,然后允许我们修改,最后再把它转换成js代码。

那么就涉及到两个问题:js代码和AST之间的映射关系是什么?如何替换或者新增AST?

好,先介绍一个工具:astexplorer.net:

这个工具可以把一段代码转换为AST:

babel转换es6方法实现

如图,我们写了一个es6的类,然后网页的右边帮我们生成了一个AST,其实就是把每一行代码变成了一个对象,这样我们就实现了一个映射。

再介绍一个文档: babel-types :

这是创建AST节点的api文档。

比如,我们想创建一个类,先到astexplorer.net中转换,发现类对应的AST类型是 ClassDeclaration 。好,我们去文档中搜索,发现调用下面的api就可以了:

babel转换es6方法实现

创建其他语句也是一样的道理,有了上面这两个东西,我们可以做任何转换了。

下面我们开始真正编写一个插件,分为以下几步:

在index.js中export一个函数

函数中返回一个对象,对象有一个visitor参数(必须叫visitor)

通过astexplorer.net查询出 class 对应的AST节点为 ClassDeclaration

在vistor中设置一个捕获函数 ClassDeclaration ,意思是我要捕获js代码中所有 ClassDeclaration 节点

编写逻辑代码,完成转换

module.exports = function ({ types: t }) { return {  visitor: {   ClassDeclaration(path) {    //在这里完成转换   }  } };}

登录后复制

代码中有两个参数,第一个 {types:t} 东西是从参数中解构出变量t,它其实就是babel-types文档中的t(下图红框),它是用来创建节点的:

babel转换es6方法实现

第二个参数 path ,它是捕获到的节点对应的信息,我们可以通过 path.node 获得这个节点的AST,在这个基础上进行修改就能完成了我们的目标。

如何把es6的class转换为es5的类

上面都是预备工作,真正的逻辑从现在才开始,我们先考虑两个问题:

我们要做如下转换,首先把es6的类,转换为es5的类写法(也就是普通函数),我们观察到,很多代码是可以复用的,包括函数名字、函数内部的代码块等。

babel转换es6方法实现 

如果不定义class中的 constructor 方法,JavaScript引擎会自动为它添加一个空的 constructor() 方法,这需要我们做兼容处理。

接下来我们开始写代码,思路是:

拿到老的AST节点

创建一个数组用来盛放新的AST节点(虽然原class只是一个节点,但是替换后它会被若干个函数节点取代) 初始化默认的 constructor 节点(上文提到,class中有可能没有定义constructor)

循环老节点的AST对象(会循环出若干个函数节点)

判断函数的类型是不是 constructor ,如果是,通过取到数据创建一个普通函数节点,并更新默认 constructor 节点

处理其余不是 constructor 的节点,通过数据创建 prototype 类型的函数,并放到 es5Fns 中

循环结束,把 constructor 节点也放到 es5Fns 中

判断es5Fns的长度是否大于1,如果大于1使用 replaceWithMultiple 这个API更新AST

module.exports = function ({ types: t }) { return {  visitor: {   ClassDeclaration(path) {    //拿到老的AST节点    let node = path.node    let className = node.id.name    let classInner = node.body.body    //创建一个数组用来成盛放新生成AST    let es5Fns = []    //初始化默认的constructor节点    let newConstructorId = t.identifier(className)    let constructorFn = t.functionDeclaration(newConstructorId, [t.identifier('')], t.blockStatement([]), false, false)    //循环老节点的AST对象    for (let i = 0; i  1) {     path.replaceWithMultiple(es5Fns)    } else {     path.replaceWith(constructorFn)    }   }  } };}

登录后复制

优化继承

其实,类还涉及到继承,思路也不复杂,就是判断AST中没有 superClass 属性,如果有的话,我们需要多添加一行代码 Bird.prototype = Object.create(Parent) ,当然别忘了处理 super 关键字。

打包后代码

babel转换es6方法实现 

运行 npm start 打包后,我们看到打包后的文件里 class

语法已经成功转换为一个个的es5函数。

相信看了本文案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

推荐阅读:

JS实现停留在界面提示框vue 

cli升级webpack4步骤详解

vue 单页应用前端路由如何配置

以上就是babel转换es6方法实现的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2765661.html

(0)
上一篇 2025年3月8日 11:01:34
下一篇 2025年2月24日 11:14:15

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • token传参如何实现

    这次给大家带来token传参如何实现,token传参实现的注意事项有哪些,下面就是实战案例,一起来看一下。 问题描述: 有一个登陆接口获取token,其他接口再次访问都要带上token 解决方案: 1、在登陆接口访问后设置Postman的环…

    2025年3月8日 编程技术
    200
  • 如何让数据里html字段转换为HTML标签

    这次给大家带来如何让数据里html字段转换为HTML标签,让数据里html字段转换为HTML标签的注意事项有哪些,下面就是实战案例,一起来看一下。 后台传过来 一个带标签的字符串  前端可以直接转换成html格式的,可是在vue中怎么办呢 …

    2025年3月8日
    200
  • Angular实现字母大小写转换步骤详解(附代码)

    这次给大家带来Angular实现字母大小写转换步骤详解(附代码),Angular实现字母大小写转换的注意事项有哪些,下面就是实战案例,一起来看一下。 angular过滤器uppercase/lowercase字母大小写转换 输出大写输出小写…

    编程技术 2025年3月8日
    200
  • txt文件怎样实现上传前预览

    这次给大家带来txt文件怎样实现上传前预览,txt文件实现上传前预览的注意事项有哪些,下面就是实战案例,一起来看一下。 今天做项目刚好碰到这个记录一下。因为是简单的txt文件,只涉及文本,如果需要涉及图片预览就需要使用papaparse和j…

    2025年3月8日
    200
  • JS实现摩天轮抽奖

    这次给大家带来JS实现摩天轮抽奖,JS实现摩天轮抽奖的注意事项有哪些,下面就是实战案例,一起来看一下。  效果图: 图片素材 : 代码如下,复制即可使用: 幸运抽奖页面 /*CSS代码*/ *{ padding:0; margin:0; }…

    2025年3月8日
    200
  • vue裁切预览组件功能的实现步骤

    这篇文章主要介绍了vue裁切预览组件功能的实现代码,本文通过实例代码相结合的形式给大家介绍的非常详细,具有一定的参考借鉴价值,感兴趣的朋友跟随脚本之家小编一起学习吧 vue版本裁切工具,包含预览功能 最终效果: qiuyaofan.gith…

    2025年3月8日
    200
  • vue嵌套路由与404重定向实现方法分析

    这篇文章主要介绍了vue嵌套路由与404重定向实现方法,结合实例形式分析了vue.js嵌套路由与404重定向的概念、原理、实现步骤与相关操作技巧,需要的朋友可以参考下 本文实例讲述了vue嵌套路由与404重定向实现方法。分享给大家供大家参考…

    2025年3月8日
    200
  • node实现的爬虫功能

    这篇文章主要介绍了node实现的爬虫功能,结合实例形式分析了nodejs实现爬虫功能的步骤与相关操作技巧,需要的朋友可以参考下 本文实例讲述了node实现的爬虫功能。分享给大家供大家参考,具体如下: node是服务器端的语言,所以可以像py…

    2025年3月8日
    200
  • 通用无限极下拉菜单的实现代码

    这篇文章主要介绍了关于通用无限极下拉菜单的实现代码,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 下拉菜单在我开发中经常遇到,但是没个项目都需要从新编写,改起来虽然简单但是很麻烦,我这个人还是比较懒的,今天有时间把我以前的项…

    编程技术 2025年3月8日
    200
  • 基于Vue实现拖拽功能

    这篇文章主要为大家详细介绍了vue实现拖拽功能,拖动方块进行移动,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了Vue实现拖拽功能的具体代码,供大家参考,具体内容如下 效果图: HTML代码:            …

    2025年3月8日
    200

发表回复

登录后才能评论