新闻详情

新闻详情

首页 / 资讯中心 / 详情

Quasar App Extension Index API 完全指南:掌控 `quasar dev` 与 `quasar build` 的构建生命周期

发布时间:2026/9/20 23:39:42来源:尧图网络
Quasar App Extension Index API 完全指南:掌控 `quasar dev` 与 `quasar build` 的构建生命周期
Quasar App Extension Index API 完全指南掌控quasar dev与quasar build的构建生命周期【免费下载链接】quasarQuasar Framework - Build high-performance VueJS user interfaces in record time项目地址: https://gitcode.com/gh_mirrors/qu/quasar导读本文是 Quasar App Extension 开发的核心参考围绕docs/src/pages/app-extensions/development-guide/index-api.md展开系统讲解扩展的/ae/src/index.js|tsIndex 脚本所暴露的完整 API从读取宿主项目上下文、注册 boot/css 文件、修改 Vite/Rolldown 构建配置到注册自定义 CLI 命令与挂接 dev/build 生命周期钩子。读完本文你将掌握 Index API 每个成员的签名、语义与底层实现对应quasar/app-vite的 IndexAPI.js 源码能够编写出与 Quasar CLI 深度集成的生产级 App Extension。认识 Index 脚本App Extension 的主进程Index 脚本是每个 Quasar App Extension 的主入口文件位于扩展包内的/ae/src/index.js或.ts。它会在每次执行quasar dev和quasar build时被加载并运行是扩展修改构建流程的主进程——可以在这里注册 boot 文件、修改 Vite 配置、注册全局 CSS、注册 UI 组件、注册新的 Quasar CLI 命令等。从源码看Quasar CLI 在运行扩展时会通过 AppExtensionInstance.js 中的run()方法加载并执行该脚本const script await this.#getScript(index, true) const api new IndexAPI({ ctx, extId, prompts, packageDir }, this.#appExtJson) await script(api) return api.__getHooks(this.#appExtJson)也就是说CLI 构造一个IndexAPI实例传给脚本脚本通过api参数注册各类钩子执行结束后 CLI 通过内部方法__getHooks()收集这些钩子并应用到构建流程中。脚本的基本结构import { defineIndexScript } from #q-app // can be async export default defineIndexScript(api {})defineIndexScript从#q-app导入它本身是一个 no-op 包装函数见 wrappers.js作用是给回调参数api提供完整的 TypeScript 类型推导IndexAPICallback定义见 app-extension.d.ts。默认导出必须是函数可以是 async 函数。AppExtensionInstance 加载脚本时会校验默认导出是否为函数否则直接报错终止。脚本支持.js/.ts/.mjs/.cjs多种格式且会优先在dist/目录、其次在src/目录解析.ts脚本通过jiti在运行时加载其他格式使用原生 ESMimport()。[!TIP] 如果你的 App Extension 自身代码需要从quasar包导入内容例如Notify等 Quasar 插件或工具函数应当在此钩子中把你的包从宿主应用的依赖优化器dep optimizer中排除具体做法见 Injecting Quasar Plugin 一节中从自身代码使用插件Using the plugin from your own code的说明。API 参数总览Index 脚本回调收到的api参数IndexAPI包含四类能力类别成员环境信息api.ctx、api.extId、api.resolve、api.appDir、api.prompts输出与探测api.logger、api.hasTypescript、api.getStorePackageName、api.getNodePackagerName依赖/扩展检查api.compatibleWith、api.hasPackage、api.hasExtension、api.getPackageVersion配置扩展api.extendQuasarConf、api.extendViteConf及一系列模式专属extend*方法生命周期钩子api.beforeDev、api.afterDev、api.beforeBuild、api.afterBuild、api.onPublish持久化与注册api.getPersistentConf、api.setPersistentConf、api.mergePersistentConf、api.registerCommand、api.registerDescribeApi其中ctx、extId、resolve、appDir、logger以及三个探测方法定义在基类 BaseAPI.js其余成员定义在 IndexAPI.js。环境与上下文信息api.ctx与/quasar.config文件中的ctx完全相同类型为QuasarContext帮助你根据quasar dev/quasar build的运行环境做决策。典型用法是根据模式判断是否启用某个钩子if (api.ctx.dev api.ctx.mode.electron) { api.beforeDev(api { // do something when running quasar dev and // with Electron mode }) }ctx的完整结构示例{ dev: true, prod: false, mode: { spa: true }, modeName: spa, target: {}, targetName: undefined, arch: {}, archName: undefined, bundler: {}, bundlerName: undefined, debug: false, publish: undefined, vueDevtools: false, appPaths: { cliDir: ...absolute path of it, appDir: ...absolute path of it, srcDir: ...absolute path of it, publicDir: ...absolute path of it, pwaDir: ...absolute path of it, ssrDir: ...absolute path of it, ssgDir: ...absolute path of it, cordovaDir: ...absolute path of it, capacitorDir: ...absolute path of it, electronDir: ...absolute path of it, bexDir: ...absolute path of it, quasarConfigFilename: ...absolute path of the quasar.config file, quasarConfigInputFormat: js, // or ts resolve: { cli: (...paths) theAbsolutePathToCliDir, app: (...paths) theAbsolutePathToAppDir, src: (...paths) theAbsolutePathToAppSrcDir, public: (...paths) theAbsolutePathToPublicDir, pwa: (...paths) theAbsolutePathToAppSrcPwaDir, ssr: (...paths) theAbsolutePathToAppSrcSsrDir, ssg: (...paths) theAbsolutePathToAppSrcSsgDir, cordova: (...paths) theAbsolutePathToAppSrcCordovaDir, capacitor: (...paths) theAbsolutePathToAppSrcCapacitorDir, electron: (...paths) theAbsolutePathToAppSrcElectronDir, bex: (...paths) theAbsolutePathToAppSrcBexDir } } }值得注意的字段语义dev/prod当前是开发模式还是生产构建mode/modeName激活的 Quasar 模式spa / pwa / ssr / ssg / electron / capacitor / cordova / bextarget/targetName针对 mobile 模式的目标平台arch/archNameElectron 模式的架构bundler/bundlerName使用的打包器appPaths各目录的绝对路径以及带...paths变参的resolve工具返回拼接后的绝对路径quasarConfigInputFormat宿主项目quasar.config文件是js还是ts。api.extId当前 App Extension 的ext-id字符串。例如扩展包名为quasar-app-extension-my-ext则extId为my-ext。CLI 在 AppExtensionInstance.js 中根据包名解析出extIdscoped 包如scope/foo会得到scope/foo形式的 id。api.prompts一个对象包含安装该扩展时prompts 脚本返回的答案。也就是说用户在quasar ext add时做出的选择会固化到宿主项目配置中并在每次 dev/build 时重新注入到 Index 脚本。prompts 脚本本身的 API 详见 Prompts API。api.resolve在当前运行扩展的宿主应用内解析路径免去自行import path拼接的麻烦。它直接引用ctx.appPaths.resolve见 BaseAPI.js支持所有模式目录// resolves to root of app api.resolve.app(src/my-file.js) // resolves to root/src of app api.resolve.src(my-file.js) // resolves to root/public of app api.resolve.public(my-image.png) // resolves to root/src-pwa of app api.resolve.pwa(some-file.js) // resolves to root/src-ssr of app api.resolve.ssr(some-file.js) // resolves to root/src-ssg of app api.resolve.ssg(some-file.js) // resolves to root/src-cordova of app api.resolve.cordova(config.xml) // resolves to root/src-electron of app api.resolve.electron(some-file.js) // resolves to root/src-bex of app api.resolve.bex(some-file.js)api.appDir字符串宿主应用根目录的完整路径。等价于api.ctx.appPaths.appDir。输出日志api.loggerapi.logger是限定作用域到当前扩展的日志器。每个方法输出的内容都会带有AE (extId)标签让用户能分辨是哪条扩展打印的哪一行实现见 app-extension/logger.js。api.logger.log(hello) // green-bannered line api.logger.warn(careful) // yellow-bannered warning api.logger.fatal(boom) // red-bannered error; exits with code 1 api.logger.tip(try foo) // TIP-pilled tip line api.logger.info(synced) // INFO-pilled line api.logger.info(synced, SYNC) // custom pill text instead of INFO api.logger.success(built) api.logger.error(oh no) api.logger.warning(hmm) const finish api.logger.progress({ tool: ssg, waitAction: building, doneAction: built }) // ...later finish() // prints the DONE line with elapsed time api.logger.dot // the bullet character the helpers print要点log为绿色横幅行warn为黄色警告fatal为红色错误并以退出码 1 终止进程源码中compatibleWith等失败路径正是调用this.logger.fatal来中断执行info(msg, pill)的第二个参数可自定义标签文字默认INFOprogress({ tool, waitAction, doneAction })返回一个finish()函数调用时打印带耗时的 DONE 行dot是辅助打印所用的圆点字符。环境探测TypeScript、Store 与包管理器api.hasTypescript/** * return {Promiseboolean} host project has TypeScript active or not */ await api.hasTypescript()返回宿主项目是否启用了 TypeScript。底层通过ctx.cacheProxy.getModule(hasTypescript)实现见 BaseAPI.js因此返回的是 Promise。api.getStorePackageName/** * return {pinia|undefined} */ api.getStorePackageName()同步方法。检测宿主项目安装并启用的状态管理包名目前仅可能返回pinia或undefined源码中通过检查pinia包是否可解析来判断。api.getNodePackagerName/** * return {Promisenpm | yarn | pnpm | bun} */ await api.getNodePackagerName()返回宿主项目使用的 Node 包管理器名称可用于决定后续安装依赖时调用的命令。依赖与扩展兼容性检查这一组方法用于在运行期检查宿主项目的依赖状态保证扩展逻辑只在合适的版本上生效。api.compatibleWith确保扩展与宿主项目中的某个包满足给定的 semver 条件。条件不满足时quasar/app-vite会报错并终止执行。/** * param {string} packageName * param {string} semverCondition */ api.compatibleWith(quasar/app-vite, 3.x)更复杂的 semver 示例1.x || 2.5.0 || 5.0.0 - 7.2.3。api.compatibleWith(quasar/app-vite, ^3.0.0)源码实现IndexAPI.js读取宿主项目对应包的package.json若包不存在则fatal(Dependency not found - pkg. Please install it.)若版本不满足 semver 条件则fatal(Not compatible with pkg vver. Required version: cond)。api.hasPackage判断宿主项目是否安装了某个包并可附带 semver 条件做版本校验。/** * param {string} packageName * param {string} (optional) semverCondition * return {boolean} package is installed and meets optional semver condition */ if (api.hasPackage(vuelidate)) { // hey, this app has it (any version of it) } if (api.hasPackage(quasar, ^2.0.0)) { // hey, this app has Quasar UI v2 installed }与compatibleWith的差异hasPackage只返回布尔值不中断执行——适合做分支判断。api.hasExtension检查另一个 App Extension是否已通过 npm 安装并且被 Quasar CLI 调用过即已注册到宿主项目。/** * Check if another app extension is installed * * param {string} extId * return {boolean} has the extension installed invoked */ if (api.hasExtension(extId)) { // hey, we have it }源码通过this.#appExtJson.has(extId)判断IndexAPI.js即查询宿主项目内部维护的扩展清单文件因此只对已被调用过的扩展返回true。api.getPackageVersion获取宿主项目某个包的版本号。/** * param {string} packageName * return {string|undefined} version of apps package */ console.log(api.getPackageVersion(packageName)) // output examples: // 1.1.3 // undefined (when package not found)包未安装时返回undefined源码通过getPackageJson实现见 IndexAPI.js。扩展 Quasar 配置api.extendQuasarConfextendQuasarConf用于扩展宿主项目的quasar.config配置对象。回调可以直接修改传入的conf也可以返回一个新的配置会被合并进默认配置。extendQuasarConf: Callback ( cfg: QuasarConf, api: IndexAPI ) QuasarConf | void | PromiseQuasarConf | void // Example: api.extendQuasarConf((conf, api) { // Do something with quasar.config file. // Optionally, return a config that will be merged // with the default one })回调支持 async/await。注册 boot 与 css 文件经典场景最常见的用途是让扩展的运行时文件进入宿主应用的构建链路import { defineIndexScript } from #q-app export default defineIndexScript(api { api.extendQuasarConf((conf, api) { return { // make sure my-ext boot file is registered boot: [~quasar-app-extension-my-ext/src/runtime/boot.register.js], // make sure my global my-ext css goes through Vite css: [~quasar-app-extension-my-ext/src/runtime/style.sass] } }) // Alternatively, directly touch the conf param api.extendQuasarConf((conf, api) { // make sure my-ext boot file is registered conf.boot.push(~quasar-app-extension-my-ext/src/runtime/boot.register.js) // make sure my global my-ext css goes through Vite conf.css.push(~quasar-app-extension-my-ext/src/runtime/style.sass) }) })[!TIP] 注意路径开头的波浪号~。它告诉 Quasar CLI这是一个指向node_modules中依赖的路径而不是相对于 Index 脚本文件的相对路径。若你的运行时文件就位于扩展包内通常放在src/runtime/下并被package.json的exports暴露就必须使用~前缀。注册自定义 CLI 命令api.registerCommandregisterCommand让扩展注册一个命令随后可在终端中通过quasar run ext-id cmd [...args]调用。/** * param {string} commandName * param {function} fn * (processArgv: string[]) ?Promise */ api.registerCommand(start, processArgv { // do something here // this registers the start command // and this handler is executed when running // quasar run ext-id start })处理函数会收到processArgv字符串数组即命令参数。实际调用链在 run.js 中CLI 通过hooks.commands[cmd]找到处理函数并把process.argv裁剪后传给fn。若扩展没有任何命令直接运行quasar run ext-id会打印命令列表。结合 Node 内置node:util的parseArgs定义和解析参数的示例// import { parseArgs } from node:util api.registerCommand(fun, () { try { const { values, positionals } parseArgs({ options: { name: { type: string, short: n }, debug: { type: boolean } }, strict: true, allowPositionals: true }) console.log(values, positionals) } catch (err) { console.error(err.message) } })注册 Describe APIapi.registerDescribeApiregisterDescribeApi为quasar describe命令注册一个 JSON API 文件使开发者可以用quasar describe MyComponent查看扩展提供的组件/指令/插件的 API 文档。/** * param {string} name * param {string} relativePath * (relative path starting from the file where you have this call) */ api.registerDescribeApi( MyComponent, ./relative/path/to/my/component/file.json )JSON 文件的语法可参考宿主项目中/node_modules/quasar/dist/api下的文件。你的 JSON 必须包含type属性取值为component、directive或plugin{ type: component, props: { }, ... }[!TIP] 更完整的 JSON API 结构规范可参考 Quasar JSON API Schema 一节。 编写后务必用quasar describe命令实测确保语法正确、无报错。从源码看get-api.jsapp-vite/lib/utils/get-api.js在执行quasar describe时会遍历已调用过的扩展读取describeApi注册表。relativePath也支持~前缀——此时表示引用node_modules中的包通过require.resolve解析否则以调用registerDescribeApi的文件的目录为基准解析绝对路径。文件不存在或 JSON 解析失败都会触发fatal。持久化配置get / set / merge扩展可以在宿主项目的内部配置文件中持久化自己的配置跨 dev/build 会话保持。/** * return {object} cfg */ api.getPersistentConf()/** * param {object} cfg */ api.setPersistentConf({ // .... })/** * param {object} cfg */ api.mergePersistentConf({ // .... })getPersistentConf返回扩展的内部持久化配置没有则返回空对象setPersistentConf整体覆盖已存在则直接覆盖mergePersistentConf深合并到现有配置若此前没有配置等价于首次设置源码中使用webpack-merge的merge({}, currentCfg, cfg)见 IndexAPI.js。生命周期钩子dev / build / publish以下钩子都支持 async/await 或直接返回 Promise。api.beforeDev在quasar dev命令运行前执行适合准备外部服务如启动后端或其他应用依赖的服务。/** * param {function} fn * (api, { quasarConf }) ?Promise */ api.beforeDev((api, { quasarConf }) { // do something })api.afterDev在 Quasar dev server 启动后执行quasar dev。此时 dev server 已经可用可以对其进行操作。/** * param {function} fn * (api, { quasarConf }) ?Promise */ api.afterDev((api, { quasarConf }) { // do something })api.beforeBuild在生产构建quasar build前执行。此时 dist 分发目录尚未创建。/** * param {function} fn * (api, { quasarConf }) ?Promise */ api.beforeBuild((api, { quasarConf }) { // do something })api.afterBuild在生产构建完成后执行。此时 dist 分发目录已创建可对其进行读写。/** * param {function} fn * (api, { quasarConf }) ?Promise */ api.afterBuild((api, { quasarConf }) { // do something })api.onPublish当以quasar build -P请求发布时在生产构建完成且afterBuild若指定执行之后运行。/** * param {function} fn * () ?Promise * param {object} opts * * arg - argument supplied to --publish/-P parameter * * distDir - folder where distributables were built */ api.onPublish((api, opts) { // do something })opts.arg是传给--publish/-P的参数例如目标平台标识opts.distDir是构建产物的目录。各模式构建配置扩展extend* 系列Index API 针对每种 Quasar 模式提供了对应的配置扩展钩子每个钩子都支持异步、可直接修改传入参数或返回新配置自动与默认配置合并。下表按模式归纳通用构建Vite/** * Extend the Vite config generated by Quasar CLI. * * Can be async. Can directly modify the config parameter or * return a new one that will be merged with the default one. */ type Callback ( config: ViteUserConfig, invokeParams: { isClient: boolean; isServer: boolean }, api: IndexAPI ) ViteUserConfig | void | PromiseViteUserConfig | void // Example: api.extendViteConf((viteConf, { isClient, isServer }, api) { // add/remove/change Quasar CLI generated Vite config object; // similar in use to /quasar.config build extendViteConf })回调第二参数给出当前构建目标isClient为客户端构建isServer为服务端SSR构建。SSR 模式方法作用版本要求api.extendSSRWebserverConf扩展用于 SSR webserver含 SSR middlewares的 Rolldown 配置通用api.extendSSRPackageJson增删改 SSR 生产构建生成的package.json属性quasar/app-vite v3api.extendSSRManifestJson扩展 Vite 生成的 SSR manifest服务端渲染器据此决定预加载哪些文件quasar/app-vite v3.1api.extendSSRGenerateSWOptions扩展 Workbox GenerateSW 选项叠加在pwa extendPWAGenerateSWOptions()之上quasar/app-vite v3api.extendSSRInjectManifestOptions扩展 Workbox InjectManifest 选项叠加在pwa extendPWAInjectManifestOptions()之上quasar/app-vite v3// Example: extendSSRWebserverConf type Callback ( config: RolldownOptions, api: IndexAPI ) void | RolldownOptions | Promisevoid | RolldownOptions api.extendSSRWebserverConf((rolldownConf, api) { // add/remove/change Quasar CLI generated Rolldown config object; // similar in use to /quasar.config ssr extendSSRWebserverConf })// Example: extendSSRPackageJson type Callback ( pkgJson: { [index in string]: any }, api: IndexAPI ) void | { [index in string]: any } | Promisevoid | { [index in string]: any } api.extendSSRPackageJson((pkgJson, api) { // add/remove/change pkgJson; // similar in use to /quasar.config ssr extendSSRPackageJson })// Example: extendSSRManifestJson type Callback ( ssrManifest: QuasarSsrManifest, api: IndexAPI ) void | QuasarSsrManifest | Promisevoid | QuasarSsrManifest api.extendSSRManifestJson((ssrManifest, api) { // add/remove/change ssrManifest; // similar in use to /quasar.config ssr extendSSRManifestJson })// Example: extendSSRGenerateSWOptions type Callback ( config: GenerateSWOptions, api: IndexAPI ) void | GenerateSWOptions | Promisevoid | GenerateSWOptions api.extendSSRGenerateSWOptions((config, api) { // add/remove/change config; // similar in use to /quasar.config ssr extendSSRGenerateSWOptions })// Example: extendSSRInjectManifestOptions type Callback ( config: InjectManifestOptions, api: IndexAPI ) void | InjectManifestOptions | Promisevoid | InjectManifestOptions api.extendSSRInjectManifestOptions((config, api) { // add/remove/change config; // similar in use to /quasar.config ssr extendSSRInjectManifestOptions })SSG 模式方法作用版本要求api.extendSSGRendererConf扩展用于 SSG 渲染器即/src-ssg/ssg-renderer文件的 Rolldown 配置quasar/app-vite v3.1api.extendSSGManifestJson扩展 Vite 生成的 SSR manifestquasar/app-vite v3.1api.extendSSGGenerateSWOptions扩展 Workbox GenerateSW 选项叠加在 PWA 对应选项之上quasar/app-vite v3.1api.extendSSGInjectManifestOptions扩展 Workbox InjectManifest 选项叠加在 PWA 对应选项之上quasar/app-vite v3.1// Example: extendSSGRendererConf type Callback ( config: RolldownOptions, api: IndexAPI ) void | RolldownOptions | Promisevoid | RolldownOptions api.extendSSGRendererConf((rolldownConf, api) { // add/remove/change Quasar CLI generated Rolldown config object; // similar in use to /quasar.config ssg extendSSGRendererConf })Electron 模式方法作用版本要求api.extendElectronMainConf扩展 electron-main 线程的 Rolldown 配置通用api.extendElectronPreloadConf扩展 electron-preload 线程的 Rolldown 配置通用api.extendElectronPackageJson增删改 Electron 生产构建生成的package.json属性quasar/app-vite v3// Example: extendElectronMainConf type Callback ( config: RolldownOptions, api: IndexAPI ) void | RolldownOptions | Promisevoid | RolldownOptions api.extendElectronMainConf((rolldownConf, api) { // add/remove/change Quasar CLI generated Rolldown config object; // similar in use to /quasar.config electron extendElectronMainConf })PWA 模式方法作用版本要求api.extendPWACustomSWConf扩展自定义 Service WorkerworkboxMode: InjectManifest时的 Rolldown 配置通用api.extendPWAManifestJson动态修改/src-pwa/manifest.jsonquasar/app-vite v3api.extendPWAGenerateSWOptions扩展 Workbox GenerateSW 选项quasar/app-vite v3api.extendPWAInjectManifestOptions扩展 Workbox InjectManifest 选项quasar/app-vite v3// Example: extendPWAManifestJson type Callback ( json: PwaManifestOptions, api: IndexAPI ) void | PwaManifestOptions | Promisevoid | PwaManifestOptions api.extendPWAManifestJson((json, api) { // add/remove/change json; // similar in use to /quasar.config pwa extendPWAManifestJson })BEX浏览器扩展模式方法作用版本要求api.extendBexScriptsConf扩展 bex 脚本background、content scripts、dom script的 Rolldown 配置通用api.extendBexManifestJson动态修改浏览器扩展的 manifest 文件/src-bex/manifest.jsonquasar/app-vite v3// Example: extendBexScriptsConf type Callback ( config: RolldownOptions, api: IndexAPI ) void | RolldownOptions | Promisevoid | RolldownOptions api.extendBexScriptsConf((rolldownConf, api) { // add/remove/change Quasar CLI generated Rolldown config object; // similar in use to /quasar.config bex extendBexScriptsConf })// Example: extendBexManifestJson type Callback ( json: object, api: IndexAPI ) void | object | Promisevoid | object api.extendBexManifestJson((json, api) { // add/remove/change json; // similar in use to /quasar.config bex extendBexManifestJson })源码级原理钩子如何被收集与消费理解 Index API 的底层机制有助于写出正确的扩展。关键实现位于 IndexAPI.js所有extend*、before*、after*、onPublish方法都通过内部私有方法#addHook(name, fn)把{ fn, api, packageDir }推入对应名称的钩子数组IndexAPI.jsregisterCommand直接写入#hooks.commands[commandName]IndexAPI.jsregisterDescribeApi通过getCallerPath(1)记录调用者文件目录callerPath供quasar describe解析相对路径时使用IndexAPI.js脚本执行完毕后CLI 调用受保护的__getHooks(appExtJson)取回全部钩子仅当传入的是同一个appExtJson实例时才返回防止外部误用所有钩子默认按注册顺序执行回调既可返回新配置由 CLI 负责 merge也可就地修改传入对象。整套脚本的加载、版本校验与生命周期在 AppExtensionInstance.js 中完成包括从dist/或src/按扩展名顺序解析脚本#resolveScriptPath见 AppExtensionInstance.js.ts脚本用jiti加载、其余用原生 ESMAppExtensionInstance.js强制默认导出必须为函数AppExtensionInstance.js。TypeScript 用户在 app-extension.d.ts 中可查看IndexAPI的完整类型签名含每个方法参数与返回值的 JSDoc类型由 app-wrappers.d.ts 中的defineIndexScript绑定到回调参数上。实践建议与常见陷阱优先使用~前缀引用扩展包内资源注册 boot/css 或 describe API 时~告诉 CLI 路径来自node_modules避免与扩展包内的相对路径混淆。区分中断与判断compatibleWith不满足会直接 fatal 终止构建适合硬性版本门槛hasPackage/hasExtension返回布尔值适合做可选功能分支。生命周期钩子与 dist 目录的关系beforeBuild时 dist 尚未创建afterBuild时已创建涉及产物读写必须在对应阶段执行onPublish只在quasar build -P时触发。extend回调两种写法等价*直接修改传入参数或返回新配置由 CLI 合并二者不可混用同一份数据的重复操作避免重复注册 boot/css。注册命令后用quasar run实测命令行参数通过processArgv传入建议用parseArgs规范化解析并做好错误捕获。describe API 的 JSON 必须有type字段否则quasar describe无法识别类别务必实测验证语法。持久化配置按 extId 隔离getPersistentConf/setPersistentConf/mergePersistentConf操作的是本扩展自己的命名空间读取不到其他扩展的配置。通过本文的 API 全景与源码佐证你现在可以像 Quasar 官方扩展一样用 Index 脚本把构建配置、运行时注入、CLI 命令与生命周期自动化全部收拢到一个文件里实现安装即生效的深度集成体验。【免费下载链接】quasarQuasar Framework - Build high-performance VueJS user interfaces in record time项目地址: https://gitcode.com/gh_mirrors/qu/quasar创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

程序员转型AI领域的核心能力与六大方向 2026/9/21 0:24:49

程序员转型AI领域的核心能力与六大方向

1. 程序员转型AI领域的时代机遇过去两年,大模型技术以惊人的速度重塑着整个科技行业。作为一名经历过三次技术浪潮的老程序员,我亲眼目睹了移动互联网兴起时那些及时转型的同行如何实现职业生涯的飞跃。如今,AI技术带来的变革机遇比当年更加显…

阅读更多 →
BookStack 便携式 ZIP 导出格式(Portable ZIP File Format)完整解析 2026/9/21 0:24:49

BookStack 便携式 ZIP 导出格式(Portable ZIP File Format)完整解析

后端知识库知识管理文档 【免费下载链接】BookStack NOW MANAGED ON CODEBERG 项目地址: https://gitcode.com/gh_mirrors/bo/BookStack 点击查看 免费下载 导读 BookStack 提供了一种名为 "Portable ZIP"(便携式 ZIP)的导出格式…

阅读更多 →
大语言模型驱动优化建模:双向数据合成框架解析与实战 2026/9/21 0:24:49

大语言模型驱动优化建模:双向数据合成框架解析与实战

1. 为什么LLM-OR方向卡在了“数据”这一步1.1 优化建模:LLM在运筹学里最值得先做的事情先聊个场景。你手里有一份仓储调度的业务描述——货品进库、出库、库存上限、运输车辆的时间窗、每辆车的载重约束,配送成本按照行驶里程计。过去要写出对应的混合整…

阅读更多 →
Apollo Client 查询指南:useQuery 与 useLazyQuery 完整实战手册 2026/9/21 0:24:49

Apollo Client 查询指南:useQuery 与 useLazyQuery 完整实战手册

前端GraphQL 【免费下载链接】apollo-client The industry-leading GraphQL client for TypeScript, JavaScript, React, Vue, Angular, and more. Apollo Client delivers powerful caching, intuitive APIs, and comprehensive developer tools to accelerate your app devel…

阅读更多 →
Zephyr 传感器绑定模块 zsensor 完整指南:在 MicroPython Zephyr 端口中读取与配置传感器 2026/9/21 0:24:49

Zephyr 传感器绑定模块 zsensor 完整指南:在 MicroPython Zephyr 端口中读取与配置传感器

嵌入式语言运行时编程语言解释器编译器物联网系统编程 【免费下载链接】micropython MicroPython - a lean and efficient Python implementation for microcontrollers and constrained systems 项目地址: https://gitcode.com/gh_mirrors/mi/micropython 点击查看…

阅读更多 →
SuperClaude_Framework Confidence Check 技能实战指南:实现前 ≥90% 置信度评估机制全解析 2026/9/21 0:21:48

SuperClaude_Framework Confidence Check 技能实战指南:实现前 ≥90% 置信度评估机制全解析

开发工具CLIAI 技能/插件测试人工智能AI 评测 【免费下载链接】SuperClaude_Framework A configuration framework that enhances Claude Code with specialized commands, cognitive personas, and development methodologies. 项目地址: https://gitcode.com/gh_m…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞