应用扩展初始化 API

此页面介绍 src/index.js 文件,该文件在执行 quasar devquasar build 时被调用。这是一个主要的过程,您可以在其中修改构建以满足应用扩展的需求。例如,注册引导文件、修改 webpack 过程、注册 CSS、注册 UI 组件、注册 Quasar CLI 命令等。

基本结构示例:

// 可以是异步的
export default function (api) {
  // 下面描述了 "api" 对象的属性和方法
}

api.ctx

/quasar.config 文件中的 ctx 相同。帮助您根据 quasar devquasar build 运行的上下文做出决策。

示例:如果仅在 electron 模式下运行,则可以使用其中一个 api 方法。

if (api.ctx.dev === true && api.ctx.mode.electron === true) {
  api.beforeDev((api) => {
    // 在运行 quasar dev 且处于 Electron 模式时执行某些操作
  })
}

api.engine

包含正在使用的 Quasar CLI 引擎名(字符串)。示例:@quasar/app-vite@quasar/app-webpack

api.hasVite

布尔值 - 是否在 @quasar/app-vite 上运行。

api.hasWebpack

布尔值 - 是否在 @quasar/app-webpack 上运行。

api.extId

包含此应用扩展的 ext-id(字符串)。

api.prompts

是一个包含在扩展时的提示答案的对象。有关提示的更多信息,请参阅 Prompts API

api.resolve

在运行此应用扩展的应用程序内解析路径。消除了导入 path 并自行解析路径的需求。

// 解析到应用程序的根目录
api.resolve.app('src/my-file.js')

// 解析到应用程序/src目录
api.resolve.src('my-file.js')

// 解析到应用程序/public目录
// (@quasar/app-webpack v3.4+ 或 @quasar/app-vite v1+)
api.resolve.public('my-image.png')

// 解析到应用程序/src-pwa目录
api.resolve.pwa('some-file.js')

// 解析到应用程序/src-ssr目录
api.resolve.ssr('some-file.js')

// 解析到应用程序/src-cordova目录
api.resolve.cordova('config.xml')

// 解析到应用程序/src-electron目录
api.resolve.electron('some-file.js')

// 解析到应用程序/src-bex目录
api.resolve.bex('some-file.js')

api.appDir

包含此扩展正在运行的宿主应根目录的完整路径(字符串)。

api.hasTypescript
@quasar/app-vite 1.6+
@quasar/app-webpack 3.11+

/**
 * @return {Promise<boolean>} 宿主项目是否启用 TypeScript
 */
await api.hasTypescript()

api.hasLint
@quasar/app-vite 1.6+
@quasar/app-webpack 3.11+

/**
 * @return {Promise<boolean>} 宿主项目是否启用 ESLint
 */
await api.hasLint()

api.getStorePackageName
@quasar/app-vite 1.6+
@quasar/app-webpack 3.11+

/**
 * @return {Promise<string|undefined>} 'pinia' | 'vuex' | undefined
 */
await api.getStorePackageName()

api.getNodePackagerName
@quasar/app-vite 1.6+
@quasar/app-webpack 3.11+

/**
 * @return {Promise<string|undefined>} 'npm' | 'yarn' | 'pnpm'
 */
await api.getNodePackagerName()

api.compatibleWith

通过 semver 条件确保扩展与宿主应用程序中安装的程序包兼容。

如果不满足semver条件,则 Quasar CLI 会出错并停止执行。

semver 条件示例:'1.x || >=2.5.0 || 5.0.0 - 7.2.3'

/**
 * @param {string} packageName
 * @param {string} semverCondition
 */
api.compatibleWith(packageName, '1.x')
// 更复杂的例子:
if (api.hasVite === true) {
  api.compatibleWith('@quasar/app-vite', '^1.0.0-beta.0')
}
else {
  api.compatbileWith('@quasar/app-webpack', '^3.4.0')
}

api.hasPackage

检查宿主应用是否安装了某个包,并且可以通过 semver 条件设置版本。

semver 条件示例:'1.x || >=2.5.0 || 5.0.0 - 7.2.3'

/**
 * @param {string} packageName
 * @param {string} (可选) semver 条件
 * @return {boolean} 软件包已安装并满足可选的 semver 条件
 */
if (api.hasPackage('vuelidate')) {
  // 应用安装了这个包(任何版本)
}
if (api.hasPackage('quasar', '^2.0.0')) {
  // 应用安装了 quasar v2
}

api.hasExtension

检查另一个应用扩展是否通过 npm 安装并由 Quasar CLI 调用。

/**
 * 检查另一个应用扩展是否已安装
 *
 * @param {string} extId
 * @return {boolean} 扩展已安装并被调用
 */
if (api.hasExtension(extId)) {
  // 是的,我们安装了它
}

api.getPackageVersion

获取宿主应用的版本号

/**
 * @param {string} packageName
 * @return {string|undefined} 应用程序包的版本
 */
console.log(api.getPackageVersion(packageName))
// 输出示例:
//   1.1.3
//   undefined(未找到包时)

api.extendQuasarConf

扩展 quasar.config 文件

/**
 * @param {function} fn
 *   (cfg: Object, ctx: Object) => undefined
 */
api.extendQuasarConf ((conf, api) => {
  // 可以在此对 quasar.config 增加,修改任何事情
})
// 一个更复杂的列子:
api.extendQuasarConf ((conf, api) => {
  if (api.hasVite === true) {
    // 只针对 @quasar/app-vite
  }
  else { // api.hasWebpack === true
    // 只针对 @quasar/app-webpack
  }
})

注册启动文件和 css 文件

export default function (api, ctx) {
  api.extendQuasarConf((conf, api) => {
    // 确保 my-ext 启动文件已注册
    conf.boot.push('~quasar-app-extension-my-ext/src/boot/my-ext-bootfile.js')

    if (api.hasVite !== true) {
      // 确保启动文件进行转译
      conf.build.transpileDependencies.push(/quasar-app-extension-my-ext[\\/]src[\\/]boot/)
      // 如果启动文件导入了任何内容,请确保上述正则表达式也匹配这些文件!
    }

    // 确保 my-ext 样式经过 webpack 处理
    conf.css.push('~quasar-app-extension-my-ext/src/component/my-ext.sass')
  })
}

TIP

注意路径前的波浪符(~)。这告诉 Quasar CLI 该路径是来自 node_modules 的依赖项,而不是相对于 App Extension 索引脚本文件的相对路径。

api.registerCommand

注册一个命令,将作为 quasar run <ext-id> <cmd> [args](或简写形式:quasar <ext-id> <cmd> [args])可用。

/**
 * @param {string} commandName
 * @param {function} fn
 *   ({ args: [ string, ... ], params: {object} }) => ?Promise
 */
api.registerCommand('start', ({ args, params }) => {
  // 在这里执行一些操作

  // 这注册了 "start" 命令
  // 当运行 $ quasar run <ext-id> start 时执行此处理程序
})

api.registerDescribeApi

$ quasar describe 命令注册一个 API 文件。

/**
 * @param {string} name
 * @param {string} relativePath
 *   (相对路径,相对于调用此函数的文件)
 */
api.registerDescribeApi(
  'MyComponent',
  './relative/path/to/my/component/file.json'
)

然后可以响应 $ quasar describe MyComponent

有关这样一个 JSON 文件的语法,请查看 /node_modules/quasar/dist/api(在项目文件夹中)。请注意,JSON 必须包含一个 type 属性(“component”、“directive”、“plugin”)。例如:

{
  "type": "component",
  "props": {
  },
  ...
}

TIP

始终使用 quasar describe 命令进行测试,以确保语法正确且没有错误。

api.getPersistentConf

获取此扩展的内部持久配置。如果没有配置,则返回空对象。

/**
 * @return {object} cfg
 */
api.getPersistentConf()

api.setPersistentConf

设置此扩展的内部持久配置。如果已存在,则会被覆盖。

/**
 * @param {object} cfg
 */
api.setPersistentConf({
  // ....
})

api.mergePersistentConf

深度合并到此扩展的内部持久配置。如果扩展尚未设置任何配置,则这实质上等同于首次设置。

/**
 * @param {object} cfg
 */
api.mergePersistentConf({
  // ....
})

api.beforeDev

在运行 $ quasar dev 命令之前被调用的钩子,例如,您可以在此时启动后端或应用依赖的任何其他服务。

可以使用 async/await 或直接返回 Promise。

/**
 * @param {function} fn
 *   (api, { quasarConf }) => ?Promise
 */
api.beforeDev((api, { quasarConf }) => {
  // 执行某些操作
})

api.afterDev

在 Quasar 开发服务器启动后($ quasar dev)运行钩子。此时,开发服务器已启动,并且可用于执行其他操作。

可以使用 async/await 或直接返回 Promise。

/**
 * @param {function} fn
 *   (api, { quasarConf }) => ?Promise
 */
api.afterDev((api, { quasarConf }) => {
  // 执行某些操作
})

api.beforeBuild

在 Quasar 为生产构建应用程序之前运行钩子($ quasar build)。此时,尚未创建分发文件夹。

可以使用 async/await 或直接返回 Promise。

/**
 * @param {function} fn
 *   (api, { quasarConf }) => ?Promise
 */
api.beforeBuild((api, { quasarConf }) => {
  // 执行某些操作
})

api.afterBuild

在 Quasar 为生产构建应用程序后运行钩子($ quasar build)。此时,分发文件夹已创建并可供执行其他操作。

可以使用 async/await 或直接返回 Promise。

/**
 * @param {function} fn
 *   (api, { quasarConf }) => ?Promise
 */
api.afterBuild((api, { quasarConf }) => {
  // 执行某些操作
})

api.onPublish

如果运行了发布命令($ quasar build -P),在 Quasar 为生产构建应用程序后以及执行了 afterBuild 钩子后运行的钩子。

可以使用 async/await 或直接返回 Promise。

/**
 * @param {function} fn
 *   () => ?Promise
 * @param {object} opts
 *   * arg - 提供给 "--publish" 或 "-P" 参数的参数
 *   * distDir - 构建分发文件的文件夹
 */
api.onPublish((api, opts) => {
  // 执行某些操作
})

仅适用于 @quasar/app-vite

api.extendViteConf

/**
 * @param {function} fn
 *   (viteConf: Object, invoke: Object {isClient, isServer}, api) => undefined
 */
if (api.hasVite === true) {
  api.extendViteConf((viteConf, { isClient, isServer }, api) => {
    // 添加/删除/更改由 Quasar CLI 生成的 Vite 配置对象
  })
}

api.extendSSRWebserverConf

/**
 * @param {function} fn
 *   (esbuildConf: Object, api

) => undefined
 */
if (api.hasVite === true) {
  api.extendSSRWebserverConf((esbuildConf, api) => {
    // 添加/删除/更改由 Quasar CLI 生成的用于 SSR webserver 的 esbuild 配置对象(包括 SSR 中间件)
  })
}

api.extendElectronMainConf

/**
 * @param {function} fn
 *   (esbuildConf: Object, api) => undefined
 */
if (api.hasVite === true) {
  api.extendElectronMainConf((esbuildConf, api) => {
    // 添加/删除/更改由 Quasar CLI 生成的用于 SSR webserver 的 esbuild 配置对象(包括 SSR 中间件)
  })
}

api.extendElectronPreloadConf

/**
 * @param {function} fn
 *   (esbuildConf: Object, api) => undefined
 */
if (api.hasVite === true) {
  api.extendElectronPreloadConf((esbuildConf, api) => {
    // 添加/删除/更改由 Quasar CLI 生成的用于 SSR webserver 的 esbuild 配置对象(包括 SSR 中间件)
  })
}

api.extendPWACustomSWConf

/**
 * @param {function} fn
 *   (esbuildConf: Object, api) => undefined
 */
if (api.hasVite === true) {
  api.extendPWACustomSWConf((esbuildConf, api) => {
    // 添加/删除/更改由 Quasar CLI 生成的用于 SSR webserver 的 esbuild 配置对象(包括 SSR 中间件)
  })
}

api.extendBexScriptsConf

/**
 * @param {function} fn
 *   (esbuildConf: Object, api) => undefined
 */
if (api.hasVite === true) {
  api.extendBexScriptsConf((esbuildConf, api) => {
    // 添加/删除/更改由 Quasar CLI 生成的用于 SSR webserver 的 esbuild 配置对象(包括 SSR 中间件)
  })
}

仅适用于 @quasar/app-webpack

api.chainWebpack

链 webpack 配置

/**
 * @param {function} fn
 *   (chain: ChainObject, invoke: Object {isClient, isServer}, api) => undefined
 */
if (api.hasWebpack === true) {
  api.chainWebpack((chain, { isClient, isServer }, api) => {
    // 添加/删除/更改链 (Webpack chain Object)
  })
}

配置是一个 Webpack chain Object。有关其 API 的信息,请参阅 webpack-chain 文档。

api.extendWebpack

扩展 webpack 配置

/**
 * @param {function} fn
 *   (cfg: Object, invoke: Object {isClient, isServer}, api) => undefined
 */
if (api.hasWebpack === true) {
  api.extendWebpack((cfg, { isClient, isServer }, api) => {
    // 添加/删除/更改 cfg(Webpack 配置 Object)
  })
}

api.chainWebpackMainElectronProcess

electron 主进程的 webpack 链式配置

/**
 * @param {function} fn
 *   (chain: ChainObject) => undefined
 */
if (api.hasWebpack === true) {
  api.chainWebpackMainElectronProcess((chain, { isClient, isServer }, api) => {
    // 添加/删除/更改链(Webpack chain Object)
  })
}

api.extendWebpackMainElectronProcess

扩展 electron 主进程的 webpack 配置对象

/**
 * @param {function} fn
 *   (cfg: Object) => undefined
 */
if (api.hasWebpack === true) {
  api.extendWebpackMainElectronProcess((cfg, { isClient, isServer }, api) => {
    // 添加/删除/更改 cfg(Webpack 配置 Object)
  })
}

api.chainWebpackPreloadElectronProcess

electron 链预加载进程的 webpack 链式配置

/**
 * @param {function} fn
 *   (chain: ChainObject) => undefined
 */
if (api.hasWebpack === true) {
  api.chainWebpackPreloadElectronProcess((chain, { isClient, isServer }, api) => {
    // 添加/删除/更改链(Webpack chain Object)
  })
}

api.extendWebpackPreloadElectronProcess

扩展 electron 预加载进程的 webpack 配置对象

/**
 * @param {function} fn
 *   (cfg: Object) => undefined
 */
if (api.hasWebpack === true) {
  api.extendWebpackPreloadElectronProcess((cfg, { isClient, isServer }, api) => {
    // 添加/删除/更改 cfg(Webpack 配置 Object)
  })
}

api.chainWebpackWebserver

SSR webserver 的 webpack 链式配置(包括 /src-ssr/middlewares 中的 SSR 中间件)

/**
 * @param {function} fn
 *   (chain: ChainObject) => undefined
 */
if (api.hasWebpack === true) {
  api.chainWebpackWebserver ((chain, { isClient, isServer }, api) => {
    // 添加/删除/更改链(Webpack chain Object)
    // isClient 总是 "false",isServer 总是 "true"
  })
}

api.extendWebpackWebserver

扩展 SSR webserver 的 webpack 配置对象(包括 /src-ssr/middlewares 中的 SSR 中间件)

/**
 * @param {function} fn
 *   (cfg: Object) => undefined
 */
if (api.hasWebpack === true) {
  api.extendWebpackWebserver((cfg, { isClient, isServer }, api) => {
    // 添加/删除/更改 cfg(Webpack 配置 Object)
    // isClient 总是 "false",isServer 总是 "true"
  })
}

api.chainWebpackCustomSW

使用 InjectManifest 时用于自定义服务工作器的 webpack 链式配置(/src-pwa/custom-service-worker.js 中的内容):

/**
 * @param {function} fn
 *   (cfg: ChainObject) => undefined
 */
if (api.hasWebpack === true) {
  api.chainWebpackCustomSW ((cfg, { isClient, isServer }, api) => {
    // 添加/删除/更改 cfg(Webpack chain Object)
  })
}

api.extendWebpackCustomSW

扩展使用 InjectManifest 时用于自定义服务工作器的 webpack 配置对象(/src-pwa/custom-service-worker.js 中的内容):

/**
 * @param {function} fn
 *   (cfg: Object) => undefined
 */
if (api.hasWebpack === true) {
  api.extendWebpackCustomSW((cfg, { isClient, isServer }, api) => {
    // 添加/删除/更改 cfg(Webpack 配置对象)
  })
}