Skip to content

在vite或rollup中针对库模式的打包配置 #35

@endday

Description

@endday

日常业务可以只用@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"
  }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions