Skip to content

[RFC] Nested Lib Config 嵌套式构建库配置 #682

@XGHeaven

Description

@XGHeaven

现状

目前 @ice/pkg 中,配置主要通过 transformbundle 两个大类的构建来实现,又通过其内部的 formats 来区分不同的构建目标。
但随着社区的发展,和构建目标越来越多样,已经难以满足目前的构建需求。

  • 无法方便的为不同的 formats 定制不同的输出目录和插件体系
  • formats 绑定死了 module 和 target 形式,开发者无法灵活的独立配置
  • 无法方便的同时构建多个不同类型产物和目标,例如 mf、web、node

因此这里特地提出一种全新的构建体系配置,能够做到更加灵活的和简便的构建配置体系。

非常感谢 rslib,参考了部分思路

配置

为了不引入 Break Change,在新的配置体系下,所有的配置将放到新的 pkgs 配置目录下。

export default defineConfig({
  pkgs: [] // new keys
  transform: {}, // 依旧保持兼容可以继续使用,但与 pkgs 的配置完全独立
  bundle: {},
  define: {}, // 原先的一些配置依旧可以用
})

配置类型

预设字符串

例如可以直接通过字符串配置和原先类似的预设方案:

  • 直接使用格式,esm/cjs,等价于在 transform 中直接配置 formats
  • 使用 ! 开头等价于在 bundle 中配置 formats,!esm/!cjs/!umd
export default defineConfig({
  pkgs: ['esm', 'es2017', '!umd']
})

对象配置

可以传入一个对象进行配置,在传入对象的情况下,需要单独配置模块类型和语法目标。

export default defineConfig({
  pkgs: [{
    id: 'xxx', // 唯一标识某个构建,方便后续选择操作
    module: 'esm',
    target: '2017',
    bundle: false, // 默认就是 transform
    outDir: '/xxx', // 单独配置输出目录
    plugins: [], // 配置独立的插件,仅针对当前生效
  }, {
    module: 'umd',
    target: 'es5',
    bundle: true, // 启动 bundle 构建
    extends: ['xxx'] // 可以选择从另一个配置中继承
  }, {
    preset: '!umd', // 基于默认配置进行修改
  }]
})

可以通过嵌套 pkgs 来实现继承和扩展,只有没有配置 pkgs 的配置会作为最终的构建目标,如果配置了 pkgs,则作为普通的配置项目用以继承。

继承顺序

配置按照如下顺序进行继承,优先级由高到低

  • 当前 pkg 配置
  • 继承的 pkg 配置
  • 根节点配置,(包括 transform 和 bundle 的配置)
  • 预设的配置(preset 字段),如果有

transform/bundle 的默认逻辑修改

在旧版本,transform 的 formats 默认有值,但是在新版本中,当配置了 pkgs 之后,transform 和 bundle 的 formats 会自动忽略,并且不在有默认值。避免和 pkgs 产生冲突

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions