基于 webpack 的 Babel 学习笔记
来源:_月光临海     阅读:589
云上智慧
发布于 2019-08-22 03:35
查看主页

准备工作

成了!举国欢庆 ~此时目录结构(打包后)

babel 部分

准备工作就绪之后,开始 babel 相关的部分

没有再报错了
这证实语法已经转换成功,我们修改一下 webpack.config.js 的配置,将模式设置为 development,以便 yarn build 时看到的代码是未经压缩的。此外,关闭 sourcemap

mode: "development",      //  强制公告为 development 模式devtool: "none"        //  关闭 sourcemap

假如我们把条件换成支持这两种语法的浏览器呢?

此时并没有被转换

补充一下,假如开启了 debug,即可以在终端查看相关代码转换信息


开启 debug 后

补充一下 @babel/corecore-jsregenerator-runtime 的作用

名称作用
@babel/core解决新语法,比方 模板字符串letconst扩展运算符
core-js解决新 API,比方 PromiseSetMapObject.assign
regenerator-runtime解决 asyncawaitgenerator

以上内容可在开启 debug 后,在终端查看日志

index.js 中引入 @babel/polyfill,注意,是在所有代码最上面引入

import "@babel/polyfill"

运行

yarn serve
成功运行

打包看一下

yarn build

一万多行。。

dist/index.js
这是因为尽管我们只使用了 async,但是引入的是完整的 @babel/polyfill,等于把好多不用的 API 都引了进来,查看打包后的文件,可以看到
includes,values 等方法都被引入
这时我们即可以使用 useBuiltIns 配置项了

presets: [  [    '@babel/preset-env',      {        debug: true,        targets: {          browsers: ["ie >= 11"]        },        useBuiltIns: "usage"      //  看这里      }    ]  ]

再次打包,剩下 2000 多行,只保留了解决 async 的部分


再回头说一下这个 useBuiltIns 配置项,注意,是 @babel/preset-envuseBuiltIns

一共有三个值

作用能否需要在入口文件引入 @babel/polyfill
false默认值,无脑引入完整的 polyfill
entry引入 targets 中指定的浏览器版本所需的一律 polyfill
usage引入代码中用到的并且是 targets 中指定的浏览器版本所需的 polyfill否(安装还是需要安的,就是不需要在入口引入了)

以上可以通过开启 debug 在控制台中查看


当配置为 entry 时
当配置为 usage 时

方法二:
首先移除 @babel/polyfill

yarn remove @babel/polyfill

安装@babel/plugin-transform-runtime@babel/runtime

yarn add -D @babel/plugin-transform-runtimeyarn add @babel/runtime

安装 @babel/runtime 时可以发现只有 regenerator-runtime,没有 core-js,这就意味着 Promise,assign 不会被转译


安装完之后,修改一下 webpack.config.jsbabel-loader 的部分配置

plugins: [  [    "@babel/plugin-transform-runtime"  ]]

运行一下


正如预期,因为缺少了 core-js 导致部 Promise,assign 不能被支持。假如希望被支持,则还需安装 @babel/polyfill


方法三:
先移除 @babel/runtime 再安装 @babel/runtime-corejs2

yarn remove @babel/runtimeyarn add @babel/runtime-corejs2


修改 webpack.config.jsbabel-loader 配置项

module: {  rules: [    {      test: /\.m?js$/,      exclude: /(node_modules|bower_components)/,      use: {        loader: 'babel-loader',        options: {          presets: [            [              '@babel/preset-env',              {                debug: true,                targets: {                  browsers: ["ie >= 11"]                  // browsers: ["chrome >= 60"]                },                useBuiltIns: "usage"              }            ]          ],          plugins: [            [              "@babel/plugin-transform-runtime",              {                "corejs": 2,              }            ]          ]        }      }    }  ]}

修改后,再次运行项目,又恢复了正常 Promise,async,Object.assign 均可以跑在 IE11 上了


@babel/polyfill
@babel/plugin-transform-runtime + @babel/runtime-corejs2
免责声明:本文为用户发表,不代表网站立场,仅供参考,不构成引导等用途。 系统环境 服务器应用
相关推荐
iPhone完成这些设置,让你的电池更持久。#手机使用技巧
Objective-C实现链式编程语法(DSL)
mysql 常见的sql语句优化分析
小说:雨夜送美女同事回家,她邀请我上楼喝茶,卧室突然传来尖叫
手机定位App从想法到上线经营(1)--详情
首页
搜索
订单
购物车
我的