本文档详细介绍了 Modern.js CLI 插件的 API。CLI 插件允许您在 Modern.js 项目的构建和开发过程中扩展和定制功能。
一个典型的 CLI 插件结构如下:
setup
函数接收一个 api
对象,该对象提供了所有可用的 CLI 插件 API。
api.getAppContext
获取 Modern.js 应用的上下文信息。
AppContext
对象,包含以下字段:字段名 | 类型 | 描述 | 何时可用 |
---|---|---|---|
command |
string |
当前执行的命令 (e.g., dev , build , deploy ) |
- |
port |
number |
开发服务器端口号 | onPrepare 之后 |
configFile |
string |
配置文件的绝对路径 | - |
isProd |
boolean |
是否为生产模式 | - |
appDirectory |
string |
项目根目录的绝对路径 | - |
srcDirectory |
string |
项目源码目录的绝对路径 | - |
distDirectory |
string |
项目产物输出目录的绝对路径 | modifyResolvedConfig 之后 |
sharedDirectory |
string |
公共模块目录的绝对路径 | - |
nodeModulesDirectory |
string |
node_modules 目录的绝对路径 |
- |
ip |
string |
当前机器的 IPv4 地址 | - |
packageName |
string |
项目 package.json 中的 name 字段 |
- |
plugins |
object[] |
当前已注册的插件列表 | - |
entrypoints |
object[] |
页面入口信息 | - |
serverRoutes |
object[] |
服务端路由信息 | - |
bundlerType |
webpack | rspack |
当前使用的打包工具类型 (webpack 或 rspack ) |
onPrepare 之后 |
metaName |
string |
框架内部名称 | - |
apiDirectory |
string |
API 模块目录的绝对路径 (BFF 使用) | - |
lambdaDirectory |
string |
Lambda 模块目录的绝对路径 (BFF 使用) | - |
runtimeConfigFile |
string |
运行时配置文件的名称 | - |
serverConfigFile |
string |
服务器配置文件的名称 | - |
checkedEntries |
string[] |
指定的入口信息 | - |
apiOnly |
boolean |
是否为 apiOnly 模式 |
- |
getAppContext
返回的上下文信息是只读的,无法直接进行修改。
api.getConfig
获取用户在 modern.config.ts
文件中定义的配置。
api.getNormalizedConfig
获取经过 Modern.js 内部处理和插件修改后的最终配置(归一化配置)。
modifyResolvedConfig
钩子之后使用。api.isPluginExists
检查指定的插件是否已注册。
pluginName: string
: 要检查的插件名称。boolean
值,表示插件是否存在。api.getHooks
获取所有已注册的钩子函数。
在自定义插件中,只能手动调用对应插件注册的钩子,不能调用官方钩子,以免影响正常应用的执行顺序。
api.config
修改 Modern.js 的初始配置。
api.config(configFn: () => UserConfig | Promise<UserConfig>)
configFn
: 一个返回配置对象或 Promise 的函数。modern.config.ts
中的配置之后。配置合并优先级(从高到低):
modern.config.*
文件中定义的配置。api.config()
注册的配置。api.modifyBundlerChain
使用 chain API 修改 webpack 或者 Rspack 配置。
api.modifyBundlerChain(modifyFn: (chain: WebpackChain | RspackChain, utils: WebpackUtils | RspackUtils) => void | Promise<void>)
modifyFn
: 修改函数,接收 webpack-chain
或 RspackChain
实例和实用工具作为参数。api.modifyRsbuildConfig
修改 Rsbuild 的配置。
api.modifyRsbuildConfig(modifyFn: (config: RsbuildConfig, utils: RsbuildUtils) => RsbuildConfig | Promise<RsbuildConfig> | void)
modifyFn
: 修改函数,接收 Rsbuild 配置对象和实用工具作为参数,可以返回修改后的配置对象、Promise 或不返回(直接修改原对象)。api.modifyRspackConfig
修改 Rspack 的配置。(当使用 Rspack 作为打包工具时)
api.modifyRspackConfig(modifyFn: (config: RspackConfig, utils: RspackUtils) => RspackConfig | Promise<RspackConfig> | void)
modifyFn
: 修改函数,接收 Rspack 配置对象和实用工具作为参数,可以返回修改后的配置对象、Promise 或不返回(直接修改原对象)。api.modifyWebpackChain
使用 webpack-chain 修改 Webpack 配置。(当使用 Webpack 作为打包工具时)
api.modifyWebpackChain(modifyFn: (chain: WebpackChain, utils: WebpackUtils) => void | Promise<void>)
modifyFn
: 修改函数,接收 webpack-chain
实例和实用工具作为参数。api.modifyWebpackConfig
直接修改 Webpack 配置对象。(当使用 Webpack 作为打包工具时)
api.modifyWebpackConfig(modifyFn: (config: WebpackConfig, utils: WebpackUtils) => WebpackConfig | Promise<WebpackConfig> | void)
modifyFn
: 修改函数,接收 Webpack 配置对象和实用工具作为参数,可以返回修改后的配置对象、Promise 或不返回(直接修改原对象)。构建配置修改顺序
api.modifyServerRoutes
修改服务器路由配置。
api.modifyServerRoutes(transformFn: (routes: ServerRoute[]) => ServerRoute[])
transformFn
: 转换函数,接收当前服务器路由数组作为参数,返回修改后的数组。prepare
阶段)。api.modifyHtmlPartials
修改 HTML 模板片段。
api.modifyHtmlPartials(modifyFn: (partials: HtmlPartials, entrypoint: Entrypoint) => void)
modifyFn
: 修改函数,接收 HTML 模板片段对象和当前入口点信息作为参数。
partials
: 包含 top
, head
, body
三个部分,每个部分都有append
, prepend
, replace
三个方法。prepare
阶段)。当使用完全自定义模板时,该钩子函数将不会执行。
api.onPrepare
在 Modern.js 准备阶段添加额外的逻辑。
api.onPrepare(prepareFn: () => void | Promise<void>)
prepareFn
: 准备函数,无参数,可异步。api.addCommand
添加自定义的 CLI 命令。
api.addCommand(commandFn: ({ program: Command }) => void)
commandFn
: 接收 commander
的 program
对象作为参数,用于定义新的命令。prepare
钩子运行完成后。api.addWatchFiles
添加额外的文件监听列表(用于开发模式)。
api.addWatchFiles(watchFn: () => string[] | { files: string[]; isPrivate: boolean; })
watchFn
: 返回一个包含文件路径的数组,或一个包含 files
和 isPrivate
属性的对象。
files
: 要监听的文件路径数组。isPrivate
: 是否为框架内部文件(影响文件变更时的行为)。addCommand
钩子运行完成之后。api.onFileChanged
在监听文件发生变化时添加额外的逻辑(用于开发模式)。
api.onFileChanged(changeFn: (params: { filename: string; eventType: 'add' | 'change' | 'unlink'; isPrivate: boolean; }) => void)
changeFn
: 文件变化处理函数,接收以下参数:
filename
: 发生变化的文件路径。eventType
: 变化类型 (add
, change
, unlink
)。isPrivate
: 是否为框架内部文件。api.onBeforeBuild
在构建开始之前添加额外的逻辑。
api.onBeforeBuild(buildFn: () => void | Promise<void>)
buildFn
: 构建前执行的函数,无参数,可异步。api.onAfterBuild
在构建完成后添加额外的逻辑。
api.onAfterBuild(buildFn: () => void | Promise<void>)
buildFn
: 构建后执行的函数,无参数,可异步。api.onDevCompileDone
在开发服务器编译完成后添加额外的逻辑。
api.onDevCompileDone(compileFn: () => void | Promise<void>)
compileFn
: 编译完成后执行的函数。api.onBeforeCreateCompiler
在创建编译器实例之前添加额外的逻辑。
api.onBeforeCreateCompiler(createFn: () => void | Promise<void>)
createFn
: 创建前执行的函数,无参数,可异步。api.onAfterCreateCompiler
在创建编译器实例之后添加额外的逻辑。
api.onAfterCreateCompiler(createFn: () => void | Promise<void>)
createFn
: 创建后执行的函数,无参数,可异步。api.onBeforeDev
在开发服务器启动前添加额外的逻辑。
api.onBeforeDev(devFn: () => void | Promise<void>)
devFn
: 开发服务器启动前执行的函数,无参数,可异步。dev
命令启动开发服务器之前。api.onAfterDev
在开发服务器启动后添加额外的逻辑。
api.onAfterDev(devFn: () => void | Promise<void>)
devFn
: 开发服务器启动后执行的函数。api.onBeforeExit
在进程退出前添加额外的逻辑。
api.onBeforeExit(exitFn: () => void | Promise<void>)
exitFn
: 进程退出前执行的函数,无参数,可异步。api.onBeforePrintInstructions
在打印成功信息前添加额外的逻辑。
api.onBeforePrintInstructions(printFn: ({instructions: string}) => {instructions: string} | Promise<{instructions: string}>)
printFn
: 修改打印信息的函数, 返回修改后的信息。