08-babel

babel命令行使用

  • babel本身可以作为一个独立的工具(和postcss一样),不和webpack等构建工具配置来单独使用

  • 如果我们希望在命令行尝试使用babel,需要安装如下库

    • @babel/core:babel的核心代码,必须安装;
    • @babel/cli:可以让我们在命令行使用babel;
    npm install @babel/cli @babel/core
    
  • 使用babel来处理我们的源代码

    • src:是源文件的目录;
    • –out-dir:指定要输出的文件夹dist;
    npx babel src --out-dir dist
    

插件的使用

  • 比如我们需要转换箭头函数,那么我们就可以使用箭头函数转换相关的插件

    npm install @babel/plugin-transform-arrow-functions -D
    npx babel src --out-dir dist --plugins=@babel/plugin-transform-arrow-functions
    
  • 查看转换后的结果:我们会发现 const 并没有转成 var

    • 这是因为 plugin-transform-arrow-functions,并没有提供这样的功能
    • 我们需要使用 plugin-transform-block-scoping 来完成这样的功能
npm install @babel/plugin-transform-block-scoping -D 
npx babel src --out-dir dist --plugins=@babel/plugin-transform-block-scoping,@babel/plugin-transform-arrow-functions

babel的预设preset

  • 但是如果要转换的内容过多,一个个设置是比较麻烦的,我们可以使用预设(preset)
  • 安装@babel/preset-env预设:npm install @babel/preset-env -D
  • npx babel src --out-dir dist --presets=@babel/preset-env

babel的底层原理

  • babel是如何做到将我们的一段代码(ES6、TypeScript、React)转成另外一段代码(ES5)的呢
  • 从一种源代码(原生语言)转换成另一种源代码(目标语言),这是什么的工作呢?
    • 就是编译器,事实上我们可以将babel看成就是一个编译器。
    • Babel编译器的作用就是将我们的源代码,转换成浏览器可以直接识别的另外一段源代码
  • Babel也拥有编译器的工作流程
    • 解析阶段(Parsing)
    • 转换阶段(Transformation)
    • 生成阶段(Code Generation)

babel-loader

  • 在实际开发中,我们通常会在构建工具中通过配置babel来对其进行使用的,比如在webpack中

  • 那么我们就需要去安装相关的依赖:npm install babel-loader @babel/core

  • 我们可以设置一个规则,在加载js文件时,使用我们的babel:

    module:{
        rules:[
            {
                test:/.m?js$/,
                use:{
                    loader:'babel-loader'        
                } 
            }   
        ]
    }
    

指定使用的插件

module:{
    rules:[
        test:/.m?js$/,
        use:{
            loader:'babel-loader',
            options:{
                plugins:[
                     "@babel/plugin-transform-arrow-functions",     
                     "@babel/plugin-transform-block-scoping"  
                ]            
            }     
        }    
    ]
}

babel-preset

npm install @babel/preset-env

test:/.m?js$/,
use:{
    loader:'babel-loader',
    options:{ 
      presets: [
          ["@babel/preset-env"]   
       ]                          
    }     
}  

设置目标浏览器 targets

  • 默认适配browserslist,配置的targets属性会覆盖browserslist;
  • 但是在开发中,更推荐通过browserslist来配置,因为类似于postcss工具,也会使用browserslist,进行统一浏览器 的适配;
test:/.m?js$/,
use:{
    loader:'babel-loader',
    options:{ 
      presets: [
          ["@babel/preset-env",{
              target:"last 2 version"          
          }]   
       ]                          
    }     
} 

Stage-X的preset

  • Stage 0:strawman(稻草人),任何尚未提交作为正式提案的讨论、想法变更或者补充都被认为是第 0 阶段的稻草人”;
  • Stage 1:proposal(提议),提案已经被正式化,并期望解决此问题,还需要观察与其他提案的相互影响:
  • Staae2:draft(草稿),Staae2的提案应提供规范初稿。草稿。此时,语言的实现者开始观察 runtime 的具体实现是否合理;
  • Staae3:candidate(候补),Staae3提案是建议的候选提案。在这个高级阶段,规范的编辑人员和评审人员必
    须在最终规范上签字。Staae 3 的提案不会有太大的改变,在对外发布之前只是修正一些问题:
  • Stage4:finished(完成),进入 Stage4 的提案将包含在 ECMAScript的下一个修订版中;

babel的配置文件

  • babel配置文件的两种方式
    • babel.config.json(或者.js,.cjs,.mjs)文件;
    • .babelrc.json(或者.babelrc,.js,.cjs,.mjs)文件
  • 它们两个有什么区别呢?目前很多的项目都采用了多包管理的方式(babel本身、element-plus、umi等);
    • .babelrc.json:早期使用较多的配置方式,但是对于配置Monorepos项目是比较麻烦的
    • babel.config.json(babel7):可以直接作用于Monorepos项目的子包,更加推荐

你可能感兴趣的:(webpack,webpack,javascript,前端)