官⽅⽹站:https://babeljs.io/
中⽂⽹站:https://www.babeljs.cn/

  • Babel是JavaScript编译器,能将ES6代码转换成ES5代码,让我们开发过程中放⼼使⽤JS新特性⽽不⽤担

⼼兼容性问题。并且还可以通过插件机制根据需求灵活的扩展。

  • Babel 在执⾏编译的过程中,会从项⽬根⽬录下的.babelrc JSON⽂件中读取配置。没有该⽂件会从 loader的 options 地⽅读取配置。

    1. npm i babel-loader @babel/core @babel/preset-env
  • babel-loader是 webpack 与 babel的通信桥梁,不会做把es6转成es5的⼯作,这部分⼯作需要⽤到@babel/preset-env 来做

  • @babel/preset-env ⾥包含了es,6,7,8转es5的转换

    1. module: {
    2. test: /\.js$/,
    3. exclude: /node_modules/,
    4. use: {
    5. loader: "babel-loader",
    6. options: {
    7. presets: ["@babel/preset-env"],
    8. },
    9. },
    10. },
  • @babel/polyfill

默认的Babel只⽀持 let 等⼀些基础的特性转换,Promise 等⼀些还有转换过来,这时候需要借@babel/polyfifill,把 ES 的新特性都装进来,来弥补低版本浏览器中缺失的特性。

  1. npm install --save @babel/polyfill
  1. //index.js 顶部
  2. import "@babel/polyfill";
  3. //以全局变量的⽅式注⼊进来的。windows.Promise,它会造成全局对象的污染。
  • 按需加载,减少冗余

使用 polyfill 会发现打包的体积⼤了很多,这是因为polyfill默认会把所有特性注⼊进来,假如我想我⽤到的es6+,实现按需加载

  1. //.babelrc
  2. {
  3. presets: [
  4. [
  5. "@babel/preset-env",
  6. {
  7. targets: {
  8. edge: "17",
  9. firefox: "60",
  10. chrome: "67",
  11. safari: "11.1"
  12. },
  13. corejs: 2, //新版本需要指定核⼼库版本
  14. useBuiltIns: "usage" //按需注⼊
  15. }
  16. ]
  17. ]
  18. }
  19. //webpack.config.js
  20. {
  21. test: /\.js$/,
  22. exclude: /node_modules/,
  23. loader: "babel-loader"
  24. }

useBuiltIns选项是 babel 7 的新功能,这个选项告诉 babel 如何配置@babel/polyfill 。 它有三个参数可以使⽤:

  • entry: 需要在 webpack 的⼊⼝⽂件⾥ import “@babel/polyfill” ⼀次。 babel 会根据你的使⽤情况导⼊垫⽚,没有使⽤的功能不会被导⼊相应的垫⽚。
  • usage: 不需要 import ,全⾃动检测,但是要安装 @babel/polyfill 。(试验阶段
  • false: 如果你 import”@babel/polyfill” ,它不会排除掉没有使⽤的垫⽚,程序体积会庞⼤。(不推荐)

请注意: usage 的⾏为类似 babel-transform-runtime,不会造成全局污染,因此也会不会对类似Array.prototype.includes() 进⾏polyfill。

  • @babel/plugin-transform-runtime

当我们开发的是组件库,⼯具库这些场景的时候,polyfill 就不适合了,因为 polyfill 是注⼊到全局变量,window下的,会污染全局环境,所以推荐闭包⽅式@babel/plugin-transform-runtime,它不会造成全局污染。

  1. npm install --save-dev @babel/plugin-transform-runtime
  2. npm install --save @babel/runtime
  1. options: {
  2. presets: [
  3. [
  4. "@babel/preset-env",
  5. {
  6. targets: {
  7. edge: "17",
  8. firefox: "60",
  9. chrome: "67",
  10. safari: "11.1"
  11. },
  12. useBuiltIns: "usage",
  13. corejs: 2
  14. }
  15. ]
  16. ],
  17. "plugins": [
  18. [
  19. "@babel/plugin-transform-runtime",
  20. {
  21. "absoluteRuntime": false,
  22. "corejs": false,
  23. "helpers": true,
  24. "regenerator": true,
  25. "useESModules": false
  26. }
  27. ]
  28. ]
  29. }

Vue CLI

Vue CLI 使用了 Babel 7 中的新配置格式 babel.config.js。和 .babelrc 或 package.json 中的 babel 字段不同,这个配置文件不会使用基于文件位置的方案,而是会一致地运用到项目根目录以下的所有文件,包括 node_modules 内部的依赖。我们推荐在 Vue CLI 项目中始终使用 babel.config.js 取代其它格式。

  1. // babel.config.js
  2. module.exports = {
  3. presets: ['@vue/cli-plugin-babel/preset']
  4. };

所有的 Vue CLI 应用都使用 @vue/babel-preset-app,它包含了 babel-preset-env、JSX 支持以及为最小化包体积优化过的配置

一个默认的 Vue CLI 项目会使用 @vue/babel-preset-app,它通过 @babel/preset-env 和 browserslist 配置来决定项目需要的 polyfill。

默认情况下,它会把 useBuiltIns: ‘usage’ 传递给 @babel/preset-env,这样它会根据源代码中出现的语言特性自动检测需要的 polyfill。这确保了最终包里 polyfill 数量的最小化。然而,这也意味着如果其中一个依赖需要特殊的 polyfill,默认情况下 Babel 无法将其检测出来。

如果有依赖需要 polyfill,你有几种选择:

  1. 默认情况下,babel-loader 排除 node_modules 依赖项中的文件。如果您希望显式转换依赖项模块,则需要将其添加到以下 transpileDependencies 选项中 vue.config.js:

@vue/cli-plugin-babel/preset

  1. // 默认babel-loader会忽略node_modules中的文件
  2. // 但是dolphin-plugin-tools用了es6的语法, 配置对其显示转译
  3. // 配合babel sourceType: 'unambiguous'来使用 https://github.com/babel/babel/issues/9187,
  4. transpileDependencies: [
  5. 'dolphin-plugin-tools',
  6. /@hui-pro/
  7. ],
  1. 如果该依赖交付 ES5 代码,但使用了 ES6+ 特性且没有显式地列出需要的 polyfill (例如 Vuetify):请使用 useBuiltIns: ‘entry’ 然后在入口文件添加 import ‘core-js/stable’; import ‘regenerator-runtime/runtime’;。这会根据 browserslist 目标导入所有 polyfill,这样你就不用再担心依赖的 polyfill 问题了,但是因为包含了一些没有用到的 polyfill 所以最终的包大小可能会增加。

https://cli.vuejs.org/zh/guide/browser-compatibility.html#browserslist

element-ui按需引入

https://blog.csdn.net/weixin_39707612/article/details/110252623