日常业务可以只用@babel/preset-env(提供语法转译,也提供全局的原型链的polyfill)
useBuiltIns:false,即关闭polyfill
库模式使用@babel/plugin-transform-runtime (提供局部、按需加载的polyfill)
参考文章
已经在 @babel/preset-env 中配置了polyfill,那么你连 @babel/plugin-transform-runtime 都是不必要的(他们二者都可以提供ES新API的垫片,在这一项功能上是重复的。@babel/preset-env 除了提供 polyfill 垫片,还提供 ES 新语法的转译,这一点 @babel/plugin-transform-runtime 做不了;@babel/preset-env 提供的polyfill垫片会污染原型链,这个既是缺点,也是优点,缺点是在开发第三方 JS 库时不能这么干,会影响使用方的代码,优点是在开发自己的web应用时,一劳永逸,而 @babel/plugin-transform-runtime 不会污染原型链,且按需加载;@babel/preset-env 在提供 polyfill 垫片时,是既可以按需也可以不按需,取决于使用者怎么配置 useBuiltIns 参数及是否 import 了垫片),简单推荐一下:@babel/preset-env 可以搞定你的所有事情,配置 useBuiltIns 并按规则导入 polyfill,不必使用 @babel/plugin-transform-runtime;如果是开发 js 库,才用 @babel/plugin-transform-runtime,同时使用 @babel/preset-env 去转译语法,但不用它的 polyfill(如这篇文章里推荐的那样去配置即可)
import { defineConfig } from 'vite'
import vue2 from '@vitejs/plugin-vue2'
import { getBabelOutputPlugin } from '@rollup/plugin-babel'
// https://vitejs.dev/config/
export default defineConfig(() => ({
resolve: {
extensions: ['.vue', '.js', '.jsx', '.ts', '.tsx', '.cjs', '.mjs']
},
plugins: [
vue2()
],
build: {
rollupOptions: {
external: [
// 要将@babel/runtime-core的依赖包排除掉
// 并将@babel/runtime-corejs3声明到dependencies中
/@babel\/runtime-core/
],
plugins: [
getBabelOutputPlugin({
babelrc: false,
configFile: false, // 不加载外部的 babel 配置
presets: [
[
'@babel/preset-env',
{
targets: { browsers: ['last 2 versions', 'ie >= 11'] },
// 用了@babel/plugin-transform-runtime
// 就不要用preset-env来处理polyfill
useBuiltIns: false, // 此选项配置 @babel/preset-env 如何处理 polyfill
// 不用转
modules: false // 启用将 ES 模块语法转换为另一种模块类型
}
]
],
plugins: [
[
'@babel/plugin-transform-runtime',
{
corejs: {
version: 3,
proposals: true // 是否加入polyfill提案
},
helpers: true, // 切换内联 Babel 助手(classCallCheck、extends 等)是否替换为对 moduleName 的调用。
// 切换生成器函数是否转换为使用不污染全局作用域的再生器运行时。
regenerator: true // defaults to true
}
]
]
})
]
}
}
}))
{
"dependencies": {
"@babel/runtime-corejs3": "^7.24.0"
},
"devDependencies": {
"@babel/plugin-transform-runtime": "^7.24.0",
"@babel/preset-env": "^7.24.0",
"@rollup/plugin-babel": "^6.0.4"
}
}
日常业务可以只用@babel/preset-env(提供语法转译,也提供全局的原型链的polyfill)
useBuiltIns:false,即关闭polyfill
库模式使用@babel/plugin-transform-runtime (提供局部、按需加载的polyfill)
参考文章
{ "dependencies": { "@babel/runtime-corejs3": "^7.24.0" }, "devDependencies": { "@babel/plugin-transform-runtime": "^7.24.0", "@babel/preset-env": "^7.24.0", "@rollup/plugin-babel": "^6.0.4" } }