Babel

Posted 转角90

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Babel相关的知识,希望对你有一定的参考价值。

Babel的作用

将ES6+、TS、React等转换成普通的js代码,供浏览器识别

Babel命令行使用

单独使用

  • @babel/core
  • @babel/cli
  • @babel/plugin-transform-block-scoping: 块级作用域插件
  • @babel/plugin-transform-arrow-function: 箭头函数插件
npx babel ./src  --out-dir ./build --plugins=@babel/plugin-transform-block-scoping,@babel/plugin-transform-arrow-function
# 将当前src目录下的文件进行转换,输出到build文件夹中,转换规则--plugins
  • @babel/preset-env:预设preset,需要转换的过多时
npx babel ./src/ --out-dir ./build --presets=@babel/preset-env

Babel底层原理

可以将Babel看作是一个编译器

工作流程

  • 解析阶段
    • 词法分析
    • 语法分析
  • 转换阶段
    • AST抽象语法树
    • 运用各种plugin
    • 生成一个新的AST
  • 生成阶段
    • 代码生成输出阶段

`@babel/runtime` 和 `@babel/plugin-transform-runtime` 版本

【中文标题】`@babel/runtime` 和 `@babel/plugin-transform-runtime` 版本【英文标题】:`@babel/runtime` and `@babel/plugin-transform-runtime` versions 【发布时间】:2019-01-05 16:12:03 【问题描述】:

@babel/runtime@babel/plugin-transform-runtime 是否应该在同一个版本上(例如,两个 7.2.0 完全相同)?或者我可以(作为库作者)将@babel/runtime 依赖项指定为^7.0.0,同时拥有最新的@babel/plugin-transform-runtime

我知道在 Babel 7 的 beta 版本期间,beta.56(请参阅https://***.com/a/51686837/2148762)发生了重大变化,但我猜当前的稳定版本应该不再是这种情况?

我问这个的原因是我理想地希望来自@babel/runtime 的助手在不同的包之间共享,并且对我来说保持版本范围开放似乎是个好主意。但与此同时,我不确定我应该降到多低(^7.0.0^7.2.0),以及@babel/runtime@babel/plugin-transform-runtime 之间是否存在关于版本号的隐含合同。

【问题讨论】:

【参考方案1】:

默认情况下,@babel/plugin-transform-runtime 只允许输出对 @babel/runtime 的引用,这些引用在 ^7.0.0 上工作,因为它不知道您要使用什么版本,并且做任何其他事情都会导致很多问题用户。这意味着您想做的事情是安全的。这样做的缺点是,如果我们继续添加新的助手,您的代码将无法利用它们的 @babel/runtime 版本(因为您可能仍在使用没有它们的 @babel/runtime 版本.

如果您想专门使用自 7.0.0 以来可能已添加到 Babel 的帮助器,用户可以在转换的参数中指定 version,例如


  "plugins": [
    ["@babel/plugin-transform-runtime",  version: "^7.2.0" ],
  ]

然后将要求您在 package.json 中包含 "@babel/runtime": "^7.2.0"

例如,由于直到 Babel 7.1.5 才支持更新的装饰器提案,如果您使用 transform-runtime 和非legacy 装饰器,装饰器助手仍将插入到您使用的每个文件中装饰器,而不是从 @babel/runtime 导入它。要获取共享助手,您需要在 transform-runtime 的选项中指定 version: "^7.1.5"

我能否(作为库作者)将 @babel/runtime 依赖项指定为 ^7.0.0,同时拥有最新的 @babel/plugin-transform-runtime?

是的,这是安全的。

我猜现在的稳定版本应该不再是这种情况了?

正确,这个问题是因为人们没有考虑到 beta 版本。

【讨论】:

以上是关于Babel的主要内容,如果未能解决你的问题,请参考以下文章

babel版本变化 - 简单理解

`@babel/runtime` 和 `@babel/plugin-transform-runtime` 版本

找不到模块 'babel-core' 但已安装 @babel/core

es6的babel转换器需要依赖啥环境吗

babel从入门到入门

Babel