1.5.11 • Published 7 months ago

@kbeaver/cli-command-build v1.5.11

Weekly downloads
-
License
ISC
Repository
-
Last release
7 months ago

@kbeaver/cli-command-build

Usage

命令需要项目已配置 kb.json 里的 build 属性

# 在项目kb项目根目录下直接运行命令
# 需要在 kb.json 文件里配置 build
# 如果配置里配置了多个任务,可输入任务名称执行对应的任务
$ kb build [taskName]

build 配置

kb.json

schema : https://config.kbeaver.cn/files/kb.schema.json

{
  // 编译任务配置
  "build": [
    {
      "name": "任务名称",
      "text": "命令行提示信息",
      "tasks": [...],
    }
  ]
}

build 里可配置两种任务,一种是 Task ,一种是预设任务

type BuildConfig = (Task | string)[]

预设任务

预设是预先编辑好的配置,已经保存在 build 命令里,直接指定即可。

可使用预置任务:

  • buildComponent 针对 UI 和 Plus 组件库预先设置好的打包配置
  • ... 待开发

使用:

{
  "build": ["buildComponent"]
}

指定某些任务进行扩展配置(merge)

{
  "build": [
    {
      "name": "buildComponent",
      "extend": {
        "BuildIIFEScript": {
          "options": {
            "buildGlobalName": "KbUiPlus"
          }
        }
      }
    }
  ]
}

Task

任务会顺序执行,每个任务里的子任务根据配置可并行或顺序执行。

// 子任务
type ChildTask =
  | ScriptTask
  | StyleTask
  | FileTask
  | CustomizeTask
  | DeclarationTask

interface Task {
  // 任务名称(key),唯一
  name: string
  // 任务执行时输出的文本
  text: string
  // 子任务列表
  tasks: ChildTask[]
  // 设定执行顺序
  // 可设置值:series,parallel
  // 默认安顺序执行 series
  order?: 'series' | 'parallel'
  // options?:
  extend?: {
    [key: string]: ChildTask
  }
}

子任务一共有五种类型:

  • Script build 任务
  • Style build 任务
  • 文件操作任务
  • 自定义任务
  • 生成 Typescript 类型声明文件任务

Task Base & Child Task Base Options

interface ChildTaskBase {
  name?: string
  // 任务类型
  type: 'script' | 'style' | 'file' | 'customize' | 'declaration'
  // 文件地址(glob 匹配)
  // eg: '**/*/*.{ts,tsx}'
  src: string
  options: TaskOptionsBase
}

interface TaskOptionsBase {
  // 匹配控制
  // 默认跟路径,设置此项后。匹配出的文件路径,不包含此路径。默认空
  srcBase?: string
  // 匹配点开头的文件,默认false
  globDot?: boolean
  // 忽略匹配模式,可以多个。从src匹配模式里排除。默认空
  // 忽略demo和tests目录: ['**/demo/', '**/tests/']
  globIgnore?: string[]
  globNoDir?: boolean
  // 是否输出绝对路径,默认false
  globAbsolute?: boolean
  // 指定输出路径(相对于项目根目录,kb.json 同级)
  outDir: string
}

所有路径均是相对于项目根目录

ScriptTask

使用 esbuild 对 ts、tsx 或 js 进行编译和捆绑打包,

类型:

interface ScriptTask {
  type: 'script'
  // 文件地址(glob 匹配)
  src: string
  options: ScriptTaskOptions
}

interface ScriptTaskOptions extends TaskOptionsBase {
  // esbuild 设置
  // 是否开启 bundle, 默认 false
  buildBundle?: boolean
  // 设定全局变量
  buildDefine?: Record<string, string>
  // 入口点
  buildEntryPoints?: Record<string, string> | string[]
  // 外部:指定那些模块不打包
  buildExternal?: string[]
  // 编译目标,默认 esm
  buildFormat?: 'iife' | 'cjs' | 'esm'
  // 注入代码,code path
  buildInject?: string[]
  // 为指定的文件类型配置加载程序
  // 加载起类型 https://esbuild.github.io/content-types/
  // eg: { '.png': 'file' }
  buildLoader?: {
    [ext: string]: ESBuild.Loader
  }
  // 是否压缩,默认false
  // process.env.NODE_ENV = production 自动启用
  buildMinify?: boolean
  // 单文件入口时,指定输出文件
  buildOutFile?: string
  // 目标平台,默认 browser
  buildPlatform?: 'browser' | 'node' | 'neutral'
  // 源码地图
  buildSourcemap?: boolean | 'linked' | 'external' | 'inline' | 'both'
  // 可设置选项查看:https://esbuild.github.io/api/#target
  buildTarget?: string | string[]

  /**
   * 高级选项
   */
  // 是否覆盖原代码,outDir 设置为 '.'
  buildAllowOverwrite?: boolean
  // 是否开启打包代码分析
  // 必须同时开启 buildBundle、metafile
  buildAnalyze?: boolean
  // 指定资产的资产名称模板,需配合 buildLoader 使用
  // eg: assets/[name]-[hash]
  buildAssetNames?: string
  buildEntryNames?: string
  // 多入口时,指定输出文件的扩展名
  buildOutExtension?: Record<string, string>
  // 剪枝,buildBundle = true, buildFormat = esm 或 iife 时生效
  buildTreeShaking?: boolean
  /*
   * 其它
   */
  // plugins
  buildPlugins?: ScriptBuildPlugin
}

例子:

  {
    name: 'buildScript',
    text: 'Build Script',
    tasks: [
      {
        type: 'script',
        src: '**/*.{ts,tsx}',
        options: {
          srcBase: 'src/components',
          globIgnore: ['**/{demo,tests}/*'],
          outDir: 'es',
          buildFormat: 'esm',
          buildMinify: true,
          buildEntryNames: '[dir]/[name]',
          buildPlugins: [''],
        },
      },
    ],
  },

StyleTask

类型描述:

interface StyleTask {
  type: 'style'
  src: string
  options: StyleTaskOptions
}

interface StyleTaskOptions extends TaskOptionsBase {
  // 输出路径
  outDir: string
  // 出书文件名称
  fileName?: string
  // 输出文件的扩展名
  ext?: string
  // postcss config
  // 是否开启压缩,默认 false
  minify?: boolean
  // cssModules 设置
  cssModules?: CssModules
  // assets image inliner
  // 静态资源匹配地址,可以使用 glob 匹配模式
  // 这里的地址是相对以css里地址相对地址
  assetPaths?: string[]
  // 小于此阈值的导入或引用资源将内联为 base64 编码,以避免额外的 http 请求。设置为 0 可以完全禁用此项
  // 默认 4096 (4kb)
  assetInlineLimit?: number
  // process options 设置,详细设置看官网
  postcssOptions?: ProcessOptions
  event?: StyleTaskOptionsEvent
}

interface CssModules {
  exportClasses?: {
    // 输出路径,默认和src 文件路径一致
    outPath?: string
    // 文件名称,默认和src css 文件同名
    fileName?: string
    // 默认 json 后缀
    ext?: string
  }
  // 是否使用 vite 或 webpack 里的 cssModules 的配置,默认空
  // 设置此项后,exportClasses 无效
  loadOptions?: 'vite' | 'webpack'
  // postcss-modules 插件的 options 设置
  options?: PostcssModulesOptions
}

interface StyleTaskOptionsEvent {
  onBeforeTransform?: (code: string) => string
  onAfterTransform?: (code: string) => void
}

// 具体设置查看官网说明
interface PostcssModulesOptions {
  // css module 映射 json 的后续处理设置
  getJSON?(
    cssFilename: string,
    json: Record<string, string>,
    outputFilename?: string
  ): void

  localsConvention?:
    | 'camelCase'
    | 'camelCaseOnly'
    | 'dashes'
    | 'dashesOnly'
    | ((
        originalClassName: string,
        generatedClassName: string,
        inputFile: string
      ) => string)

  scopeBehaviour?: 'global' | 'local'
  globalModulePaths?: RegExp[]

  generateScopedName?:
    | string
    | ((name: string, filename: string, css: string) => string)

  hashPrefix?: string
  exportGlobals?: boolean
  root?: string

  resolve?: (file: string) => string | Promise<string>
}

DeclarationTask

使用 tsc 生成类型声明。

  • 项目必须安装 typescript,否则会报错。
  • 必须指定一个 tsconfig 配置的路径

类型描述:

interface DeclarationTask {
  type: 'declaration'
  // 指定 tsconfig 配置的路径
  tsconfigPath: string
}

FileTask

对匹配到的文件进行对应文件操作,拷贝、删除、移动、清理目录。

  • 由于 options 里的 outDir 是必选项目,在删除清理目录动作时,设置为空字符即可

类型描述:

interface FileTask {
  type: 'file'
  src: string
  options: FileTaskOptions
}

interface FileTaskOptions extends TaskOptionsBase {
  // 需要执行的动作
  action: 'copy' | 'remove' | 'move' | 'clean'
}

CustomizeTask

自定义任务。

可以在 options 里的 execQueue 属性里设置需要运行的异步方法,或 js 文件的地址(路径相对项目根目录)执行器会载入对应的文件运行。

  • js 文件必须使用 es6 的默认导出。

  • 自定义异步方法,接受固定的参数

  • 执行器会把上一个执行完方法返回的结果传给下一个方法。

类型描述:

interface CustomizeTask {
  type: 'customize'
  src: string
  options: CustomizeTaskOptions
}

interface CustomizeTaskOptions extends TaskOptionsBase {
  /**
   * execQueue 执行队列:
   * (function | string)[]
   * - function 必须是一个异步函数,async 或者 promise
   * - string 文件路径地址
   */
  execQueue: (CustomizeFunction | string)[]
}

interface CustomizeFunctionOptions {
  // 自定义任务匹配到的文件或文件夹路径列表
  src: string[]
  // 输出路径,也就是 outDir 里的设置
  dest: string
  srcBase?: string
  // 项目根目录
  rootPath: string
  // 上一个自定义方法返回的结果
  results?: any
}
type CustomizeFunction = (data: CustomizeFunctionOptions) => Promise<any>