首页 > 其他分享 >说说babel

说说babel

时间:2024-11-30 12:59:03浏览次数:10  
标签:node 插件 plugin babel loader 转译

什么是babel?

babel是一种转译文本,目的是将es6以上的语法转译为es5能够识别的语法,以供浏览器或者node进行识别

使用方法

Babel一共有三种使用方法,分别是:

1.单体文件

2.命令行

3.构建工具的插件(webpack的babel-loader等)

运行方式和插件

运行方式:

babel一共分为了三个阶段:解析,转换,生成

需要注意的是,babel本身不具备任何转译方式,他的转化功能全部存在plugin当中,也就是说,当我们不使用任何插件时,使用babel转译出来的文本和不使用的效果是一样的。

插件:

babel的插件一共分为两种,分别是语法插件和转译插件

op:当我们使用了语法插件后就不要用转译插件了

配置文件:

那么我们如何配置babel的插件呢?

1.将插件名字配置到配置文件中(在根目录下创建一个.babelrc或者package.json的babel中)

2.使用npm-install babel-plugin-xxx进行安装

preset:

babel提供的一个插件的集合,开发者在使用时不用重复进行定义安装,提高了开发效率。

执行顺序:

  1. plugin会运行在preset之前

  2. plugin运行方式是从前至后

  3. preset运行方式是从后到前

插件和plugin的配置项

极简情况下(也就是不进行任何配置的情况下),插件和preset只需列出名字即可,但大部分情况下是要做一些配置时,需要将自己转化为一个数组,第一个是名字,后面则是配置项

"presets": [
    // 带了配置项,自己变成数组
    [
        // 第一个元素依然是名字
        "env",
        // 第二个元素是对象,列出配置项
        {
          "module": false
        }
    ],

    // 不带配置项,直接列出名字
    "stage-2"
]

env的配置

{
  "presets": [
    ["env", {
      "targets": {
        "browsers": ["last 2 versions", "safari >= 7"]
      }
    }]
  ]
}

其他的一些babel配置

Babel-cli

顾名思义,安装了babel-cli我们就可以在命令行去执行babel操作

Babel-node

在babel7以下的版本中,babel-node是存在于babel-cli中的,所以使用它不需要额外安装,他的目的是在node环境中直接运行es6以上的语法规范,而不需要进行转译。

他的作用相当于babel-polyfill + babel-register

Babel-register

babel-register改写require命令,为他加上了一个钩子,每次在执行.js,.jsx等文件名后缀时都会进行转译

使用时必须先加载require('babel-register')

babel-register只会对require命令加载的文件进行转译,而不会对本文件进行转译。

只适合在开发环境下使用

Babel-polyfill

我们要知道,babel只会转译js的语法,而不会去转译其更新的api,比如 Iterator、Generator、Set、Maps、Proxy、Reflect、Symbol、Promise 等全局对象,以及一些定义在全局对象上的方法(比如 Object.assign)都不会转码。

那么这时我们就需要借助babel的配置,babel-polyfill,在webpack.config.js中将babel-polyfill作为第一个entry引入。

但他有两个巨大的缺点,一是打包出来的文件较大,因为他会加载所有的方法,但是我们可能只需要转译其中的一个方法,这样就没必要了,二是他会污染全局变量,所以我们现在已经不常用了

但如果代码中包含高版本 js 中类型的实例方法 (例如 [1,2,3].includes(1)),这还是要使用 polyfill。

Babel-runtime 和babel-plugin-transform-runtime

Babel-plugin-transform-runtime

以async为例,假如我们不使用这个配置的话处理后的文件应该是这样:
// babel 添加一个方法,把 async 转化为 generator
function _asyncToGenerator(fn) { return function () {....}} // 很长很长一段

// 具体使用处
var _ref = _asyncToGenerator(function* (arg1, arg2) {
  yield (0, something)(arg1, arg2);
});

我们看到如果不引入该插件他会定义一个async类型的函数,接着调用,但每个被转译的文件都会定义一次asynctogenerator,那么这样会造成时间和空间的浪费。

op:为什么每个被转译的文件都会定义?

因为这是babel的默认行为,文件作用域

  • 在每个文件中引入 _asyncToGenerator 是为了避免跨文件的依赖关系。

  • 这种方式保证了单独运行一个文件时,代码仍然可以正常工作。

那么我们使用babel-plugin-transform-runtime呢?

// 从直接定义改为引用,这样就不会重复定义了。
var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator');
var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);

// 具体使用处是一样的
var _ref = _asyncToGenerator3(function* (arg1, arg2) {
  yield (0, something)(arg1, arg2);
});

我们看到,定义变为了引用,这样就不会重复定义,节约了时间空间。

我们看到,在使用babel-plugin-transform-runtime的同时,我们也使用了babel-runtime,那么runtime的作用是什么呢?

他的内部集成了以下几种类型:

  1. core-js:转换一些内置类(promise,symbol等)和静态方法(array from),绝大部分转换都是在这里做的,自动引入

  2. regenerator: 作为 core-js 的拾遗补漏,主要是 generator/yieldasync/await 两组的支持。当代码中有使用 generators/async 时自动引入。

  3. helpers:上面的asyncToGenerator就是其中一个,在代码中内置的helpers使用时会移除第一段定义,而变成第二段的引用

op:

常见的一些helpers:

_asyncToGenerator:将 async/await 转换为基于 Generator 的代码。

_inherits:实现类继承。

_extends:实现对象的展开(类似于 Object.assign)。

_typeof:检查变量类型的兼容实现。

Babel-loader

在一些大型项目中,我们会用webpack进行项目的打包构建,在压缩后的代码我们使用babel处理理论上来说效率很低,需要的时间很长,那么我们有没有一种办法,在文件压缩前进行babel处理呢,这样就有了babel插入构建文件的需求,webpack中有loader,便有babel-loader这个东西

常见配置:
module: {
  rules: [
    {
      test: /\.js$/,
      exclude: /(node_modules|bower_components)/,
      loader: 'babel-loader'
    }
  ]
}

当然,复杂一点,我们还想引入babel的一些配置,可以这么写:

// loader: 'babel-loader' 改成如下:
use: {
  loader: 'babel-loader',
  options: {
    // 配置项在这里
  }
}

这样的配置优先级是最高的。

babel7版本的一些改变

本质上来说核心机制没有变化,不过改动了一些写法和用法

Npm package名称的变化:

这是 babel 7 的一个重大变化,把所有 babel-* 重命名为 @babel/*,例如:

  1. babel-cli 变成了 @babel/cli

  2. babel-preset-env 变成了 @babel/preset-env。进一步,还可以省略 preset 而简写为 @babel/env

  3. babel-plugin-transform-arrow-functions 变成了 @babel/plugin-transform-arrow-functions。和 preset 一样,plugin 也可以省略,于是简写为 @babel/transform-arrow-functions

当然,.babelrc的配置也要发生改变,例如:

{
  "presets": [
-   "env"
+   "@babel/preset-env"//改成@babel的写法
  ]
}

不再支持低版本的node

node>=6

Babel/node从babel/cli中独立了

之前我们提到过,babel/node之前是父子关系,现在node强起来了,需要独立安装了

标签:node,插件,plugin,babel,loader,转译
From: https://blog.csdn.net/2401_86877597/article/details/144153175

相关文章

  • 关于安装Babel的问题有哪位大佬能指点指点我吗?
    我在vscode上安装babel,总是显示以下错误:npmerrorcodeENOTFOUNDnpmerrorsyscallgetaddrinfonpmerrorerrnoENOTFOUNDnpmerrornetworkrequesttohttp://registry.cnpmjs.org/@babel%2fcorefailed,reason:getaddrinfoENOTFOUNDyour-proxy-urlnpmerr......
  • [babel] babel的工作原理
    Babel是什么Babel是一个通用的多功能的JavaScript编译器。主要用于将采用ECMAScript2015+语法编写的代码转换为向后兼容的JavaScript语法,以便能够运行在当前和旧版本的浏览器或其他环境中。常见的用途有:语法转换通过Polyfill方式在目标环境中添加缺失的功能(通过引......
  • Setup Babel ES6 for Express and Nodejs
    Createprojectandinstalldependenciesmkidrmy-app&&cdmy-appnpminit-ynpmi-D@babel/cli@babel/core@babel/node@babel/preset-envnpmiexpresssCreate.babelrc{"presets":["@babel/preset-env"]}Writeawebs......
  • 升级babel7后,直接引用element-ui中没有暴露出来的组件image-viewer.vue导致的打包错误
    问题&解决方案升级babel7后,原先代码中像这样直接引用element-ui组件的地方,出现了报错Moduleparsefailed:Unexpectedtoken(1:0)Youmayneedanappropriateloadertohandlethisfiletype.经过一番排查,我发现问题出在element-ui并未直接暴露该组件,导致直接引用时......
  • Babel 转码器
    Babel是一个广泛使用的ES6转码器,可以将ES6代码转为ES5代码,从而在老版本的浏览器执行。这意味着,你可以用ES6的方式编写程序,又不用担心现有环境是否支持。下面是一个例子。//转码前input.map(item=>item+1);//转码后input.map(function(item){returnitem......
  • Vue | babel.config.js 配置详解
    babel.config.js 1概述Babel相当于一个中介,一边是用户,另一边是浏览器。这几年,JavaScript发生了很大的变化,许多新特性在很多浏览器里都不支持。Babel的主要作用就是规避这些问题,可以确保JavaScript代码兼容所有的浏览器,比如IE11。2Babel的工作原理Babel使用AST把......
  • Babel与core-js
    1.Babel是把ES6的语法转成ES5比如:const、箭头函数、...(结构)、模板字符串等等Babel原理转译分为三阶段:解析(Parse),将代码解析⽣成抽象语法树AST,也就是词法分析与语法分析的过程转换(Transform),对语法树进⾏变换方面的⼀系列操作。通过babel-traverse,进⾏遍历并作添加、更新、......
  • babel
    官网:https://babeljs.io/民间中文网:https://www.babeljs.cn/babel简介而今天的JS世界缺少一座巴别塔,不同版本的浏览器能识别的ES标准并不相同,就导致了开发者面对不同版本的浏览器要使用不同的语言,和古巴比伦一样,前端开发也面临着这样的困境。babel的出现,就是用于解决这样的......
  • 42 Typescript编译配置-webpack-babel
    TS编译配置自动编译单个文件tsc1.ts#如果想要自动监视文件的变化,需要添加`-W`配置tsc1.ts-W自动编译整个项目初始化,会自动生成一个tsconfig.json文件,然后直接执行tsc命令,就可以对当前目录的所有ts文件进行编译,生成对应的js文件#初始化项目tsc--init#编译......
  • @babel/plugin-transform-runtime 这个包的使用场景是什么
    @babel/plugin-transform-runtime是Babel转译工具的一个插件,用于处理JavaScript代码中的新语言特性和API。它的使用场景主要包括以下几个方面:避免全局污染:当使用Babel转译包含新特性的代码(如箭头函数、解构赋值、模板字符串等)时,Babel通常会生成辅助函数(helperfunct......