@Dale-Lin
2022-09-18T15:08:47.000000Z
字数 2143
阅读 639
Babel
pn add @babel/core @babel/cli @babel/preset-env -D
babel.config.js 导出一个配置:
module.exports = {presets: [["@babel/preset-env",{targets: {edge: '17',firefox: '60',chrome: '67',safari: '11.1'},useBuiltIns: "usage","corejs": "3.6.5"}]],plugins: [// ...],env: {development: {// development env config// ...},production: {// production env config// ...}}}
安装 @babel/core 和 @babel/cli 后,在命令行直接运行:
./node_modules/.bin/babel src --out-dir lib
上述命令会把 src 目录下的代码用 babel.config.js 的配置进行编译,输出到 lib 目录下。
import babel from '@babel/core'import fs from 'fs'const code = fs.readFileSync('<dir>')babel.transformSync(code, options)
babel 的 transformation 是通过 plugins 来实现的,presets 是一组预设好的 plugins,例如:
pn add @babel/plugin-transform-arrow-functions./node_modules/.bin/babel src --out-dir lib --plugins=@babel/plugin-transform-arrow-functions
结果:
// beforeconst fn = () => 1// aftervar fn = function fn() {return 1}
使用 @babel/preset-env 来支持现代 ES 语法(内置了所有需要的插件),可以通过 babel.config.js 来配置:
module.exports = {presets: [["@babel/preset-env",{targets: {edge: "17",firefox: "60",chrome: "67",safari: "11.1"}}]]}
通过设置 targets 可以指定代码运行的浏览器最低版本环境,只有在这些版本下不支持的语法 babel 才会进行 polyfill。
记录 7.4.0 以上 babel 的配置
使用 @babel/preset-env 的 useBuiltIns 和 corejs 字段配置:
module.exports = {presets: [["@babel/preset-env",{targets: {edge: "17",firefox: "60",chrome: "67",safari: "11.1"}},useBuiltIns: "usage",corejs: { version: "3.8" }]]}
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:
import 'core-js/stable'
useBuiltIns: "entry" 会把所有 import "core-js/stable" 和 require('core-js') 替换成当前环境需要的单独特性导入,例如:
// beforeimport "core-js"// after(different based on environment)import "core-js/modules/es.string.pad-start"import "core-js/modules/es.string.pad-end"
useBuiltIns: "usage" 会对每个文件需要用到的 polyfill 单独引入:
// before a.jsvar a = new Promise()// before b.jsvar b = new Map()// after a.js(if environment supports it)var a = new Promise()// after a.js(if environment does not support it)import "core-js/modules/es.promise"var a = new Promise()// after b.js(if environment does not support it)import "core-js/modules/es.map"var b = new Map()