手把手教你配babel

186 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情

对Babel的理解

来自Babel官方文档的描述

Babel是一个JavaScript编译器 简短的一句话高度概括了Babel的作用,但也免不了小白读完后的一头雾水

更简单的理解可以把Babel当做一个工具包,里面提供了各种各样的工具帮助我们对JS做兼容性处理,这样就不必担心用了新特性而不被旧版本的浏览器识别

有哪些工具?

在配置Babel时有两个核心配置项:presetsplugins,这也就告诉我们Babel中的工具大致可以分为预设与插件两类,预设其实也是一个插件的集合,它存在的意义是将一系列常用的插件打包到一起,这样就不用写一堆配置项,使代码臃肿

常用presets

  • @babel/preset-env:包含了当前所有的标准ES语法转换预设,一个预设解决所有语法转换问题
  • @babel/preset-react: 处理react相关语法转换的预设
  • @babel/preset-typescript:处理typescript相关语法转换的预设

常用plugins

  • @babel/runtime:ES语法转换的辅助函数包,它还有2个升级版@babel/runtime-corejs2@babel/runtime-corejs3,这两个包除了ES语法转换的辅助函数外,还包含了core-js的API转换函数,分对应core-js2版本与core-js3版本,按需下载其中一个即可
  • @babel/polyfill:用来对ES相关的API进行转译,与@babel/runtime-corejs2功能相近,区别是@babel/polyfill会造成全局变量污染,而@babel/runtime-corejs2不会
  • @babel/plugin-transform-runtime:最为常用,主要有3个作用
    • 自动按需从@babel/runtime中引入所需的ES语法转换辅助函数,否则需要手动引入
    • 自动按需引入@babel/runtime-corejs3/core-js-stable/,做无变量污染的core-js3的API补全
    • 自动按需引入@babel/runtime/regenerator,做无变量污染的Generator/async的API补全

动手实践一下

下载babel-loader

npm install @babel/core babel-loader

webpack配置文件中添加babel-loader

module: {
        rules: [
            {
                test: /.js$/,
                exclude: /node_modules/,
                loader: 'babel-loader',
            }
        ]
    }

下载所需的babel预设与插件,这里我们采用@babel/preset-env + @babel/runtime-corejs2 + @babel/plugin-transform-runtime的方案,可实现对新语法的按需导入转译,对新API以无变量污染的形式按需导入转译

npm install @babel/preset-env @babel/runtime-corejs2 @babel/plugin-transform-runtime

package.json文件同级目录下创建Babel配置文件babel.config.js(注:有时会在官方提供的脚手架中看到.babelrcbabelrc.js这样的文件,其实都是Babel的配置文件,选其一即可)并进行配置

module.exports = {
    "presets": ["@babel/preset-env"],
    "plugins": [
        [
            "@babel/plugin-transform-runtime",
            {
                "corejs": 2,
            }
        ]
    ]
}

package.json中配置browserslist项指定需要适配的浏览器范围

"browserslist": [
    “chrome 38"
]

这里的意思是指定目标环境为Chrome38

接着我们来写一些代码

const addFunction = (a, b) => a+b
let pp = Promise.resolve('ok')

pp.then(console.log)
console.log(addFunction(1,2));

执行代码npm run dev,看一看转换后的结果

image.png 可以看到箭头函数已经被转换为普通函数的形式,let被转换为var,并且Promise API也以无变量污染的方式引入

到这大概完成了对Babel配置入门的介绍,最后给大家再分享一些在学习Babel时看到的很不错的文章和博客

姜瑞涛老师的Babel教程
Eleven的babel配置实践博客