首页 > 建站教程 > 前端框架 >  webpack5学习笔记:babel、polyfill、解析jsx正文

webpack5学习笔记:babel、polyfill、解析jsx

# babel

## 安装核心库:`npm install @babel/core -D`


## 为什么要用

1. 转换ES6等新语法、解析typescript、解析react、vue等的jsx语法等。

2. Babel是一个工具链,类似于post-css,支持很多基于它的插件。


## 命令行使用

### babel本身是一个独立工具,不一定要和 webpack 一起使用

### 单独使用

1. 安装命令行工具(在webpack中使用不需要安装):`npm install @babel/cli -D`

2. 命令行命令:`npx babel src/index.js --out-dir result`   // src/index.js为处理的文件,如果要处理文件夹里所有文件,这里就传文件夹名:src

3. 此时生成文件并没有进行转换,需要借助babel插件

4. 安装箭头函数转换插件:`npm install @babel/plugin-transform-arrow-functions -D`

5. 命令行命令:`npx babel src/index.js --out-dir result --plugins=@babel/plugin-transform-arrow-functions`

6. 此时,箭头函数就被转换了。

7. 安装块级作用域转换插件:`npm install @babel/plugin-transform-block-scoping -D`

8. 执行命令,多个插件,逗号隔开:`npx babel src/index.js --out-dir result --plugins=@babel/plugin-transform-arrow-functions,@babel/plugin-transform-block-scoping`

9. 此时,const、let、箭头等都被转换了


### @babel/preset-env 使用babel预设,不用上面的方法一个一个转,否则太麻烦

1. 安装:`npm install @babel/preset-env -D`

2. 命令行命令:`npx babel src/index.js --out-dir result --presets=@babel/preset-env`

3. 此时都转换了。


## Babel的底层原理

1. Babel是一种编译器,将一种原生语言(ES6+、TS、JSX),转成另一种原生语言:ES5

2. Babel也有编译器的工作流程:

    Ⅰ、解析阶段(Parsing)

    Ⅱ、转换阶段(Transformation)

    Ⅲ、生成阶段(Code Generation)

   


## babel 在 webpack.config.js 中的配置

1. 先安装 npm install babel -D、npm install @babel/core -D、 npm install babel-loader -D 以及相关插件

2. webpack中配置:

```

module: {

        rules: [

            {

                test: /\.js$/,

                use: {

                    loader: 'babel-loader',

                    options: {

                        // 一个一个加,麻烦

                        // plugins: [

                        //     '@babel/plugin-transform-arrow-functions',

                        //     '@babel/plugin-transform-block-scoping'

                        // ]

                        // 一个顶所有

                        presets: [

                            // 传参写法:更多见:https://babeljs.io/docs/en/babel-preset-env

                            // ['@babel/preset-env', {

                            //     targets: ["chrome 88"]  // 参与babel的浏览器,优先级比 .browserslistrc 更高,但不建议写在这

                            // }]

                            // 不传参写法

                            '@babel/preset-env'

                        ]

                    }

                }

            }

        ]

    },

```


## babel 配置文件

1. 简化 webpack.config.js 中的配置:

```

{

    test: /\.js$/,

    use: {

        loader: 'babel-loader'

    }

}

```

2. 在根目录新建配置文件,文件名可以是:

    Ⅰ、babel.config.json(或者.js, .cjs, .mjs)

    Ⅱ、.babelrc.json(或者.babelrc, .js, .cjs, .mjs)

    两种文件的区别:

    Ⅰ、.babelrc.json:早期使用,对于配置Monorepos项目比较麻烦

    Ⅱ、babel.config.json:推荐,可以作为 Monorepos 项目的子包

3. 文件内容

    如果是JSON文件:

```

{

    presets: [

        '@babel/preset-env'

    ]

}

```

    如果是js文件:

```

module.exports = {

    presets: [

        '@babel/preset-env'

    ]

}

```



# polyfill

## 解释:填充物,补丁,垫片,可以帮助更好的使用JavaScript,比如 promise、generator、symbol、Array.prototype.include的新特性,polyfull可以打补丁,让老浏览器识别


## 如何使用

1. 安装两个包:core-js、regenerator-runtime

```

npm install core-js regenerator-runtime

```

2. 在 babel配置文件中配置:

```

presets: [

        ['@babel/preset-env', {

            // 三个值:

            // false:不使用polyfill

            // usage:根据源代码需要哪些polyfill就用哪些polyfill、

            // entry:手动在入口文件中导入 core-js、regenerator-runtime,根据目标浏览器引入所对应的 polyfill

            useBuiltIns: 'usage',

            corejs: 3, // 指定 core-js 使用版本,否则会报:We noticed you're using the `useBuiltIns` option without declaring a core-js version.

        }]

    ]

}

```

3. 在webpack.config.js中最好配置exclude,排除node_modules里的代码,不用babel:

 module: {

    rules: [

        {

            test: /\.js$/,

            exclude: /node_modules/,

            use: {

                loader: 'babel-loader'

            }

        }

    ]

},

4. 在入口文件引入下面的插件

```

import 'core-js/stable'

import 'regenerator-runtime/runtime'

```



# Plugin-transform-runtime

## 介绍

    在编写工具库,使用polyfill,当别人使用时,工具库通过polyfill添加的特性,可能会污染别人的代码,babel更推荐使用:@babel/plugin-transform-runtime来完成polyfill


## 安装

1. 安装 @babel/runtime:

`npm install @babel/runtime -S`

2. 安装 Plugin-transform-runtime:

`npm install @babel/plugin-transform-runtime -D`

3. 安装 corejs3

`npm install @babel/runtime-corejs3 -S`


## webpack中配置

module: {

    rules: [

        {

            test: /\.js$/,

            use: {

                loader: 'babel-loader'

            }

        }

    ]

},

plugins: [

    ['@babel/plugin-transform-runtime', {

        corejs: 3

    }]

]



# React的JSX支持

## 安装依赖:

```

npm install @babel/preset-react -D

```

## 配置webpack.config.js

module: {

    rules: [

        // npm install babel -D、npm install @babel/core -D、 npm install babel-loader -D

        {

            test: /\.jsx?$/,

            exclude: /node_modules/,

            use: {

                loader: 'babel-loader'

            }

        }

    ]

},

## 配置babel.config.js

module.exports = {

    presets: [

        ['@babel/preset-env', {

            useBuiltIns: 'usage',

            corejs: 3, // 指定 core-js 使用版本,如果 corejs报错,可能就是版本问题

        }],

        ['@babel/preset-react']

    ]

}