[关闭]
@Dale-Lin 2022-09-18T23:08:47.000000Z 字数 2143 阅读 300

Babel 基础用法

Babel


安装

  1. pn add @babel/core @babel/cli @babel/preset-env -D

配置

babel.config.js 导出一个配置:

  1. module.exports = {
  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": "3.6.5"
  14. }
  15. ]
  16. ],
  17. plugins: [
  18. // ...
  19. ],
  20. env: {
  21. development: {
  22. // development env config
  23. // ...
  24. },
  25. production: {
  26. // production env config
  27. // ...
  28. }
  29. }
  30. }

编译

CLI

安装 @babel/core@babel/cli 后,在命令行直接运行:

  1. ./node_modules/.bin/babel src --out-dir lib

上述命令会把 src 目录下的代码用 babel.config.js 的配置进行编译,输出到 lib 目录下。

node

  1. import babel from '@babel/core'
  2. import fs from 'fs'
  3. const code = fs.readFileSync('<dir>')
  4. babel.transformSync(code, options)

Plugins & Presets

babel 的 transformation 是通过 plugins 来实现的,presets 是一组预设好的 plugins,例如:

  1. pn add @babel/plugin-transform-arrow-functions
  2. ./node_modules/.bin/babel src --out-dir lib --plugins=@babel/plugin-transform-arrow-functions

结果:

  1. // before
  2. const fn = () => 1
  3. // after
  4. var fn = function fn() {
  5. return 1
  6. }

使用 @babel/preset-env 来支持现代 ES 语法(内置了所有需要的插件),可以通过 babel.config.js 来配置:

  1. module.exports = {
  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. }
  13. ]
  14. ]
  15. }

通过设置 targets 可以指定代码运行的浏览器最低版本环境,只有在这些版本下不支持的语法 babel 才会进行 polyfill。

Polyfill

记录 7.4.0 以上 babel 的配置

使用 @babel/preset-envuseBuiltInscorejs 字段配置:

  1. module.exports = {
  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. },
  13. useBuiltIns: "usage",
  14. corejs: { version: "3.8" }
  15. ]
  16. ]
  17. }

useBuiltIns 的值为 "usage" 时会检查代码中使用到的特性和对应的 targets 环境,只把使用到的需要 polyfill 的特性进行注入。

corejs 字段只有在 useBuiltIns: "usage"useBuiltIns: "entry" 时有作用,会保证 @babel/preset-env 注入指定的 core-js 版本的 polyfill;默认只注入 stable 的特性,如果需要注入 proposals 的特性,可以这样 corejs: { version: "3.8", proposals:true }

你也可以在代码里手动引入 core-js

  1. import 'core-js/stable'

useBuiltIns: "entry" 会把所有 import "core-js/stable"require('core-js') 替换成当前环境需要的单独特性导入,例如:

  1. // before
  2. import "core-js"
  3. // after(different based on environment)
  4. import "core-js/modules/es.string.pad-start"
  5. import "core-js/modules/es.string.pad-end"

useBuiltIns: "usage" 会对每个文件需要用到的 polyfill 单独引入:

  1. // before a.js
  2. var a = new Promise()
  3. // before b.js
  4. var b = new Map()
  5. // after a.js(if environment supports it)
  6. var a = new Promise()
  7. // after a.js(if environment does not support it)
  8. import "core-js/modules/es.promise"
  9. var a = new Promise()
  10. // after b.js(if environment does not support it)
  11. import "core-js/modules/es.map"
  12. var b = new Map()
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注