配置

本文档详细介绍了 LECP 构建工具的所有配置选项。

format

配置构建输出格式,支持 ESM、CJS 和 UMD 三种格式。

类型: (BundlessFormat | BundleFormat)[]

默认值: []

import { defineConfig } from '@shined/lecp';

export default defineConfig({
  format: [
    { type: "esm" },
    { type: "umd" },
  ],
});

format.type

不同格式在各模式下的支持情况:

格式Bundless 模式Bundle 模式
ESM✅ (默认)
CJS✅ (默认)
UMD✅ (默认)

BundlessFormat

interface BundlessFormat {
  mode?: "bundless";
  builder?: "swc";
  type: "esm" | "cjs";

  /**
   * 入口文件夹
   * @default "./src"
   */
  entry?: string;

  /**
   * 输出目录
   * @default 根据 type 决定:
   * - esm -> "./es"
   * - cjs -> "./lib"
   */
  outDir?: string;
}

BundleFormat

interface BundleFormat {
  mode?: "bundle";
  builder?: "rspack";
  type: "esm" | "cjs" | "umd";

  /**
   * 入口文件
   * @default "./src/index.{ts,tsx,mts,cts,js,jsx,mjs,cjs}"
   */
  entry?: string;

  /**
   * 输出目录
   * @default 根据 type 决定:
   * - esm -> "./es"
   * - cjs -> "./lib"
   * - umd -> "./umd"
   */
  outDir?: string;

  /**
   * 包名称
   * @description UMD 模式下作为全局变量名(对应 output.library.name)
   * - 显式传入时直接使用,不做转换
   * - 未传入时自动从 package.json 的 name 字段生成,如 react-dom -> ReactDOM
   */
  name?: string;

  /**
   * 输出文件名称
   * @default "index"
   */
  fileName?: string;

 /**
	 * 打包排除的 package
	 * @default  esm,cjs: 排除 dependencies, peerDependencies, optionalDependencies,  umd: undefined
	 * umd 无法自动获取 root, 只能手动设置。否则可以排除 peerDependencies
	 */
	externals?: RspackConfig["externals"];

  /**
   * 需要额外编译的 node_modules 包
   * @default []
   * @description 当第三方包的产物不满足当前编译目标时使用
   * 默认不编译 node_modules 下的文件
   * @example
   *    ["immer"]: 编译 "immer"
	 *    [/node_modules[\\/]immer[\\/]/]: 编译 "immer"
	 *    [/[\\/]node_modules[\\/]/]: 编译 node_modules 下的所有包
   */
  extraCompile?: (string | RegExp)[];

  /** 自定义 Rspack 配置 */
  modifyRspackConfig?: (config: RspackConfig) => RspackConfig;

  /** 通过 rspack-chain 修改配置 */
  modifyRspackChain?: (chain: RspackChain) => void;
}

targets

配置构建产物的兼容目标,影响 JavaScript 和 CSS 的编译输出。

类型: Record<string, string | number>

默认值:

  • 仅 CJS 编译场景:{node: "20.11.0"}
  • 其他情况:{chrome: 55}

示例:

import { defineConfig } from '@shined/lecp';

export default defineConfig({
  targets: {
    node: "22.12.0",
    // or
    chrome: 87
    // or
    es2015: "",
  },
});

:::tips 注意事项 lecp 只做语法降级,不会自动引入 polyfill。通常业务系统会自动引入 polyfill。

如果希望进一步减少体积,可以参考 externalHelpers 选项。

:::

注意事项

UMD 模式下同时设置 targets.chrometargets.node 会导致构建失败,因为 output.chunkFormat 无法同时满足两个目标的要求。

解决方案:

  • 如果确认没有代码分割,可以强制设置 output.chunkFormat
  • 推荐做法: UMD 仅用于 Web 平台,作为 CDN 方式引入

dts

控制 TypeScript 声明文件 (.d.ts) 的生成。

类型: boolean | DtsOptions

默认值: true (等同于 { mode: "bundless", builder: "ts" })

interface DtsOptions {
  /**
   * 生成模式
   * - "bundle": 使用 @microsoft/api-extractor 生成单个声明文件
   * - "bundless": 保持源文件结构,生成多个声明文件
   * @default "bundless"
   */
  mode: "bundless" | "bundle";

  /**
   * 构建引擎
   * - "ts": TypeScript 编译器(功能完整,支持 d.ts.map)
   * - "swc": SWC 编译器(速度更快,但不支持 d.ts.map)
   * @default "ts"
   * @description 仅在 bundless + isolatedDeclarations 模式下可选择 swc
   */
  builder?: "ts" | "swc";
}

示例:

import { defineConfig } from '@shined/lecp';

export default defineConfig({
  // 关闭声明文件生成
  dts: false,

  // 或者自定义配置
  dts: {
    mode: "bundle",
    builder: "ts"
  }
});

sourcemap

类型: boolean

默认值: true

是否生成 sourcemap 文件。sourcemap 可以很好地帮助调试代码。

alias

类型: Record<string, string>

默认值: tsconfig.json 的 paths 字段获取

设置路径别名映射

支持设置相对路径,相对路径基于项目根目录。

示例:

import { defineConfig } from '@shined/lecp';

export default defineConfig({
  alias: {
    '@': './src',
    '@@': './compiled'
  },
});

define

用于编译时替换全局变量和表达式。

类型: Record<string, string>

默认值: {}

参考 Rspack DefinePlugin 文档

示例:

import { defineConfig } from '@shined/lecp';

export default defineConfig({
  define: {
    'process.env.NODE_ENV': '"production"',
    __VERSION__: '"1.0.0"',
    __DEV__: 'false',
    'typeof window': '"object"'
  },
});

shims

提供跨模块系统的变量兼容性支持。

  • ESM 产物:可使用 CJS 变量 __dirname__filenamerequire
  • CJS 产物:可使用 ESM 变量 import.meta.urlimport.meta.dirnameimport.meta.filename

类型: boolean | { legacy?: boolean }

默认值: false

  • shims: true:启用默认配置
  • shims: { legacy: true }:启用传统兼容模式
配置Node.js 版本支持实现方式
legacy: false (默认)20.11+使用 import.meta.{dirname, filename}
legacy: true10.12+使用 fileURLToPath,createRequire

示例:

import { defineConfig } from '@shined/lecp';

export default defineConfig({
  shims: {
    legacy: true  // 支持 比 20.11更低版本的 Node.js
  }
});

externalHelpers

类型: boolean

默认值: false

SWC 编译时默认通过内联方式引入 helper 函数。开启此功能后,将从 @swc/helpers 统一引入,减少打包体积。

⚠️ 注意: 需要在 package.jsonpeerDependencies 中添加 @swc/helpers

参考文档:SWC External Helpers

react

React 相关的编译配置。

react.runtime

类型: "classic" | "automatic" | "preserve"

默认值: "automatic"

会自动读取 tsconfig.json 中的 jsx 配置,优先级更高

JSX 转换模式:

  • "automatic":使用 react/jsx-runtime(React 17+ 推荐)
  • "classic":使用 React.createElement(传统方式)
  • "preserve":不对 JSX 语法进行任何转换

示例:

import { defineConfig } from '@shined/lecp';

export default defineConfig({
  react: {
    runtime: "classic"
  }
});
选择建议

推荐使用 "automatic" 模式,无需在组件中导入 React

如果需要兼容React 16.x 版本,请选择 "classic" 模式。

react.importSource

jsx 函数使用的模块名称。

tsconfig.json 中的 jsxImportSource

类型: string

如 "react", "preact", "solid-js", "@emotion/react", ...

默认值: "react"

会自动读取 tsconfig.json 中的 jsxImportSource 配置,优先级更高

示例:

import { defineConfig } from '@shined/lecp';
export default defineConfig({
  react: {
    runtime: "automatic",
    importSource: "preact"
  }
});

export default defineConfig({
  react: {
    runtime: "preserve",
    importSource: "solid-js"
  }
});

css

CSS 相关的处理配置。

css.cssModules

类型: boolean | string

默认值: false

CSS Modules 配置:

  • false:关闭 CSS Modules
  • true:使用默认命名规则 ${packageName}__[local]
  • string:自定义命名规则模板

示例:

import { defineConfig } from '@shined/lecp';

export default defineConfig({
  css: {
    cssModules: true,
    // 或自定义命名规则
    // cssModules: "[name]__[local]___[hash:base64:5]"
  }
});

css.lessCompile

类型: boolean

默认值: true

在 Bundless 模式下是否编译 Less 文件为 CSS。

  • true:编译 .less 文件为 .css
  • false:直接复制 .less 文件到输出目录

css.lessOptions

类型: object

默认值: {}

额外的 Less 编译选项,详见 Less 官方文档

css.lightningCssOptions

类型: object

默认值: {}

额外的 Lightning CSS 配置选项,详见 Lightning CSS 文档

clean

类型: boolean

默认值: true

是否清理输出目录。

当多个 format 同时生成到一个目录时,需要关闭此选项。

示例:

import { defineConfig } from '@shined/lecp';

export default defineConfig({
  format: [
    { type: "umd", fileName: "index", minify: false },
    { type: "umd", fileName: "index.min" }
  ],
  clean: false
});

exclude

类型: string[]

默认值: 自动忽略常见的测试文件和配置文件

指定编译时需要忽略的文件或目录,支持 glob 模式

示例:

import { defineConfig } from '@shined/lecp';

export default defineConfig({
  exclude: [
    '**/*.md',          // 忽略所有 markdown 文件
    'src/dev-only/**'   // 忽略开发专用目录
  ]
});

extends

类型: string

默认值: undefined

继承其他配置文件,类似于 tsconfig.json 的 extends 功能。适用于 monorepo 项目的配置复用场景。

路径支持:

  • 相对路径:相对于当前配置文件
  • 绝对路径:文件系统绝对路径
  • npm 包:支持从 node_modules 加载

示例:

// 子项目配置
import { defineConfig } from '@shined/lecp';

export default defineConfig({
  extends: '../shared/lecp.base.config.ts',
  // 子项目特定配置
  format: [{ type: "esm" }]
});
// 基础配置文件 (lecp.base.config.ts)
import { defineConfig } from '@shined/lecp';

export default defineConfig({
  targets: { chrome: 87 },
  dts: true,
  sourcemap: true
});