插件配置
插件定义
在reSKRipt中,插件是一个“增加当前项目配置文件配置的函数”。一个单独的插件从类型上可以描述为:
export interface PluginOptions {
    cwd: string;
    command: string;
}
type SettingsPluginReturn = ProjectSettings | Promise<ProjectSettings>;
export type SettingsPluginItem = (current: ProjectSettings, cmd: PluginOptions) => SettingsPluginReturn;
export type MayBeSettingsPlugin = SettingsPluginItem | null | undefined | false;
export type SettingsPlugin = MayBeSettingsPlugin | MayBeSettingsPlugin[];
其中ProjectSettings包含了build、devServer、featureMatrix等部分,但不包含plugins本身,即你不可能“用一个插件去控制另一个插件”。
而项目配置文件中的plugins是一系列的插件的声明,也可以是一个返回插件集合的函数:
type Plugins = SettingsPlugin[] | ((commandName: string) => SettingsPlugin[]);
当plugins为一个函数时,它的参数是当前的子命令,如skr build的子命令就是build。
使用注意点
配置不可变
在实现一个插件时,建议不要直接修改输入的settings参数,使用不可变的对象更新方法去修改它,比如你希望实现一个“根据当前开发者调整代理API目标”的插件时,可以这样写:
import username from 'username';
import {configure, SettingsPlugin} from '@reskript/settings';
const dynamicProxyTarget = (template: string): SettingsPlugin => settings => {
    // 这里使用不可变的更新方法,不直接覆盖
    return {
        ...settings,
        devServer: {
            ...settings.devServer,
            defaultProxyDomain: template.replace('{username}', username.sync()),
        },
    };
};
export default configure(
    'webpack',
    {
        plugins: [
            dynamicProxyTarget('{username}.my-app.dev:8788'),
        ],
    }
);
如果你觉得不可变的更新过于麻烦,也可以使用immer这样的工具来协助。