首页 > 其他分享 >Babel基础知识

Babel基础知识

时间:2023-10-10 11:33:06浏览次数:36  
标签:插件 plugin -- Babel js babel 基础知识

Babel中文官网

Babel 入门教程-阮一峰

Babel博客教程-姜瑞涛

Bilibili--系列Babel视频学习教学

1. 介绍

1.1 简介

Babel 是一个 JavaScript 编译器。

Babel 是一个工具链,主要用于将采用 ECMAScript 2015+ 语法编写的代码转换为向后兼容的 JavaScript 语法,以便能够运行在当前和旧版本的浏览器或其他环境中。

Babel是一个工具集,主要用于将ES6版本的JavaScript代码转为ES5等向后兼容的JS代码,从而可以运行在低版本浏览器或其它环境中

比如:我们在代码中使用了ES6箭头函数

// 编译前
var fn = (num) => num + 2;

但如果是运行在一些低版本的浏览器里面,就会报错;经过Babel编译之后的代码就可以运行在IE11以及更低版本的浏览器中了

// 编译后
var fn = function fn(num) {
  return num + 2;
}

Babel就是做了这样的编译转换工作,来让我们不用考虑浏览器的兼容性问题,只要专心于代码的编写工作

1.2 历史

babel5及之前是一个包含CLI工具+编译器+转换器的集合工具包;babel6之后进行了拆分,集合包被分成多个包

  • babel-cli,Babel命令行转码工具,如果我们使用命令行进行Babel转码就需要安装它
  • babel-core,包括了Node有关的API和require钩子
  • babel-polyfill,可以建立一个完整的ES2015环境

babel6默认情况下不携带任何转换器,需要自行安装所需的插件和转换器,通过babel-xxx来安装对应的工具包。

而Babel7用了npm的private scope,把所有的包都挂载@babel下,通过@babel/xxx来安装,不用在node_modules下看到一堆的babel-xxx包

1.3 @Babel/coreBabel/cli

1.3.1 @Babel/core

@babel/core我们在很多地方都看到,它是Babel进行转码的核心依赖包,我们常用的babel-cli和babel-node都依赖于它。

Babel的运行方式总共可以分为三个阶段:解析(parsing)、转换(transforming)和生成(generating);负责解析阶段的插件是@babel/parser,其作用就是将源码解析成AST;而负责生成阶段的插件是@babel/generator,其作用就是将转好好的AST重新生成代码。

而@babel/core本身不具备转换处理的功能,它把转换的功能拆分到一个个插件(plugins)中;因此当我们不添加任何插件的时候,输入输出代码是相同的

1.3.2 @babel/cli

@babel/cli是Babel自带了一个内置的CLI命令行工具,我们就可以通过命令行来编译文件;它有两种调用方式,可以通过全局安装或者本地安装调用,选用一种即可,推荐在项目本地安装

// 全局安装调用
npm install --g @babel/cli
babel index.js -o output.js

// 本地安装调用
npm install --save-dev @babel/cli
npx babel index.js -o output.js

可以使用以下命令参
image

1.3.3 babel-cli基本用法

# 转码结果输出到标准输出
$ babel example.js

# 转码结果写入一个文件
# --out-file 或 -o 参数指定输出文件
$ babel example.js --out-file compiled.js
# 或者
$ babel example.js -o compiled.js

# 整个目录转码
# --out-dir 或 -d 参数指定输出目录
$ babel src --out-dir lib
# 或者
$ babel src -d lib

# -s 参数生成source map文件
$ babel src -d lib -s

1.4 配置文件

虽然可以在命令行中配置各种插件(plugins)或者预设,但是这样就不利于管理和维护,因此Babel推荐通过配置文件的方式来进行管理。

Babel的配置文件主要有.babelrc.babelrc.jsbabel.config.jspackage.json,他们的配置选项都是相同的,作用也是一样,主要区别在于格式语法的不同,因此我们在项目中只需要选择其中一种即可

1.4.1 .babelrc配置:

可以在配置文件中加入一些插件或者预设,来扩展@babel/core的转换功能;只需要将对应的插件或预设名字加入数组即可

比如我们常用的ES6箭头函数,就是通过@babel/plugin-transform-arrow-functions这个插件来转换

{
  "presets": [...],
  "plugins": ["@babel/plugin-transform-arrow-functions"]
}

如果需要对插件和预设设置参数,即是如下的格式

//.babelrc
{
  "plugins": [
    [
      "@babel/plugin-transform-arrow-functions", 
      { "spec": true }
    ]
  ]
}

spec属性

这个属性主要是给其他插件传递参数(比如@babel/plugin-transform-arrow-functions),默认是false,设为true后,箭头函数会有以下改变:

  1. 将箭头函数生成的函数用.bind(this)包裹一下,以便在函数内部继续使用this,而不是重命名this。
  2. 加一个检查防止函数被实例化
  3. 给箭头函数加一个名字

1.4.2 .babelrc.jsbabel.config.js的配置

同样都是JS语法,通过module.exports的方式输出配置

module.exports = function (api) {
  api.cache(true);
  const presets = [ ... ];
  const plugins = [ ... ];
  if (process.env["ENV"] === "prod") {
    plugins.push(...);
  }
  return {
    presets,
    plugins
  };
}

1.4.3 package.json 配置

增加babel的属性即可

{
  "name": "demo",
  "version": "1.0.0",
  "babel": {
    "presets": [ ... ],
    "plugins": [ ... ],
  }
}

1.4.4 babel.config.json 配置(Babel7推荐)

{
  "presets": [
    [
      "@babel/preset-env",
      {
        "targets": {
          "ie": "10", // 最低兼容ie10浏览器
          "edge": "11",
          "firefox": "60",
          "chrome": "67",
          "safari": "11.1"
        },
        "useBuiltIns": "usage" // 按需加载
      }
    ]
  ],
  "plugins": [
    "@babel/plugin-transform-arrow-functions",
    "@babel/plugin-transform-block-scoping",
    "@babel/plugin-transform-object-assign"
  ]
}

targets属性

targets主要是用来描述我们在项目中想要支持的目标浏览器环境,它可以是Browserslist格式的查询

{
  "targets": "> 0.25%, not dead"
}

或者可以是一个对象,用来描述支持的最低版本的浏览器:

{
  "targets": {
    "chrome": "58",
    "ie": "11"
  }
}

其他的浏览器版本还可以是:operaedgefirefoxsafariiosandroidnodeelectron

1.5 Babel插件和预设

Babel的插件大致可以分为语法插件转换插件

  • 语法插件:作用于解析阶段,使得babel能够解析更多的语法,官方的语法插件以babel-plugin-syntax开头
  • 转换插件:在转换这一步把源码转换并输出,官方的转换插件以babel-plugin-transform(正式)或 babel-plugin-proposal(提案)开头

2. 使用

2.1 方式一:引入第三方js(一般不推荐使用)

<!--1  引入browser.min.js文件 -->
<!--注意:browser.min.js  IE9以下本身就不支持-->
 <script type="text/javascript" src="browser.min.js"></script>

<!--2.  设置script类型: type="text/babel" -->
<script type="text/babel">
  let a = [1, 2, 3];
  console.log(a);

  const show = name => console.log(name);
  show('你好呀');
</script>

2.2 方法二:Babel命令编译

2.2.1 初始化项目

自动生成一个 package.json

npm init -y

2.2.2 安装babel项目依赖

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

以下项目包是根据根据需要安装使用

可以兼容更低版本的浏览器,比如IE等更低
npm install --save @babel/polyfill 

单独安装箭头函数转换的插件(可以安装、也可以不安装,如果不安装,就可以使用babel的预设项)
npm install --save-dev @babel/plugin-transform-arrow-functions

2.2.3 babel配置文件

新建一个 babel配置文件:babel.config.json,主要是进行babel预设的配置

{
  "presets": [
    [
      "@babel/env",
      {
        "targets": {
          "ie":"10", //这个是自己添加的,最好是加上
          "edge": "17",
          "firefox": "60",
          "chrome": "67",
          "safari": "11.1"
        },
        "useBuiltIns": "usage"  // 按需加载
      }
    ]
  ]
  "plugins": [
    "@babel/plugin-transform-member-expression-literals",
    "@babel/plugin-transform-property-literals"
  ]
}

2.2.4 创建npm命令

在package.json中创建快捷执行命令

  "scripts": {
      "dev": "babel src --out-dir src --minified --ignore 'src/*.min.js,src/**/*.min.js,src/**/**/*.min.js' --out-file-extension .min.js"
        
        // 这个是执行箭头函数转换的命令
        "build-arrow": "babel src --out-dir lib --plugins=@babel/plugin-transform-arrow-functions"
    },

--minified:压缩混淆

--ignore:忽略某些文件

--out-file-extension .min.js :设置文件扩展名

更多配置参考:https://www.babeljs.cn/docs/babel-cli#安装

2.2.5 命令执行

npm run build

在phpstrom中的配置

$FilePathRelativeToProjectRoot$ --out-dir $FileDirRelativeToProjectRoot$ --minified --presets @babel/env --ignore "template/wap/skin/**/*.min.js,template/wap/skin/**/**/*.min.js" --out-file-extension .min.js"

标签:插件,plugin,--,Babel,js,babel,基础知识
From: https://www.cnblogs.com/songxia/p/17754243.html

相关文章

  • 解题过程中的基础知识积累
    1、求任意进制:vector<int>vec;while(1){vec.push_back(m%n);//短除法求任意进制。if(m/n==0) break;m/=n;}2、枚举法求最大公约数://求sum与a的最大公约数。for(inti=a;i>=1;--i)//从最大数往前循环。{ if(sum%i==0&&a%i==0)//枚举......
  • 模块化基础知识
    1简介1.1模块将一个复杂的程序依据一定的规则(规范)封装成几个块(文件),并进行组合在一起。块的内部数据/实现是私有的,只是向外暴露一些接口(方法)与外部其它模块通信一个模块的组成:私有的数据:内部的变量私有的行为(操作数据):内部的函数向外暴露n个行为1.2模块......
  • js1之基础知识
    1简介1.1计算机语言计算机语言指用于人与计算机之间通讯的语言,它是人与计算机之间传递信息的媒介。总的来说,可以分成机器语言,汇编语言和高级语言三大类。实际上计算机最终所执行的都是机器语言,它是由“0”和“1”组成的二进制数,二进制是计算机语言的基础。0=000000001=00......
  • MongoDB基础知识
    1.简介MongoDB官方文档菜鸟教程1、NoSQL(NotOnlySQL),不仅仅是SQL,主要是指非关系型数据库,是对不同与传统的关系型数据库的数据管理系统的统称2、NoSQL用于超大规模数据的存储,这些类型的数据存储吧需要固定的模式,无需多余的操作就可以横向扩展1.2NoSQL和RDBMS的区分......
  • 01webpack基础知识
    1概述1.1什么是webpack1、webpack是一种前端资源构建工具,一个静态模块打包器(modulebundler)。在webpack看来,前端的所有资源文件(js/json/css/img/less/...)都会作为模块处理。它将根据模块的依赖关系进行静态分析,打包生成对应的静态资源(bundle)2、webpack是一个前......
  • 计算机基础知识
    计算机基础知识计算机简介​ 计算机俗称电脑,是第二次世界战争时,美国国防部利用它来进行弹道计算。第一台通用计算机叫做:ENIAC。当时计算机是一个庞然大物,用了18000个电子管,占地170平方米,重达30吨,耗电功率约150千瓦,每秒钟可进行5000次运算。​ 随着时间和科技的不断进步,直到发展......
  • Kubeflow基础知识
    kubeflow基础知识kubeflow简介kubeflow是谷歌开源的MLOps开源平台,其中包含的不同组件代表了机器学习生命周期的不同阶段。下图是kubeflow组织ML工作流程:kubeflow组件介绍1.kubeflowPipelinespipelines是对机器学习工作流的一种描述,当运行一个pipeline时系统会启动一......
  • 【一】基础知识
    【小结】1.汇编指令是机器语言的助记符,同机器指令一一对应。2.每一种CPU都有自己的汇编指令集。3.CPU可以直接使用的信息在存储器中存放4.在存储器中指令和数据没有任何区别,都是二进制信息。5.存储单元从零开始顺序编号。6.一个存储单元可以存储8个bit,即8位二进制数。7.1B......
  • java基础知识总结,javaweb参考资料大全
    Java基础知识总结写代码:1,明确需求。我要做什么?2,分析思路。我要怎么做?1,2,3。3,确定步骤。每一个思路部分用到哪些语句,方法,和对象。4,代码实现。用具体的java语言代码把思路体现出来。 学习新技术的四点:1,该技术是什么?2,该技术有什么特点(使用注意):3,该技术怎么使用。demo4,该技术什么时......
  • 这些视频监控系统/安防视频监控平台EasyCVR基础知识,你都掌握了吗?
    安防视频监控平台EasyCVR是一个具有强大拓展性、灵活的视频能力和轻便部署的平台。它支持多种主流标准协议,包括国标GB28181、RTSP/Onvif、RTMP等,还可以支持厂家的私有协议和SDK接入,例如海康Ehome、海大宇等设备的SDK。该平台不仅拥有传统安防视频监控的功能,还具备接入AI智能分析的......