PackConfig

PackConfig 是软件包打包配置接口,用于将服务的构建产物打包成标准的 npm .tgz 格式软件包。

  • 标准化:使用 npm 标准的 .tgz 打包格式
  • 完整性:包含模块的源代码、类型声明和配置文件等所有必要文件
  • 兼容性:与 npm 生态系统完全兼容,支持标准的包管理工作流

类型定义

1interface PackConfig {
2    enable?: boolean;
3    outputs?: string | string[] | boolean;
4    packageJson?: (esmx: Esmx, pkg: Record<string, any>) => Promise<Record<string, any>>;
5    onBefore?: (esmx: Esmx, pkg: Record<string, any>) => Promise<void>;
6    onAfter?: (esmx: Esmx, pkg: Record<string, any>, file: Buffer) => Promise<void>;
7}

PackConfig

enable

是否启用打包功能。启用后会将构建产物打包成标准的 npm .tgz 格式软件包。

  • 类型:boolean
  • 默认值:false

outputs

指定输出的软件包文件路径。支持以下配置方式:

  • string: 单个输出路径,如 'dist/versions/my-app.tgz'
  • string[]: 多个输出路径,用于同时生成多个版本
  • boolean: true 时使用默认路径 'dist/client/versions/latest.tgz'

packageJson

自定义 package.json 内容的回调函数。在打包前调用,用于自定义 package.json 的内容。

  • 参数:
    • esmx: Esmx - Esmx 实例
    • pkg: any - 原始的 package.json 内容
  • 返回值:Promise<any> - 修改后的 package.json 内容

常见用途:

  • 修改包名和版本号
  • 添加或更新依赖项
  • 添加自定义字段
  • 配置发布相关信息

示例:

1packageJson: async (esmx, pkg) => {
2  // 设置包信息
3  pkg.name = 'my-app';
4  pkg.version = '1.0.0';
5  pkg.description = '我的应用';
6
7  // 添加依赖
8  pkg.dependencies = {
9    'vue': '^3.0.0',
10    'express': '^4.17.1'
11  };
12
13  // 添加发布配置
14  pkg.publishConfig = {
15    registry: 'https://registry.example.com'
16  };
17
18  return pkg;
19}

onBefore

打包前的准备工作回调函数。

  • 参数:
    • esmx: Esmx - Esmx 实例
    • pkg: Record<string, any> - package.json 内容
  • 返回值:Promise<void>

常见用途:

  • 添加额外的文件(README、LICENSE 等)
  • 执行测试或构建验证
  • 生成文档或元数据
  • 清理临时文件

示例:

1onBefore: async (esmx, pkg) => {
2  // 添加文档
3  await fs.writeFile('dist/README.md', '# My App');
4  await fs.writeFile('dist/LICENSE', 'MIT License');
5
6  // 执行测试
7  await runTests();
8
9  // 生成文档
10  await generateDocs();
11
12  // 清理临时文件
13  await cleanupTempFiles();
14}

onAfter

打包完成后的处理回调函数。在 .tgz 文件生成后调用,用于处理打包产物。

  • 参数:
    • esmx: Esmx - Esmx 实例
    • pkg: Record<string, any> - package.json 内容
    • file: Buffer - 打包后的文件内容
  • 返回值:Promise<void>

常见用途:

  • 发布到 npm 仓库(公共或私有)
  • 上传到静态资源服务器
  • 执行版本管理
  • 触发 CI/CD 流程

示例:

1onAfter: async (esmx, pkg, file) => {
2  // 发布到 npm 私有仓库
3  await publishToRegistry(file, {
4    registry: 'https://registry.example.com'
5  });
6
7  // 上传到静态资源服务器
8  await uploadToServer(file, 'https://assets.example.com/packages');
9
10  // 创建版本标签
11  await createGitTag(pkg.version);
12
13  // 触发部署流程
14  await triggerDeploy(pkg.version);
15}

使用示例

entry.node.ts
1import type { EsmxOptions } from '@esmx/core';
2
3export default {
4  modules: {
5    // 配置需要导出的模块
6    exports: [
7      'root:src/components/button.vue',
8      'root:src/utils/format.ts',
9      'npm:vue',
10      'npm:vue-router'
11    ]
12  },
13  // 打包配置
14  pack: {
15    // 启用打包功能
16    enable: true,
17
18    // 同时输出多个版本
19    outputs: [
20      'dist/versions/latest.tgz',
21      'dist/versions/1.0.0.tgz'
22    ],
23
24    // 自定义 package.json
25    packageJson: async (esmx, pkg) => {
26      pkg.version = '1.0.0';
27      return pkg;
28    },
29
30    // 打包前准备
31    onBefore: async (esmx, pkg) => {
32      // 添加必要文件
33      await fs.writeFile('dist/README.md', '# Your App\n\n模块导出说明...');
34      // 执行类型检查
35      await runTypeCheck();
36    },
37
38    // 打包后处理
39    onAfter: async (esmx, pkg, file) => {
40      // 发布到私有 npm 镜像源
41      await publishToRegistry(file, {
42        registry: 'https://npm.your-registry.com/'
43      });
44      // 或部署到静态服务器
45      await uploadToServer(file, 'https://static.example.com/packages');
46    }
47  }
48} satisfies EsmxOptions;