Modifier

动态修改器

  动态修改器用于在各个阶段执行特定的任务,不同配置文件中的修改器不会相互覆盖。

  您可以通过下面的代码定义并导出一个修改器:

import {defineModifier} from 'swpp-backends'
 
defineModifier({
 
})

build

  build 函数用于将 swpp 内部使用的 RuntimeDataCompilationData 替换为您的实现,如果在多个配置文件中均定义了 build 函数,那么将只有优先级最高的 build 生效。

  默认创建 RuntimeDataCompilationData 的代码如下:

// noinspection TypeScriptUnresolvedReference
 
() => {
    const compilation = new CompilationData()
    const runtime = new RuntimeData(compilation)
    return {runtime, compilation}
}

  您可以通过定义 build 函数来让 swpp 使用您的实现:

// noinspection TypeScriptUnresolvedReference
 
import {defineModifier} from 'swpp-backends'
 
defineModifier({
    build: () => {
        // do something
        return {
            runtime: xxx,
            compilation: xxxx
        }
    }
})

registry

  如果您在看到这里之前尝试向环境变量中写入您自己定义的值,您会发现在运行时将会产生错误,因为 swpp 为了避免您出现拼写错误,不允许向配置中写入不存在的键。

  registry 的作用就是向环境变量中注册新的键(该函数内应当只调用 xxx.append 函数及其它工具函数,非必要不应当包含其它有副作用的操作),优先级越低该函数越早执行:

// noinspection TypeScriptUnresolvedReference,JSUnusedLocalSymbols
 
import {defineModifier} from 'swpp-backends'
 
defineModifier({
    registry: (runtime: RuntimeData, compilation: CompilationData) => {
        runtime.crossEnv.append('your_key', {
            // 使用 default 定义缺省值
            default: 'default value',
            // 可选项:通过 checker 检查配置项中填入的值(或缺省值)是否合法
            // 合法返回 false,否则返回 RuntimeEnvErrorTemplate<T>,也就是 { value: T, message: string }
            // 此处实际为一个泛型,value 的类型与 default 是同一个类型
            // 您不需要在 checker 中检查 value 的类型是否与 default 相同,swpp 会在调用 checker 之前自动判断
            checker(value: string): false | RuntimeEnvErrorTemplate<T> {
                if (!value) return {
                    value, message: 'your_key 不能为空'
                }
                return false
            }
        })
    }
})

dynamicUpdate

  本函数用于动态修改属性的值,函数内应当只调用 xxx. update 函数及其它工具函数,非必要不应当包含其它有副作用的操作,优先级越低该函数越早执行:

// noinspection TypeScriptUnresolvedReference
 
import {defineModifier} from 'swpp-backends'
 
defineModifier({
    // 这个示例的功能是在配置中填写的有 `key_a` 后修改 `key_b` 的值
    dynamicUpdate: (runtime: RuntimeData, compilation: CompilationData) => {
        if (runtime.crossEnv.hasValue('key_a')) {
            compilation.compilationEnv.update('key_b', 'key_a has value')
        }
    }
})