首页 > 其他分享 >babel

babel

时间:2024-04-28 23:12:37浏览次数:17  
标签:插件 babel 配置 编译 preset env

官网:https://babeljs.io/
民间中文网:https://www.babeljs.cn/

babel简介

而今天的JS世界缺少一座巴别塔,不同版本的浏览器能识别的ES标准并不相同,就导致了开发者面对不同版本的浏览器要使用不同的语言,和古巴比伦一样,前端开发也面临着这样的困境。

babel的出现,就是用于解决这样的问题,它是一个编译器,可以把不同标准书写的语言,编译为统一的、能被各种浏览器识别的语言

由于语言的转换工作灵活多样,babel的做法和postcss、webpack差不多,它本身仅提供一些分析功能,真正的转换需要依托于插件完成

babel的安装

babel可以和构建工具联合使用,也可以独立使用

如果要独立的使用babel,需要安装下面两个库:

  • @babel/core:babel核心库,提供了编译所需的所有api
  • @babel/cli:提供一个命令行工具,调用核心库的api完成编译
npm i -D @babel/core @babel/cli

babel的使用

@babel/cli的使用

它提供了一个命令babel

# 按文件编译
babel 要编译的文件 -o 编辑结果文件

# 按目录编译
babel 要编译的整个目录 -d 编译结果放置的目录

babel的配置

babel预设和postcss预设含义一样,是多个插件的集合体,用于解决一系列常见的兼容问题

通过配置文件.babelrc添加插件或预设

{
    "presets": [],
    "plugins": []
}

babel的预设

babel有多种预设,最常见的预设是@babel/preset-env

@babel/preset-env可以让你使用最新的JS语法,而无需针对每种语法转换设置具体的插件

配置

{
    "presets": [
        "@babel/preset-env"
    ]
}

兼容的浏览器

@babel/preset-env需要根据兼容的浏览器范围来确定如何编译,和postcss一样,可以使用文件.browserslistrc来描述浏览器的兼容范围

last 3 version
> 1%
not ie <= 8

自身的配置

postcss-preset-env一样,@babel/preset-env自身也有一些配置

具体的配置见:https://www.babeljs.cn/docs/babel-preset-env#options

配置方式是:

{
    "presets": [
        ["@babel/preset-env", {
            "配置项1": "配置值",
            "配置项2": "配置值",
            "配置项3": "配置值"
        }]
    ]
}

其中一个比较常见的配置项是usebuiltins,该配置的默认值是false

它有什么用呢?由于该预设仅转换新的语法,并不对新的API进行任何处理

例如:

new Promise(resolve => {
    resolve()
})

转换的结果为

new Promise(function (resolve) {
  resolve();
});

如果遇到没有Promise构造函数的旧版本浏览器,该代码就会报错

而配置usebuiltins可以在编译结果中注入这些新的API,它的值默认为false,表示不注入任何新的API,可以将其设置为usage,表示根据API的使用情况,按需导入API

{
    "presets": [
        ["@babel/preset-env", {
            "useBuiltIns": "usage",
            "corejs": 3
        }]
    ]
}

babel的插件

@babel/polyfill 已过时,目前被core-jsgenerator-runtime所取代

除了预设可以转换代码之外,插件也可以转换代码,它们的顺序是:

  • 插件在 Presets 前运行。
  • 插件顺序从前往后排列。
  • Preset 顺序是颠倒的(从后往前)。

通常情况下,@babel/preset-env只转换那些已经形成正式标准的语法,对于某些处于早期阶段、还没有确定的语法不做转换。

如果要转换这些语法,就要单独使用插件

下面随便列举一些插件

@babel/plugin-proposal-class-properties

该插件可以让你在类中书写初始化字段

class A {
    a = 1;
    constructor(){
        this.b = 3;
    }
}

@babel/plugin-proposal-function-bind

该插件可以让你轻松的为某个方法绑定this

function Print() {
    console.log(this.loginId);
}

const obj = {
    loginId: "abc"
};

obj::Print(); //相当于:Print.call(obj);

遗憾的是,目前vscode无法识别该语法,会在代码中报错,虽然并不会有什么实际性的危害,但是影响观感

@babel/plugin-proposal-optional-chaining

const obj = {
  foo: {
    bar: {
      baz: 42,
    },
  },
};

const baz = obj?.foo?.bar?.baz; // 42

const safe = obj?.qux?.baz; // undefined

babel-plugin-transform-remove-console

该插件会移除源码中的控制台输出语句

console.log("foo");
console.error("bar");

编译后

@babel/plugin-transform-runtime

用于提供一些公共的API,这些API会帮助代码转换

在webpack中使用

module.exports = {
    mode: "development",
    devtool: "source-map",
    module: {
        rules: [
            { test: /\.js$/, use: "babel-loader" }
        ]
    }
}

标签:插件,babel,配置,编译,preset,env
From: https://www.cnblogs.com/shmillly959/p/18164723

相关文章

  • 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......
  • 使用pnpm时,hoist-pattern[]=eslint hoist-pattern[]=babel这个配置的作用?
    在pnpm工作区(monorepo)中,hoist-pattern配置项用于决定哪些依赖应该被提升(hoist)到工作区的根节点node_modules目录中,而不是保留在每个工作区包各自的node_modules目录下。这有助于减少磁盘空间占用并加速依赖的安装速度。hoist-pattern[]=*eslint*和hoist-pattern[]=*babe......
  • 对于core-js相关的报错 core-js/modules/es.array.push.js in ./node_modules/.store
    Thesedependencieswerenotfound:*core-js/modules/es.array.push.jsin./node_modules/.store/@[email protected]/node_modules/@babel/runtime/helpers/construct.js,./node_modules/.store/@[email protected]/node_modules/@babel/runtime/helpers/esm/obj......
  • 编译工具 Babel
    编译工具BabelBabel主要有三个功能:转义ES6为ES5,保证新语法也可以在旧版本浏览器中运行。通过polyfill方式在目标环境中添加缺失特性。源码转换。1.安装Babel(1)生成package.jsonmkdirbabel-note&&cdbabel-note,npminit-y(2)安装@babel/core,@babel/clinpmi......
  • babel 基础概念 & 从零到一写一个 babel 插件
    babel基础概念简单来说,做语法转换兼容的,复杂一点的说,babel可以将我们写的ES6+的Javascript语法转换为向后兼容的语法,以便能够在旧版本的浏览器或者其他环境运行。babel生成代码的三个阶段解析(parse)输入:源码输出:AST转换(transform)输入:AST输出:AST(此AST非彼AST,是被......
  • Babel 插件种类
    Babel插件种类:语法插件(SyntaxPlugins):语法插件负责扩展Babel的解析器,使其能够理解和解析新的或实验性的JavaScript语法特性。它们并不直接对代码进行转换,只是开启对应语法的解析功能。这意味着,如果没有相应的语法插件,Babel将无法正确解析某些新的或实验性的JavaScri......
  • eslint报错:Parsing error: No Babel config file detected for E:\xxx\index.config
    eslint根据eslint配置文件的parserOption,知道了要使用babel对代码进行解析,但是解析babel需要使用babel配置文件,由于找不到配置文件(babel配置文件默认需要放在根目录下),所以会报错。因此,添加requireConfigFile:false,本质上是告诉eslint,不用查找这个配置文件了,虽然表面上可以解决这......
  • Babel
    Babel若想用babel,还得指明它用那套转码规则(任选一个)不会过期的转码规则:babel-preset-enves2015的转码规则:babel-preset-es2015最新的转码规则:babel-preset-latest比如:npminstallbabel-preset-es2015--save-dev......
  • webpack,babel配置项目适配IE11
    package.json"browserslist":["ie11"] webpack.config.jsconstpath=require('path')consthtmlWebpackPlugin=require('html-webpack-plugin')const{CleanWebpackPlugin}=require('clean-webpack-......