注意,你的脚手架项目文件夹包含一个 /quasar.config
文件。那么你可以通过它配置什么?基本上是 Quasar CLI 为你做的任何事情。
- 你将在你的网站/应用程序中使用的 Quasar 组件、指令和插件
- 默认的 Quasar 语言包
- 图标库 你想使用的
- Quasar 组件的默认 Quasar 图标集
- 开发服务器端口、HTTPS 模式、主机名等等
- CSS 动画 你想使用的
- 引导文件 列表(也决定执行顺序)—— 它们是
/src/boot
中的哪些文件,它们告诉你的应用程序在挂载根 Vue 组件之前是如何初始化的。 - 要包含在捆绑包中的全局 CSS/Sass/… 文件
- SPA、PWA、Electron、Capacitor、Cordova、SSR、BEX(浏览器扩展)配置
- 扩展幕后工具,例如生成的 Vite 配置
- …以及你将在路上发现的许多其他工具
提示
你会注意到,更改这些设置中的任何一个都不需要你手动重新加载开发服务器。Quasar 会检测并重新加载必要的进程。你不会失去开发流程,因为你只需要坐下来,让 Quasar CLI 快速重新加载更改后的代码,甚至保留当前状态。这节省了你大量的时间!
警告
该 /quasar.config
文件由 Quasar CLI 构建系统运行,因此此代码在 Node 下直接运行,而不是在应用程序的上下文中运行。这意味着你可以像 ‘fs’、‘path’、Vite 插件等一样要求模块。确保你想在此文件中使用的 ES 功能是 你的 Node 版本支持的 (应为 >= 14.19.0)。
结构
基础知识
你会注意到,该 /quasar.config
文件导出一个函数,该函数接受一个 ctx
(上下文)参数并返回一个对象。这允许你根据此上下文动态更改你的网站/应用程序配置。
module.exports = function (ctx) { // can be async too
console.log(ctx)
// Example output on console:
/*
{
dev: true,
prod: false,
mode: { spa: true },
modeName: 'spa',
target: {},
targetName: undefined,
arch: {},
archName: undefined,
debug: undefined
}
*/
// context gets generated based on the parameters
// with which you run "quasar dev" or "quasar build"
return {
// ... your config
}
}
这意味着,例如,你可以在构建特定模式(如 PWA)时加载字体,并为其他模式选择另一个字体。
{
extras: [
ctx.mode.pwa // we're adding only if working on a PWA
? 'roboto-font'
: null
]
}
或者,你可以为 SPA 模式使用全局 CSS 文件,为 Cordova 模式使用另一个 CSS 文件,同时避免为其他模式加载任何此类文件。
{
css: [
ctx.mode.spa ? 'app-spa.sass' : null, // looks for /src/css/app-spa.sass
ctx.mode.cordova ? 'app-cordova.sass' : null // looks for /src/css/app-cordova.sass
]
}
或者,你可以配置开发服务器在 SPA 模式下运行在端口 8000 上,在 PWA 模式下运行在端口 9000 上,或在其他模式下运行在端口 9090 上。
{
devServer: {
port: ctx.mode.spa
? 8000
: (ctx.mode.pwa ? 9000 : 9090)
}
}
你还可以返回 quasar 配置之前执行异步工作。
module.exports = async function (ctx) {
const data = await someAsyncFunction()
return {
// ... use "data"
}
}
// or:
module.exports = function (ctx) {
return new Promise(resolve => {
// some async work then:
// resolve() with the quasar config
resolve({
//
})
})
}
可能性是无限的。
IDE 自动完成
你可以用 configure()
辅助函数包装返回的函数,以获得更好的 IDE 自动完成体验(通过 TypeScript)。
const { configure } = require('quasar/wrappers')
module.exports = configure(function (ctx) {
/* configuration options */
})
配置选项
css
/**
* Global CSS/Stylus/SCSS/SASS/... files from `/src/css/`,
* except for theme files, which are included by default.
*/
css?: string[];
示例
{
css: [
'app.sass', // referring to /src/css/app.sass
'~some-library/style.css' // referring to node_modules/some-library/style.css
]
}
boot
更多关于 引导文件。
/** Boot files to load. Order is important. */
boot?: QuasarBootConfiguration;
interface BootConfigurationItem {
path: string;
server?: false;
client?: false;
}
type QuasarBootConfiguration = (string | BootConfigurationItem)[];
preFetch
更多关于 预取功能 页面。
/** Enable the preFetch feature. */
preFetch?: boolean;
eslint已弃用
警告
此属性已被弃用,改为使用 vite-plugin-checker。
更多关于 代码 linter 页面。
extras
/**
* What to import from [@quasar/extras](https://github.com/quasarframework/quasar/tree/dev/extras) package.
* @example ['material-icons', 'roboto-font', 'ionicons-v4']
*/
extras?: (QuasarIconSets | QuasarFonts)[];
framework
/**
* What Quasar language pack to use, what Quasar icon
* set to use for Quasar components, etc.
*/
framework?: QuasarFrameworkConfiguration;
interface QuasarFrameworkConfiguration {
/**
* @see - QuasarConfOptions tab in API cards throughout the docs
*/
config?: SerializableConfiguration<QuasarUIConfiguration>;
/**
* One of the Quasar IconSets
*
* @see https://v2.quasar.dev/options/quasar-icon-sets
*
* @example 'material-icons'
*/
iconSet?: QuasarIconSets;
/**
* One of the Quasar language packs
*
* @see https://v2.quasar.dev/options/quasar-language-packs
*
* @example 'en-US'
* @example 'es'
*/
lang?: QuasarLanguageCodes;
/**
* Quasar CSS addons have breakpoint aware versions of flex and spacing classes
*
* @see https://quasar.org.cn/layout/grid/introduction-to-flexbox#flex-addons
* @see https://quasar.org.cn/style/spacing#flex-addons
*/
cssAddon?: boolean;
/**
* Auto import - how to detect components in your vue files
* "kebab": q-carousel q-page
* "pascal": QCarousel QPage
* "combined": q-carousel QPage
*
* @default 'kebab'
*/
autoImportComponentCase?: "kebab" | "pascal" | "combined";
/**
* Auto import - which file extensions should be interpreted as referring to Vue SFC?
*
* @default ['vue']
*/
autoImportVueExtensions?: string[];
/**
* Auto import - which file extensions should be interpreted as referring to script files?
*
* @default ['js', 'jsx', 'ts', 'tsx']
*/
autoImportScriptExtensions?: string[];
/**
* Treeshake Quasar's UI on dev too?
* Recommended to leave this as false for performance reasons.
*
* @default false
*/
devTreeshaking?: boolean;
/**
* Quasar will auto import components based on your usage.
* But, in case you have a special case, you can manually specify Quasar components to be available everywhere.
*
* An example case would be having custom component definitions with plain string templates, inside .js or .ts files,
* in which you are using Quasar components (e.g. q-avatar).
*
* Another example would be that dynamically rendering components depending on an API response or similar (e.g. in a CMS),
* something like `<component :is="dynamicName">` where `dynamicName` is a string that matches a Quasar component name.
*
* @example ['QAvatar', 'QChip']
*/
components?: (keyof QuasarComponents)[];
/**
* Quasar will auto import directives based on your usage.
* But, in case you have a special case, you can manually specify Quasar directives to be available everywhere.
*
* An example case would be having custom component definitions with plain string templates, inside .js or .ts files,
* in which you are using Quasar directives (e.g. v-intersection).
*
* @example ['Intersection', 'Mutation']
*/
directives?: (keyof QuasarDirectives)[];
/**
* Quasar plugins to be installed. Specify the ones you are using in your app.
*
* @example ['Notify', 'Loading', 'Meta', 'AppFullscreen']
*/
plugins?: (keyof QuasarPlugins)[];
}
请参阅以下参考资料以了解更多信息
animations
更多关于 CSS 动画。
/**
* What Quasar CSS animations](/options/animations) to import.
* @example [ 'bounceInLeft', 'bounceOutRight' ]
* */
animations?: QuasarAnimationsConfiguration | 'all';
devServer
更多信息:Vite 服务器选项
import { ServerOptions as ViteServerOptions } from "vite";
import { Options as OpenOptions } from "open";
type DevServerOptions = Omit<ViteServerOptions, "open"> & {
open?: Omit<OpenOptions, "wait"> | boolean;
};
/**
* Vite "server" options.
* Some properties are overwritten based on the Quasar mode you're using in order
* to ensure a correct config.
* Note: if you're proxying the development server (i.e. using a cloud IDE),
* set the `public` setting to your public application URL.
*/
devServer?: DevServerOptions;
除了这些选项之外,Quasar CLI 还会篡改一些选项,你将体验到与 Vite 应用程序不同的体验。
使用 open
属性用特定浏览器打开,而不是用你操作系统的默认浏览器打开(查看 支持的值)。你应该用 quasar.config 文件 > devSever > open 配置先前链接中描述的 options
参数。一些例子
// opens Google Chrome
devServer: {
open: {
app: { name: 'google chrome' }
}
}
// opens Firefox
devServer: {
open: {
app: { name: 'firefox' }
}
}
// opens Google Chrome and automatically deals with cross-platform issues:
const open = require('open')
devServer: {
open: {
app: { name: open.apps.chrome }
}
}
你还可以配置自动打开远程 Vue Devtools
devServer: {
vueDevtools: true
}
构建
/** Build configuration options. */
build?: QuasarBuildConfiguration;
import { Plugin, UserConfig as ViteUserConfig } from "vite";
import { Options as VuePluginOptions } from "@vitejs/plugin-vue"
interface InvokeParams {
isClient: boolean;
isServer: boolean;
}
interface BuildTargetOptions {
/**
* @default ['es2022', 'firefox115', 'chrome115', 'safari14']
*/
browser?: string[];
/**
* @example 'node20'
*/
node: string;
}
interface PluginEntryRunOptions {
server?: boolean;
client?: boolean;
}
/* requires @quasar/app-vite 1.8+ */
type PluginEntry =
| [pluginName: string, options?: any, runOptions?: PluginEntryRunOptions]
| [pluginFactory: (options?: any) => Plugin, options?: any, runOptions?: PluginEntryRunOptions]
| Plugin
| null
| undefined
| false;
interface QuasarStaticBuildConfiguration {
/**
* @example
* {
* browser: ['es2022', 'firefox115', 'chrome115', 'safari14'],
* node: 'node20'
* }
*/
target?: BuildTargetOptions;
/**
* Extend Vite config generated by Quasar CLI.
*/
extendViteConf?: (
config: ViteUserConfig,
invokeParams: InvokeParams
) => void;
/**
* Options to supply to @vitejs/plugin-vue
*
* @see https://v2.quasar.dev/quasar-cli-vite/handling-vite#vite-vue-plugin-options
*/
viteVuePluginOptions?: VuePluginOptions;
/**
* Vite plugins
*
* @see https://v2.quasar.dev/quasar-cli-vite/handling-vite#adding-vite-plugins
*
* @example
* [
* [ 'package-name', { ..options.. } ],
* [ require('some-plugin'), { ...options... } ]
* ]
*/
vitePlugins?: PluginEntry[];
/**
* @see https://v2.quasar.dev/quasar-cli-vite/handling-vite#folder-aliases
*
* @example
* {
* // import { ... } from 'locales/...'
* locales: path.join(__dirname, 'src/locales')
* }
*/
alias?: { [key: string]: string };
/**
* Public path of your app.
* Use it when your public path is something else,
* like _“<protocol>://<domain>/some/nested/folder”_ – in this case,
* it means the distributables are in _“some/nested/folder”_ on your webserver.
*
* @default '/'
*/
publicPath?: string;
/**
* Sets [Vue Router mode](https://router.vuejs.ac.cn/guide/essentials/history-mode.html).
* History mode requires configuration on your deployment web server too.
*
* @default 'hash'
*/
vueRouterMode?: "hash" | "history";
/**
* Sets Vue Router base.
* Should not need to configure this, unless absolutely needed.
*/
vueRouterBase?: string;
/**
* Automatically open remote Vue Devtools when running in development mode.
*/
vueDevtools?: boolean;
/**
* Should the Vue Options API be available? If all your components only use Composition API
* it would make sense performance-wise to disable Vue Options API for a compile speedup.
*
* @default true
*/
vueOptionsAPI?: boolean;
/**
* Should we invalidate the Vite and ESLint cache on startup?
* @default false
*/
rebuildCache?: boolean;
/**
* Do you want to analyze the production bundles?
* Generates and opens an HTML report.
*
* @default false
*/
analyze?: boolean;
/**
* Folder where Quasar CLI should generate the distributables.
* Relative path to project root directory.
*
* @default 'dist/{ctx.modeName}' For all modes except Cordova.
* @default 'src-cordova/www' For Cordova mode.
*/
distDir?: string;
/**
* Add properties to `process.env` that you can use in your website/app JS code.
*
* @see https://v2.quasar.dev/quasar-cli-vite/handling-process-env
*
* @example { SOMETHING: 'someValue' }
*/
env?: { [index: string]: string };
/**
* Defines constants that get replaced in your app.
*
* @example { SOMETHING: JSON.stringify('someValue') } -> console.log(SOMETHING) // console.log('someValue')
*/
rawDefine?: { [index: string]: string };
/**
* (requires @quasar/app-vite v1.1+)
*
* Build production assets with or without the hash part in filenames.
* Example: "454d87bd" in "assets/index.454d87bd.js"
*
* When used, please be careful how you configure your web server cache strategy as
* files will not change name so your client might get 304 (Not Modified) even when
* it's not the case.
*
* Will not change anything if your Vite config already touches the
* build.rollupOptions.output.entryFileNames/chunkFileNames/assetFileNames props.
*
* Gets applied to production builds only.
*
* Useful especially for (but not restricted to) PWA. If set to false then updating the
* PWA will force to re-download all assets again, regardless if they were changed or
* not (due to how Rollup works through Vite).
*
* @default true
*/
useFilenameHashes?: boolean;
/**
* whether to inject module preload polyfill.
* @default false
*/
polyfillModulePreload?: boolean;
/**
* Ignores the public folder.
* @default false
*/
ignorePublicFolder?: boolean;
/**
* Set to `false` to disable minification, or specify the minifier to use.
* Available options are 'terser' or 'esbuild'.
* If set to anything but boolean false then it also applies to CSS.
* For production only.
* @default 'esbuild'
*/
minify?: boolean | 'terser' | 'esbuild';
/**
* (requires @quasar/app-vite v1.5.2+)
*
* Minification options for html-minifier.
*
* @see https://github.com/terser/html-minifier-terser?tab=readme-ov-file#options-quick-reference for complete list of options
*
* @default
* {
* removeComments: true,
* collapseWhitespace: true,
* removeAttributeQuotes: true,
* collapseBooleanAttributes: true,
* removeScriptTypeAttributes: true
* }
*/
htmlMinifyOptions?: HtmlMinifierOptions;
/**
* If `true`, a separate sourcemap file will be created. If 'inline', the
* sourcemap will be appended to the resulting output file as data URI.
* 'hidden' works like `true` except that the corresponding sourcemap
* comments in the bundled files are suppressed.
* @default false
*/
sourcemap?: boolean | 'inline' | 'hidden';
/**
* Prepare external services before `$ quasar dev` command runs
* like starting some backend or any other service that the app relies on.
* Can use async/await or directly return a Promise.
*/
beforeDev?: (params: QuasarHookParams) => void;
/**
* Run hook after Quasar dev server is started (`$ quasar dev`).
* At this point, the dev server has been started and is available should you wish to do something with it.
* Can use async/await or directly return a Promise.
*/
afterDev?: (params: QuasarHookParams) => void;
/**
* Run hook before Quasar builds app for production (`$ quasar build`).
* At this point, the distributables folder hasn’t been created yet.
* Can use async/await or directly return a Promise.
*/
beforeBuild?: (params: QuasarHookParams) => void;
/**
* Run hook after Quasar built app for production (`$ quasar build`).
* At this point, the distributables folder has been created and is available
* should you wish to do something with it.
* Can use async/await or directly return a Promise.
*/
afterBuild?: (params: QuasarHookParams) => void;
/**
* Run hook if publishing was requested (`$ quasar build -P`),
* after Quasar built app for production and the afterBuild hook (if specified) was executed.
* Can use async/await or directly return a Promise.
* `opts` is Object of form `{arg, distDir}`,
* where “arg” is the argument supplied (if any) to -P parameter.
*/
onPublish?: (ops: { arg: string; distDir: string }) => void;
}
请参阅以下参考资料以了解更多信息
sourceFiles
sourceFiles?: QuasarSourceFilesConfiguration;
/**
* Use this property to change the default names of some files of your website/app if you have to.
* All paths must be relative to the root folder of your project.
*
* @default
* {
* rootComponent: 'src/App.vue',
* router: 'src/router/index',
* store: 'src/stores/index', // for Pinia
* // store: 'src/store/index' // for Vuex
* pwaRegisterServiceWorker: 'src-pwa/register-service-worker',
* pwaServiceWorker: 'src-pwa/custom-service-worker',
* pwaManifestFile: 'src-pwa/manifest.json',
* electronMain: 'src-electron/electron-main',
* electronPreload: 'src-electron/electron-preload'
* }
*/
interface QuasarSourceFilesConfiguration {
rootComponent?: string;
router?: string;
store?: string;
pwaRegisterServiceWorker?: string;
pwaServiceWorker?: string;
pwaManifestFile?: string;
electronMain?: string;
electronPreload?: string;
}
htmlVariables
/** Add variables that you can use in /index.html. */
htmlVariables?: Record<string, any>;
你可以定义然后在 /index.html
中引用变量,例如
module.exports = function (ctx) {
return {
htmlVariables: {
myVar: 'some-content'
}
}
}
然后,例如
<%= myVar %>
<% if (myVar) { %>something<% } %>
另一个例子
module.exports = function (ctx) {
return {
htmlVariables: {
title: 'test name',
some: {
prop: 'my-prop'
}
}
}
}
然后,例如
<%= title %>
<%= some.prop %>
<% if (some.prop) { %><%= title %><% } %>
Quasar 模式特定
属性 | 类型 | 描述 |
---|---|---|
cordova | Object | Cordova 特定 配置。 |
capacitor | Object | Quasar CLI Capacitor 特定 配置。 |
pwa | Object | PWA 特定 配置。 |
ssr | Object | SSR 特定 配置。 |
electron | Object | Electron 特定 配置。 |
bex | Object | BEX 特定 配置。 |
例子
为开发/构建设置环境
请参考我们文档中的 添加到 process.env 部分。
添加 Vite 插件
请参考 处理 Vite 页面。