为什么要捐赠
API 资源管理器
升级指南
NEW!
quasar.config 文件
转换为使用 Webpack 的 CLI
浏览器兼容性
支持 TypeScript
目录结构
命令列表
CSS 预处理器
路由
延迟加载 - 代码拆分
处理资产
启动文件
预取功能
API 代理
处理 Webpack
处理 process.env
使用 Pinia 进行状态管理
使用 Vuex 进行状态管理
代码检测器
测试与审计
开发移动应用
Ajax 请求
对公众开放开发服务器
Quasar CLI 使用 Webpack - @quasar/app-webpack
应用处理资源

您将在项目结构中注意到我们有两个用于资源的目录: /public//src/assets/。它们之间有什么区别?一些是静态资源,而另一些则由构建系统处理和嵌入。

所以让我们尝试回答上面的问题。我们将首先讨论使用常规资源,然后我们将看看静态资源的区别。

常规资源 - /src/assets

*.vue 组件中,所有模板和 CSS 都由 vue-html-loadercss-loader 解析以查找资源 URL。例如,在 <img src="./logo.png">background: url(./logo.png) 中,"./logo.png" 是一个相对资源路径,将由 Webpack 作为模块依赖项解析。

因为 logo.png 不是 JavaScript,当被视为模块依赖项时,我们需要使用 url-loaderfile-loader 来处理它。Quasar CLI 已经为您配置了这些 webpack 加载器,因此您基本上可以免费获得诸如文件名指纹和条件 base64 内联之类的功能,同时能够使用相对/模块路径而无需担心部署。

由于这些资源可能在构建期间被内联/复制/重命名,因此它们本质上是您源代码的一部分。这就是为什么建议将 Webpack 处理的资源放在 /src/assets 中,与其他源文件一起。实际上,您甚至不必将它们全部放在 /src/assets 中:您可以根据使用它们的模块/组件对其进行组织。例如,您可以将每个组件放在它自己的目录中,其静态资源就在它旁边。

资源解析规则

相对 URL,例如 ./assets/logo.png 将被解释为模块依赖项。它们将被替换为基于您的 Webpack 输出配置自动生成的 URL。

~ 为前缀的 URL 被视为模块请求,类似于 require('some-module/image.png')。如果您想利用 Webpack 的模块解析配置,则需要使用此前缀。Quasar 提供了 assets Webpack 别名,因此建议您像这样使用它: <img src="~assets/logo.png">。注意‘assets’ 前面的 ~

静态资源 - /public

根相对 URL(例如 /logo.png - 其中 ‘/’ 是您的 publicPath)或 logo.png 根本不会被处理。这应该放在 public/ 中。这些资源不会被 Webpack 处理。public 文件夹的内容会原样复制到可分发文件夹中。

Quasar 在幕后有一些智能算法,确保无论您构建什么(SPA、PWA、Cordova、Electron),您的静态资源都将被正确引用,仅当且仅当它们不使用相对路径。

<!-- Good! -->
<img src="logo.png">

<!--
  BAD! Works until you change vue router
  mode (hash/history) or your public path.
  Don't!
-->
<img src="/logo.png">

资源 vs 静态资源

“assets” 文件夹中的文件仅在您的 Vue 文件中存在对它们的文字引用时才会包含在您的构建中。“public” 文件夹中的所有文件和文件夹都会原样复制到您的生产构建中,无论是什么。

警告

当不构建 SPA/PWA/SSR 时,/public/icons/*/public/favicon.ico 不会嵌入到您的应用程序中,因为它们不会有任何作用。例如,Electron 或 Cordova 应用程序不需要这些文件。

Vue 绑定仅需要静态资源

请注意,无论何时您将“src”绑定到 Vue 范围内的变量,它都必须来自 public 文件夹。原因很简单:URL 是动态的,因此 Webpack(在编译时打包资源)不知道您将在运行时引用哪个文件,因此它不会处理 URL。

<template>
  <!-- imageSrc MUST reference a file from /public -->
  <img :src="imageSrc">
</template>

<script>
export default {
  setup () {
    return {
      /*
        Referencing /public.
        Notice string doesn't start with a slash. (/)
      */
      imageSrc: 'logo.png'
    }
  }
}
</script>

您可以通过将 src 绑定到 Vue 的值来强制提供静态资源。不要使用 src="path/to/image",而应该使用 :src=" 'path/to/image' ":src="imageSrc"。请注意第二个代码示例中双引号内的单引号的使用(为了在文档网站上直观地显示,已添加空格 - 正常情况下您不会有空格)。

在 JavaScript 中获取资源路径

为了让 Webpack 返回正确的资源路径,您需要使用 require('./relative/path/to/file.jpg'),它将由 file-loader 处理并返回解析后的 URL。例如

computed: {
  background () {
    return require('./bgs/' + this.id + '.jpg')
  }
}

请注意,上面的示例将包含 ./bgs/ 下的所有图像,以供最终构建使用。这是因为 Webpack 无法猜测运行时将使用哪些图像,因此它将所有图像都包含进来。