动态修改器
动态修改器用于在各个阶段执行特定的任务,不同配置文件中的修改器不会相互覆盖。
您可以通过下面的代码定义并导出一个修改器:
import {defineModifier} from 'swpp-backends'
defineModifier({
})
build
build
函数用于将 swpp 内部使用的 RuntimeData
和 CompilationData
替换为您的实现,如果在多个配置文件中均定义了 build
函数,那么将只有优先级最高的 build
生效。
默认创建 RuntimeData
和 CompilationData
的代码如下:
// 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')
}
}
})