TypeScript Plugin Runtime
Pluxel
写一个 class,用构造函数注入能力;配置、HTTP route 和资源清理都放在固定位置,开发期直接热更新。
import { HealthPlugin } from '@acme/health' // 值导入:提供必需依赖的来源
import type { AuditPlugin } from '@acme/audit' // 类型导入:不会加载可选插件
const Audit = definePluginRef<AuditPlugin>() // 模块级引用:声明可选依赖
@Plugin()
class StatusPlugin extends BasePlugin {
constructor(readonly health: HealthPlugin) { super() } // 构造器参数:注入必需依赖
protected override init() {
// init 中的直接语句:消费可选依赖
this.plugins.use(Audit, (audit) => audit.attach(this))
}
status() { return this.health.status() } // 直接调用必需依赖
}直接看日常写法
写 Plugin 最常用的三个位置
01
注入依赖
constructor(private readonly http: WretchPlugin) { super() }需要另一个 Plugin 时,直接写构造函数参数。类型就是依赖声明。
阅读文档02
读取配置
private readonly config = this.configs.use(StatusConfig)读取经过默认值和校验的冻结配置,不再维护平行的 TypeScript interface。
阅读文档03
登记清理
this.ctx.effects.defer(() => clearInterval(timer))创建资源后立即登记释放函数;停止、替换和启动回滚都会执行。
阅读文档最后放进宿主
Plugin 写法不随宿主改变
固定插件目录
import { defineHostApplication } from '@pluxel/host'
import { OrdersPlugin } from '@app/orders'
export default defineHostApplication(() => ({
plugins: [OrdersPlugin],
}))Plugin 清单随应用构建,开发期支持 HMR。目录表示代码可用,冷启动策略通过 state.initial.autoStart 显式选择。
配置宿主增加动态来源
import { defineHostApplication } from '@pluxel/host'
import { pluginSource } from '@pluxel/host/sources'
export default defineHostApplication(() => ({
plugins: [],
sources: [pluginSource({
kind: 'directory', path: './plugins',
include: ['*.mjs'],
})],
}))开发期新增、更新、删除文件入口,变化提交到同一 Host catalog;是否启动仍由运行策略决定。
配置宿主同一份应用,开发与生产共用
在上面的应用声明中加入 configure,显式选择服务;内存存储适合本地尝试,持久部署见宿主配置。
安装服务
import { defineHostApplication } from '@pluxel/host'
import { servicesPreset } from '@pluxel/services/preset'
export default defineHostApplication(async (startup) => ({
plugins: [],
services: await servicesPreset(startup, {
persistence: { mode: 'memory' },
}),
}))开发与热更新
import { defineConfig } from 'vite'
import { vitePreset } from '@pluxel/services/vite'
export default defineConfig({
plugins: [vitePreset({
entry: './src/app.ts', devConsole: true,
})],
})生产构建
import { defineConfig } from 'vite-plus/pack'
import { pluxel } from '@pluxel/rolldown'
export default defineConfig({
entry: './src/app.ts',
plugins: [pluxel()],
})