Quasar在它的引擎下使用了一些很棒的开发工具,比如Webpack。 Quasar的一大优点是它可以为您处理底层工具所需的大多数复杂配置。 因此,您甚至无需了解Webpack或任何其他开发工具即可使用Quasar。
那么你可以通过/quasar.config.js来配置什么?
- 您将在您的网站/应用程序中使用的Quasar组件、指令和插件
- 默认的Quasar语言包
- 你想使用的图标库
- Quasar组件的默认的Quasar图标集
- 开发服务器端口、HTTPS模式、主机名等
- 你想使用的CSS动画
- 启动文件 列表(也决定了执行顺序) - 这是
/src/boot中的文件,告诉你在安装根Vue组件之前如何初始化应用程序 - bundle中包含的全局CSS/Sass/…文件
- PWA manifest 和 Workbox选项
- Electron打包器 和/或 Electron构建器
- 扩展的Webpack配置
TIP
您会注意到,更改任何这些设置不需要您手动重新加载开发服务器。 Quasar检测是否可以通过热模块更换 注入更改,如果不能,则会自动重新加载开发服务器。 您不会丢失开发流程,因为您只需坐等Quasar CLI快速重新加载更改的代码,甚至保持当前状态。 这节省了大量的时间!
WARNING
/quasar.config.js由Quasar CLI构建系统运行,因此这些配置代码直接在Node下运行,而不是在应用程序的上下文中运行。这意味着你可以导入像’fs’,‘path’,'webpack’等模块。确保您在此文件编写的ES6功能受安装的Node版本(应该>=8.9.0)支持。
结构
基础
您会注意到/quasar.config.js会导出一个函数,该函数接受ctx(context)参数并返回一个对象。这使您可以根据此上下文动态更改您的网站/应用配置:
module.exports = function (ctx) { // 也可以是异步的 console.log(ctx) // 输出到控制台的例子: { dev: true, prod: false, mode: { spa: true }, modeName: 'spa', target: {}, targetName: undefined, arch: {}, archName: undefined, debug: undefined } // 根据这些参数上下文将会被创建 // 当你运行"quasar dev"或"quasar build"时 } 这意味着,作为一个例子,您可以在构建特定模式(如PWA)时加载字体,并为其他模式选择另一个:
module.exports = function (ctx) { extras: [ ctx.mode.pwa // we're adding only if working on a PWA ? 'roboto-font' : null ] } 或者,您可以使用一个全局CSS文件用于SPA模式,使用另一个用于Cordova模式,同时避免为其他模式加载任何此类文件。
module.exports = function (ctx) { 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 ] } 或者,您可以将开发服务器配置为在端口8000上运行SPA模式,在端口9000上运行PWA模式或在端口9090上运行其他模式:
module.exports = function (ctx) { 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 autocompletion
可以用configure()助手包装返回的函数,以获得更好的IDE自动完成体验(通过Typescript):
const { configure } = require('quasar/wrappers') module.exports = configure(function (ctx) { /* configuration options */ }) 配置选项
让我们逐个采取每个选项:
| 属性 | 类型 | 描述 |
|---|---|---|
| css | Array | 来自/src/css/的全局CSS/Sass/…文件,默认包含的主题文件除外。 |
| preFetch | Boolean | 启用PreFetch功能. |
| extras | Array | 从@quasar/extras包中导入什么内容。 例: [‘material-icons’, ‘roboto-font’, ‘ionicons-v4’] |
| vendor | Object | 向vendor块添加/删除文件/第三方库: { add: […], remove: […] }. |
| supportTS | Boolean/Object | 增加TypeScript支持. 更多信息 |
| htmlVariables | Object | 添加可在index.template.html中使用的变量。 |
| framework | Object/String | 导入哪个Quasar组件/指令/插件,选择哪个Quasar语言包,使用Quasar组件的哪个Quasar图标集。 |
| animations | Object/String | 导入哪个CSS动画。 例: [‘bounceInLeft’, ‘bounceOutRight’] |
| devServer | Object | Webpack devServer选项。 根据您使用的Quasar模式覆盖某些属性,以确保正确的配置。注意:如果您要代理开发服务器(即使用云IDE),请将“public”设置为你的公共应用程序URL。 |
| build | Object | 构建配置。 |
| sourceFiles | Object | 更改应用部分的默认名称. |
| cordova | Object | Cordova特定配置。 |
| capacitor | Object | Quasar CLI Capacitor特定配置。 |
| pwa | Object | PWA特定配置。 |
| ssr | Object | SSR特定配置. |
| electron | Object | Electron特定配置。 |
属性:css
来自/src/css/的全局CSS/Sass/…文件,默认包含的主题文件除外。
// quasar.config.js return { css: [ 'app.sass', // referring to /src/css/app.sass '~some-library/style.css' // referring to node_modules/some-library/style.css ] } 属性:vendor
默认情况下,出于性能和缓存原因,来自node_modules的所有内容都将注入到vendor块中。 但是,如果您希望在此特殊块中添加或删除某些内容,您可以这样做:
// quasar.config.js return { vendor: { /* 可选的; 禁用vendor块: */ disable: true, add: [ 'src/plugins/my-special-plugin' ], remove: ['axios', 'vue$'] } } 属性:framework
告诉CLI要导入的Quasar组件/指令/插件,要使用的Quasar I18n语言包,用于Quasar组件的图标集等等。
只有当“all”设置为false时,才需要填充“components”和“directions”。
// quasar.config.js return { // a list with all options (all are optional) framework: { // is using "auto" import strategy, you can also configure: autoImportComponentCase: 'pascal', // or 'kebab' (default) or 'combined' // For special cases outside of where auto-import can have an impact // (example: vue components written in .js files instead of .vue), // you can manually specify Quasar components/directives to be available everywhere: // // components: [], // directives: [], // Quasar plugins plugins: ['Notify' /* ... */], // Quasar config // You'll see this mentioned for components/directives/plugins which use it config: { /* ... */ }, iconSet: 'fontawesome-v6', // requires icon library to be specified in "extras" section too, lang: 'de', // Tell Quasar which language pack to use for its own components cssAddon: true // Adds the flex responsive++ CSS classes (noticeable bump in footprint) } } 更多关于cssAddon参考这里.
属性:devServer
Webpack devServer 选项. 看看完整列表的选项(在写这篇文章的时候,Webpack团队还没有更新webpack-dev-server v4的网站。)。 有些被Quasar CLI根据“Quasar dev”参数和Quasar模式覆盖,以确保正确的设置。 注意:如果您要代理开发服务器(即使用云IDE),请将“public”设置为公共应用程序URL。
大多数使用的属性是:
| 属性 | 类型 | 描述 |
|---|---|---|
| port | Number | dev server端口 |
| host | String | dev server使用的本地IP/主机名 |
| open | Boolean/String | 除非将其设置为“false”,否则Quasar将打开一个自动指向开发服务器地址的浏览器。 适用于SPA,PWA和SSR模式。 如果指定String,请参阅下面的说明。 |
| proxy | Object/Array | 当你有一个独立的API后端开发服务器,而你想在同一个域名上发送API请求时,代理一些URL会很有用。 |
| devMiddleware | Object | 提供给webpack-dev-middleware v4的配置 |
| https | Boolean/Object | 使用HTTPS而不是HTTP |
| onBeforeSetupMiddleware | Function | 在webpack-dev-server应用自己的配置之前配置开发中间件。 |
| onAfterSetupMiddleware | Function | 在webpack-dev-server应用自己的配置后配置开发中间件。 |
使用open属性打开特定浏览器,而不是使用操作系统的默认浏览器(基于主机操作系统检查支持的值):
// quasar.config.js // (syntax below requires @quasar/app-webpack v3.3+) // 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 } } } 在quasar.config.js文件中设置devServer > https: true时,Quasar会自动为您生成SSL证书。 但是,如果您想自己为本地主机创建一个,请查看Filippo的博客文章。 然后你的quasar.config.js > devServer > https应该看起来像这样:
// quasar.config.js devServer: { server: { type: 'https', // NECESSARY (alternative is type 'http') options: { // Use ABSOLUTE paths or path.join(__dirname, 'root/relative/path') key: "/path/to/server.key", pfx: "/path/to/server.pfx", cert: "/path/to/server.crt", ca: "/path/to/ca.pem", passphrase: 'webpack-dev-server' // do you need it? } } } 您还可以配置自动打开远程Vue Devtools:
// quasar.config.js devServer: { vueDevtools: true } HRM的Docker和WSL问题
如果您正在使用Docker容器,您可能会发现HMR停止工作。HMR依赖于操作系统来提供有关更改的文件的通知,这些文件可能不适用于Docker容器。您可以通过添加以下内容将其更改为轮询:
一个权宜之计可以通过使用轮询模式来检查文件系统的变化来实现。 这可以通过以下方式启用:
// quasar.config.js build: { // ... extendWebpack(cfg) { cfg.watchOptions = { aggregateTimeout: 200, poll: 1000, }; }, // ... 属性:build
| 属性 | 类型 | 描述 |
|---|---|---|
| transpile | Boolean | 启用或禁用Babel transpiling. |
| transpileDependencies | Array of Regex | 如果“transpile”设置为“false”,则不适用。 添加使用Babel进行转换的依赖项(来自node_modules,默认情况下不会被转换)。 例: [ /my-dependency/, ...] |
| showProgress | Boolean | 编译时显示进度条。 |
| transformAssetUrls | Object | 添加对自定义标记属性的引用资源的支持。例如: { 'my-img-comp': 'src', 'my-avatar': [ 'src', 'placeholder-src' ]} |
| extendWebpack(cfg) | Function | Quasar CLI生成的扩展Webpack配置。 等同于chainWebpack(),但您可以直接访问Webpack配置对象。 |
| chainWebpack(chain) | Function | Quasar CLI生成的扩展Webpack配置。 等同于extendWebpack(),但改为使用webpack-chain。 |
| beforeDev({ quasarConf }) | Function | 在运行$ quasar dev命令之前准备外部服务,比如启动一些后端或应用所依赖的任何其他服务。 可以使用async/await或直接返回Promise。 |
| afterDev({ quasarConf }) | Function | quasar开发服务器启动后($ quasar dev)运行钩子。 此时,开发服务器已启动,如果您希望对其执行某些操作则可用这个方法。 可以使用async/await或直接返回Promise。 |
| beforeBuild({ quasarConf }) | Function | 在Quasar构建用于生产环境的应用($ quasar build)之前运行钩子。 此时,尚未创建redistributables文件夹。 可以使用async/await或直接返回Promise。 |
| afterBuild({ quasarConf }) | Function | 在Quasar构建用于生产环境的应用($ quasar build)之后运行钩子。 此时,distributables文件夹已创建,如果您希望对其执行某些操作,则可用。 可以使用async/await或直接返回Promise。 |
| onPublish(opts) | Function | 在Quasar构建用于生产环境的应用并执行afterBuild挂钩(如果指定)之后,如果请求发布($ quasar build -P),则运行挂钩。 可以使用async/await或直接返回Promise。 opts是{arg, distDir}形式的对象,其中“arg”是提供给-P的参数(如果有的话)。 |
| publicPath | String | 部署时的公共路径。 |
| appBase | String | 使用您的自定义值强制应用基本标签;仅在您确实知道自己在做什么的情况下进行配置,否则您可以轻松破坏应用程序。 强烈建议您保留由@quasar/app-webpack计算的结果。 |
| vueRouterBase | String | 用您的自定义值强制应用vue router base;仅在您确实知道自己在做什么的情况下进行配置,否则您可以轻松破坏应用程序。 强烈建议您保留由@quasar/app-webpack计算的结果。 |
| vueRouterMode | String | 设置Vue路由器模式:‘hash’或’history’。 请明智选择。 历史记录模式也需要在部署Web服务器上进行配置。 |
| htmlFilename | String | 默认是’index.html’. |
| ssrPwaHtmlFilename | String | 用于SSR+PWA模式。默认值为’offline.html’。 |
| productName | String | 默认值取自package.json> productName字段。 |
| distDir | String | Quasar CLI生成可分发包的目录,对应项目根目录的相对路径。 默认是’dist/{ctx.modeName}'。 适用于除Cordova (强制生成到src-cordova/www目录)以外的所有模式。 |
| ignorePublicFolder | Boolean | 忽略/public文件夹。如果你依赖于一个statics文件夹,那么你需要自己配置它(在Quasar之外或者通过extendedweback/chainWebpack),所以确保你知道你在做什么。 |
| devtool | String | Source map策略使用。 |
| env | Object | 将属性添加到process.env,您可以在您的网站/应用程序JS代码中使用它。 每个属性都需要JSON编码。 例如:{SOMETHING:JSON.stringify(‘someValue’)}。 |
| gzip | Boolean | 使用Gzip压缩可分发包。 当您提供内容的网络服务器没有gzip功能时很有用。 |
| analyze | Boolean/Object | 使用webpack-bundle-analyzer显示构建包的分析。 如果用作对象,则表示webpack-bundle-analyzer配置对象。 |
| vueCompiler | Boolean | 包括vue runtime + compiler版本,而不是默认的Vue运行时版本 |
| uglifyOptions | Object | 缩小选项。 完整清单. |
| vueLoaderOptions | Object | vue-loader的选项(compilerOptions, compiler, transformAssetUrls, 等等)。 |
| scssLoaderOptions | Object | 提供给sass-loader的.scss文件的选项。例如:scssLoaderOptions: { additionalData: '@import “src/css/abstracts/_mixins.scss”; ’ } |
| sassLoaderOptions | Object | 为.sass文件提供sass-loader的选项。 |
| stylusLoaderOptions | Object | 提供给’stylus-loader`的选项. |
| lessLoaderOptions | Object | 提供给’less-loader`的选项。 |
Quasar CLI根据dev/build命令和Quasar模式自动配置build的以下属性。 但是如果你想重写一些(确保你知道你在做什么),你可以这样做:
| 属性 | 类型 | 描述 |
|---|---|---|
| extractCSS | Boolean | 从Vue文件中提取CSS |
| sourceMap | Boolean | 使用 source maps |
| minify | Boolean | 压缩代码(html,js,css) |
例如,如果运行“quasar build --debug”,则无论您配置了什么,sourceMap和extractCSS都将设置为“true”。
属性:htmlVariables
您可以在src/index.template.html中定义然后引用变量,如下所示:
// quasar.config.js module.exports = function (ctx) { return { htmlVariables: { title: 'test name', some: { prop: 'my-prop' } } 然后(只是一个示例,向您展示如何引用上面定义的变量,在本例中为title):
<!-- src/index.template.html --> <%= title %> <%= some.prop %> 属性:sourceFiles
如果必须,请使用此属性更改网站/应用程序的某些文件的默认名称。 所有路径必须相对于项目的根文件夹。
// default values: sourceFiles: { rootComponent: 'src/App.vue', router: 'src/router', store: 'src/store', indexHtmlTemplate: 'src/index.template.html', registerServiceWorker: 'src-pwa/register-service-worker.js', serviceWorker: 'src-pwa/custom-service-worker.js', electronMain: 'src-electron/electron-main.js', electronPreload: 'src-electron/electron-preload.js' } 为dev/build设置env的示例
请参考我们文档中的添加到process.env部分。
处理Webpack配置
深入分析处理Webpack文档页面。