babel import语法 js_使用Babel转换JavasCript代码

本文介绍了Babel的基础概念和作用,详细阐述了如何使用Babel进行JavaScript代码转换,包括在命令行中的基本操作、配置文件的使用、@babel/preset-env的配置和应用。此外,还探讨了Babel的polyfill和runtime的差异及使用场景,并提供了在Webpack中整合Babel的示例。
摘要由CSDN通过智能技术生成

一、基础概念

Babel 是 JavaScript 的编译器,通过 Babel 可以将我们写的最新 ES 语法的代码轻松转换成任意版本的 JavaScript 语法。随着浏览器逐步支持 ES 标准,我们不需要改变代码,只需要修改 Babel 配置即可以适配新的浏览器。

主要类库:

1)@babel/core

2)@babel/cli Babel 自己的 CLI(Command-Line Interface,命令行界面) 工具

3)@babel/preset-env插件组合

4)@babel/polyfill

5)@babel/runtime Babel 插件组合@babel/plugin-transform-runtime

二、深入部分

2.1 Babel基础使用示例

2.1.1 新建项目文件夹,创建一个babel.js文件:

// babel.js
[1, 2, 3].map(n => n ** 2);

下载Babel依赖:

npm i -D @babel/core @babel/cli

然后执行npx babel babel.js则会看到输出的内容:

020c9fc554c10163bf48045ae866d493.png

可以看到输出的内容跟源文件内容没有区别,这是因为没有加转换规则,下面安装@babel/preset-env。然后执行 CLI 的时候添加--presets flag:

# 安装 preset-env
npm i -D @babel/preset-env
# 执行 CLI 添加--presets
npx babel babel.js --presets=@babel/preset-env

2b3bbbc3d970fbc4ebdbefbc3d746add.png

可以看到最终输出的代码就是转换为 ES5 的代码了:

"use strict";

// babel.js
[1, 2, 3].map(function (n) {
  return Math.pow(n, 2);
});

如果要输出结果到固定文件,可以使用--out-file-o参数:npx babel babel.js -o output.js

add7cda89b192ecc3eb30194d0ed08da.png

2.2 除了使用命令行配置 flag 之外,Babel 还支持配置文件,配置文件支持两种:

  • 使用package.jsonbabel属性;
  • 在项目根目录单独创建.babelrc或者.babelrc.js文件。
// package.json
{
    "name": "my-package",
    "version": "1.0.0",
    "babel": {
        "presets": ["@babel/preset-env"]
    }
}
// .babelrc
{
    "presets": ["@babel/preset-env"]
}

Babel会在正在被转义的文件当前目录中查找一个.babelrc文件。 如果不存在,它会向外层目录遍历目录树,直到找到一个.babelrc文件,或一个package.json文件中有"babel": {}

2.2.1 示例-在2.1例子的基础上删去之前生成的output.js文件,新建一个.babelrc文件写入presets配置,再执行npx babel babel.js -o output.js

ff8d5c8a1405b5e0cb345a5d2c5b70ff.png

2.3 Babel 的插件和 Preset

Babel 的插件分为两类:转换插件和语法解析插件。

转换插件主要职责是进行语法转换的(比如我们要将箭头函数转换为 ES5 函数写法,那么可以单独安装@babel/plugin-transform-arrow-functions插件),而解析插件则是扩展语法的,比如我们要解析jsx这类 React 设计的特殊语法,则需要对应的 jsx 插件。如果不想一个个的添加插件,那么可以使用插件组合 preset(插件预设,插件组合更加好理解一些),最常见的 preset 是@babel/preset-env

@babel/preset-env是 Babel 官方推出的插件预设,它可以根据开发者的配置按需加载对应的插件,通过@babel/preset-env我们可以根据代码执行平台环境和具体浏览器的版本来产出对应的 JavaScript 代码,例如可以设置代码执行在 Node.js 8.9 或者 iOS 12 版本。

2.4 Babel polyfill

Babel 只负责进行语法转换,即将 ES6 语法转换成 ES5 语法,但是如果在 ES5 中,有些对象、方法实际在浏览器中可能是不支持的,例如:PromiseArray.prototype.includes,这时候就需要用@babel/polyfill来做模拟处理。

’@babel/polyfill’实际是core-js和regenerator-runtime的合集。

@babel/polyfill使用方法是先安装依赖,然后在对应的文件内显性的引入:

# 安装,注意因为代码中引入了 polyfill,所以不再是开发依赖(--save-dev,-D)
npm i @babel/polyfill

在文件内直接import或者require进来:

// polyfill
import '@babel/polyfill';
console.log([1, 2, 3].includes(1));

babel-polyfill会污染全局,如果做一个独立的web系统则无碍,但做一个三方的库lib就会出问题;babel-runtime不会污染全局环境(_include, _promise这种写法)。

2.5 Bable runtime

@babel/polyfill虽然可以解决模拟浏览器不存在对象方法的事情,但是有以下两个问题:

1)直接修改内置的原型,造成全局污染;

2)无法按需引入,Webpack 打包时,会把所有的 Polyfill 都加载进来,导致产出文件过大。

为了解决这个问题,Babel 社区又提出了@babel/runtime的方案,@babel/runtime不再修改原型,而是采用替换的方式,比如我们用 Promise,使用@babel/polyfill会产生一个window.Promise对象,而@babel/runtime则会生成一个_Promise(示例)来替换掉我们代码中用到的Promise。另外@babel/runtime还支持按需引入。

2.5.1 使用示例:以@babel/runtime转换Object.assign为例

npm i @babel/runtime # 安装依赖@babel/runtime
npm i -D @babel/plugin-transform-runtime # 安装@babel/plugin-transform-runtime作为 Babel 插件
npm i -D @babel/plugin-transform-object-assign #安装需要转换Object.assign的插件

编写一个runtime.js文件,内容如下:

Object.assign({}, {x: 1})

执行npx babel runtime.js --plugins @babel/plugin-transform-runtime,@babel/plugin-transform-object-assign

d2f8ab1425e4f370d3a60d0e50211508.png

最终的输出结果是:

"use strict";

var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");

var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));

(0, _extends2["default"])({}, {
  x: 1
});

三、在webpack中使用Babel

babel:JS新语法编译工具,不关心模块化只处理语法;
webpack:打包构建工具,处理模块化,是多个loader、plugin能力的集合;

3.1 示例-在2.1.1例子文件夹的基础上

npm init初始化package.json文件。首先安装 npm 依赖,然后创建webpack.config.js配置文件

# 安装开发依赖
npm i babel-loader @babel/core @babel/preset-env @babel/plugin-transform-runtime -D
npm i webpack webpack-cli -D
# 将 runtime 作为依赖
npm i @babel/runtime -S

可以直接将 Babel 的配置写到webpack配置文件的rules数组use的options中,还可以在项目根目录下创建.babelrc或者使用package.son的 babel 字段。这里我们直接使用2.2.1中创建好的.babelrc文件:

// webpack.config.js
module.exports = {
    entry: './babel.js',
    mode: 'development',
    devtool: false,
    module: {
        rules: [
            {
                test: /.js$/,
                use: [
                    {
                        loader: 'babel-loader'
                    }
                ]
            }
        ]
    }
};

.babelrc

{
    "presets": [
        [
            "@babel/preset-env", 
            {
            "useBuiltIns": "usage" // 按需加载:usage 表示明确使用到的 Polyfill 引用。在一些 ES2015+ 语法不支持的环境下,每个需要用到 Polyfill 的引用时,会自动加上
            }
        ]
    ]
}

package.json中加入npm scripts流的webpack命令:

"scripts": {
    "test": "echo "Error: no test specified" && exit 1",
+    "build": "webpack --config webpack.config.js"
  },

执行npm run build打包:

efa42735ba47d31e36ddcb5b74b7e997.png

发现报错,阅读提示发现需要安装core-js

npm install --save core-js@2

然后在npm run build:

09e53a5ee43421c12059b58e049a0d40.png

代码见:github

本文引用参考:

08 在 Webpack 中使用 Babel 转换 JavaScript 代码-慕课专栏​www.imooc.com Babel基本概念​coding.imooc.com
当你在Node.js项目中使用Babel Loader处理ES6模块的时候,遇到`ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING`错误通常是因为Babel动态导入功能没有被正确配置,或者是在某个地方尝试了Babel无法识别的动态导入语法。 这个错误通常是由于Webpack在处理async函数内部的import语句时,需要一个回调函数来处理异步加载。当缺少这个回调时,Webpack会抛出这个错误。解决这个问题的一般步骤包括: 1. **确认Babel配置**:确保你在`.babelrc`文件或Webpack配置中启用了`@babel/plugin-syntax-dynamic-import`插件,它负责解析动态导入语法。 ```json { "plugins": ["@babel/plugin-syntax-dynamic-import"] } ``` 2. **设置require.context**:如果你在使用Webpack的`require.context`或`dynamicImport` API,确保你正确地设置了回调函数来处理动态加载的内容。 ```javascript const dynamicImports = require.context('path/to/dirs', true, /\.js$/); dynamicImports.keys().forEach(file => { dynamicImports(file); }); ``` 3. **检查动态import使用**:确保你的代码中动态导入是正确的,比如`await import()`的使用应该在支持它的环境(如浏览器或运行时有对应的polyfill)。 如果上述步骤都做了还是有问题,可能是其他第三方库的问题,或者代码中有未预期的异步结构导致的。可以检查相关的源码或者更新依赖版本看看是否能解决问题。如果问题仍然存在,提供更具体的报错堆栈信息会有助于诊断。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值