当前位置: 首页 > 文档资料 > Rax 中文文档 >

插件开发

优质
小牛编辑
135浏览
2023-12-01

插件需要 export 一个函数,函数会接收到两个参数,第一个是 build-scripts 提供的 pluginAPI,第二个是用户传给插件的自定义参数,如下:

module.exports = (pluginAPI, options) => {
  const { 
    context,
    log,
    onHook 
  } = pluginAPI;
};

pluginAPI 主要包含以下几个参数:

context

包含运行时的各种环境信息:

  • command 当前运行命令
  • commandArgs script 命令执行时接受到的参数
  • rootDir 项目根目录
  • userConfig 用户在 build.json 中配置的内容
  • pkg 项目 package.json 中的内容

onGetWebpackConfig

在工程获取 webpack 时触发,可以用 webpack-chain 形式修改 webpack 配置:

// 场景一:所有 webpack 任务
module.exports = ({onGetConfig, registerTask}) => {
  registerTask('default', webpackConfig);
  
  onGetWebpackConfig((config) => {
    config.entry('xxx');
  });
}
// 场景二:多 webpack 任务
module.exports = ({onGetConfig, registerTask}) => {
  registerTask('web', webpackConfigWeb);
  registerTask('weex', webpackConfigWeex);
  
  onGetWebpackConfig('web',(config) => {
    config.entry('xxx');
  });
  
  onGetWebpackConfig('weex',(config) => {
    config.entry('xxx');
  });
}

onHook

用 onHook 监听命令运行时事件,onHook 注册的函数执行完成后才会执行后续操作,可以用于在命令运行中途插入插件想做的操作。

module.exports = ({ onHook }) => {
 onHook('after.start.compile', () => {
   // do something after dev compile
 });
}

log

script 统一的 log 工具,底层使用 npmlog ,便于生成统一格式的 log

registerTask

谨慎使用,注册多 webpack 任务

module.exports = ({ registerTask }) => {
  registerTask('web', webpackConfigWeb);
  registerTask('weex', webpackConfigWeex);
}

registerUserConfig

谨慎使用,注册 build.json 中的顶层配置字段,用于用户字段校验,可以传入单个配置对象或者包含多个配置对象的数组。
生效的声明周期,在registerTask和onGetWebpackConfig之间
配置对象字段如下:

  • name (string)
    字段名称,唯一标识,多个插件无法注册相同的字段
    保留字段:plugins
  • validation(string|function)
    字段校验,支持string快速校验,string|boolean|number,也可以自定义函数,根据return值判断校验结果
  • configWebpack(function)
    字段效果,具体作用到webpack配置上,接收参数:
  • config:webpack chain config
  • value: build.json中的字段值
  • context:与外部context相同,新增字段taskName表现当前正在修改的task
module.exports = ({registerUserConfig}) => {
  registerUserConfig({
    name: 'entry',
    // validation: 'string',
    validation: (value) => {
      return typeof value === 'string'
    },
    configWebpack: (config, value, context) => {
      config.mode(value)
    },
  });
}

registerCliOption

谨慎使用,注册各命令上支持的 cli 参数,比如 npm start --https 来开启 https

module.exports = ({ registerCliOption }) => {
    registerCliOption({
    name: 'https', // 注册的 cli 参数名称,
    commands: ['start'],  // 支持的命令,如果为空默认任何命令都将执行注册方法
    configWebpack: (config, value, context) => {
        // 命令链路上的相关操作
    }
  })
}

注册函数执行周期,在 userConfig 相关注册函数执行之后

setValue

(key: string | number, value: any) => void
用来在context中注册变量,以供插件之间的通信。

// build-plugin-test
module.exports = ({setValue}) => {
  setValue('key', 123);
}

getValue

(key: string | number) => any
用来获取context中注册的变量。

module.exports = ({getValue}) => {
  const value = getValue('key'); // 123
}

插件通信

插件间需要进行通信的场景诉求:
不同插件之间需要知道彼此的存在来确定是否执行相应的逻辑
多个插件共有的配置信息可以抽出来,在某个插件中进行配置
使用setValue和getValue两个API来实现,分别用于数据的存取,详见插件API部分。
谨慎使用,会造成插件之间的依赖。

生命周期

start

生命周期参数调用时机
before.start.load{args: array // 启动参数}获取webpack配置之前
before.start.run-webpack执行之前
after.start.compile{url: string // serverUrl, stats: WebpackAssets}编译结束,每次重新编译都会执行
before.start.devServer{url: string // serverUrl, devServer:  WebpackDevServer}中间件加载后,webpack dev server启动前
after.start.devServer{url: string // serverUrl, devServer:  WebpackDevServer}webpack dev server启动后

build

生命周期参数调用时机
before.build.load{args: array // 启动参数}获取webpack配置之前
before.build.run-webpack执行之前
after.start.compile{ err: Error, stats: WebpackAssets}构建结束