本页面介绍 /ae/src/uninstall.js|ts 文件,它在 App Extension 被卸载时执行。并非所有 App Extension 都需要 uninstall 脚本——这是一个可选步骤。
文件的基本结构示例:
import { defineUninstallScript } from '#q-app'
// can be async
export default defineUninstallScript((/* api */) => {})content_paste
API 参数
api.ctx
与 /quasar.config 文件中的 ctx 相同。
{
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',
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,
cordova: (...paths) => theAbsolutePathToAppSrcCordovaDir,
capacitor: (...paths) => theAbsolutePathToAppSrcCapacitorDir,
electron: (...paths) => theAbsolutePathToAppSrcElectronDir,
bex: (...paths) => theAbsolutePathToAppSrcBexDir
}
}
}content_paste
api.extId
包含此 App Extension 的 ext-id(字符串)。
api.prompts
一个对象,包含此 App Extension 安装时用户对提示问题的回答。更多关于 prompts 的信息,请参考 Prompts API。
api.resolve
解析运行此 App Extension 的应用中的路径。无需自己导入 path 并解析路径。
// 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-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')content_paste
api.appDir
包含运行此 App Extension 的应用根目录的完整路径(字符串)。
api.logger
一个作用域为当前 App Extension 的日志工具。每个方法的输出都会标记 AE (<extId>),方便用户识别哪行日志来自哪个扩展。
api.logger.log('hello') // 绿色横幅行
api.logger.warn('careful') // 黄色横幅警告
api.logger.fatal('boom') // 红色横幅错误;以退出码 1 退出
api.logger.tip('try foo') // TIP 标签提示行
api.logger.info('synced') // INFO 标签行
api.logger.info('synced', 'SYNC') // 自定义标签文本替代 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'
})
// ...稍后
finish() // 打印 DONE 行及耗时
api.logger.dot // 辅助方法打印的圆点字符content_paste
api.hasTypescript
/**
* @return {Promise<boolean>} host project has TypeScript active or not
*/
await api.hasTypescript()content_paste
api.getStorePackageName
/**
* @return {Promise<string|undefined>} 'pinia' | 'vuex' | undefined
*/
await api.getStorePackageName()content_paste
api.getNodePackagerName
/**
* @return {Promise<'npm' | 'yarn' | 'pnpm' | 'bun'>}
*/
await api.getNodePackagerName()content_paste
api.hasPackage
通过 semver 条件判断宿主应用中是否安装了某个包。
semver 条件示例:'1.x || >=2.5.0 || 5.0.0 - 7.2.3'。
/**
* @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
}content_paste
api.hasExtension
检查另一个 app extension 是否已安装。
/**
* Check if another app extension is installed
*
* @param {string} extId
* @return {boolean} has the extension installed.
*/
if (api.hasExtension(extId)) {
// hey, we have it
}content_paste
api.getPackageVersion
获取宿主应用中某个包的版本。
/**
* @param {string} packageName
* @return {string|undefined} version of app's package
*/
console.log(api.getPackageVersion(packageName))
// output examples:
// 1.1.3
// undefined (when package not found)content_paste
api.removePath
从应用项目目录中删除一个文件或文件夹(该文件/文件夹由 App Extension 安装且不再需要)。
请谨慎操作,不要删除会破坏开发者应用的文件。
文件或文件夹的路径需要相对于项目根目录。
/**
* @param {string} __path
*/
api.removePath('my-folder')content_paste
上面的示例从应用根目录删除 “my-folder”。
api.getPersistentConf
获取此扩展的内部持久化配置。如果没有则返回空对象。
/**
* @return {object} cfg
*/
api.getPersistentConf()content_paste
api.onExitLog
添加一条消息,在 App CLI 完成卸载 App Extension 即将退出时打印。可以多次调用以注册多条退出日志。
/**
* @param {string} msg
*/
api.onExitLog('Thanks for having used my extension')content_paste