• 前端工程化之:webpack4-2(babel预设+babel插件+webpack中运行)


    一、babel预设

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

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

    1.配置:

    1. {
    2. "presets": [
    3. "@babel/preset-env"
    4. ]
    5. }

    2.兼容的浏览器:

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

    1. last 3 version
    2. > 1%
    3. not ie <= 8

    3.自身的配置:

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

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

    配置方式是:

    1. {
    2. "presets": [
    3. ["@babel/preset-env", {
    4. "配置项1": "配置值",
    5. "配置项2": "配置值",
    6. "配置项3": "配置值"
    7. }]
    8. ]
    9. }

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

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

    例如:

    1. new Promise(resolve =>{
    2. resolve()
    3. });
    4. const str = '字符';

     转换的结果为:

    1. "use strict";
    2. new Promise(function (resolve) {
    3. resolve();
    4. });
    5. var str = '字符串';

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

    而配置 usebuiltins 可以在编译结果中注入这些新的 API ,它的值默认值为 false ,表示不注入任何新的 API ,可以将其设置为 usage ,表示根据 API 的使用情况,按需导入 API 。最终运行的代码依赖于 corejs ,因此需要安装 corejs 。

    npm i core-js
    1. {
    2. "presets": [
    3. ["@babel/preset-env", {
    4. "useBuiltIns": "usage",
    5. "corejs": 3 //corejs版本
    6. }]
    7. ]
    8. }
    1. "use strict";
    2. require("core-js/modules/es.object.to-string");//需要安装corejs才能运行
    3. require("core-js/modules/es.promise");
    4. new Promise(function (resolve) {
    5. resolve();
    6. });
    7. var str = '字符串';

    二、babel插件

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

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

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

    下面随便列举一些插件:

    1.@babel/plugin-proposal-class-properties 

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

    1. {
    2. "presets": [
    3. ["@babel/preset-env", {
    4. "useBuiltIns": "usage",
    5. "corejs": 3 //corejs版本
    6. }]
    7. ],
    8. "plugins":[
    9. ["@babel/plugin-proposal-class-properties",{
    10. "loose":true // 设置为true代表不严格的转换
    11. }]
    12. ]
    13. }
    1. class A {
    2. a = 1;
    3. constructor(){
    4. this.b = 3;
    5. }
    6. }

    2.@babel/plugin-proposal-function-bind

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

    1. {
    2. "presets": [
    3. ["@babel/preset-env", {
    4. "useBuiltIns": "usage",
    5. "corejs": 3 //corejs版本
    6. }]
    7. ],
    8. "plugins":[
    9. ["@babel/plugin-proposal-class-properties",{
    10. "loose":true // 设置为true代表不严格的转换
    11. }],
    12. "@babel/plugin-proposal-function-bind"
    13. ]
    14. }
    1. function Print() {
    2. console.log(this.loginId);
    3. }
    4. const obj = {
    5. loginId: "abc"
    6. };
    7. obj::Print(); //相当于:Print.call(obj);

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

     3.@babel/plugin-proposal-optional-chaining

    支持 ?. 写法。

    1. {
    2. "presets": [
    3. ["@babel/preset-env", {
    4. "useBuiltIns": "usage",
    5. "corejs": 3 //corejs版本
    6. }]
    7. ],
    8. "plugins":[
    9. ["@babel/plugin-proposal-class-properties",{
    10. "loose":true // 设置为true代表不严格的转换
    11. }],
    12. "@babel/plugin-proposal-function-bind",
    13. "@babel/plugin-proposal-optional-chaining"
    14. ]
    15. }
    1. const obj = {
    2. foo: {
    3. bar: {
    4. baz: 42,
    5. },
    6. },
    7. };
    8. const baz = obj?.foo?.bar?.baz; // 42
    9. const safe = obj?.qux?.baz; // undefined

    4.@babel/plugin-transform-remove-console

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

    1. {
    2. "presets": [
    3. ["@babel/preset-env", {
    4. "useBuiltIns": "usage",
    5. "corejs": 3 //corejs版本
    6. }]
    7. ],
    8. "plugins":[
    9. ["@babel/plugin-proposal-class-properties",{
    10. "loose":true // 设置为true代表不严格的转换
    11. }],
    12. "@babel/plugin-proposal-function-bind",
    13. "@babel/plugin-proposal-optional-chaining",
    14. "babel-plugin-transform-remove-console" // "babel-plugin-"可省略
    15. ]
    16. }
    1. console.log("foo");
    2. console.error("bar");

    编译后:

    
    

    5.@babel/plugin-transform-runtime

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

    三、webpack中运行

    原理一样,安装 babel-loader

    1. module.exports = {
    2. mode: "development",
    3. devtool: "source-map",
    4. module: {
    5. rules: [
    6. { test: /\.js$/, use: "babel-loader" }
    7. ]
    8. }
    9. }
  • 相关阅读:
    多测师肖sir_高级金牌讲师_ui自动化po框架版本01
    【云笔记篇】Microsoft OneNote笔记分区数据删除方法
    qt 通用ui
    Unit Test 测试采用H2数据库,两种方式导入数据
    with语句和上下文管理器
    国产可视化爬虫助力AI大模型训练:精准爬取汉语词典
    ThreadPoolExecutor 运行源码分析
    Notion 类笔记软件的使用误区和反思
    百度关键词移动查询易语言代码
    络蛋白Casein-PEG-Alkyne炔基/Biotin生物素/NHS
  • 原文地址:https://blog.csdn.net/m0_60189088/article/details/136191039