如何在不使用 Vue CLI 的情况下覆盖 Vuetify 2 变量

How to override Vuetify 2 variables without using Vue CLI

vuetify 文档仅提供了在 vue.config.js 中使用 vue-cli 配置注入 sass 变量的示例 https://vuetifyjs.com/en/customization/sass-variables#markup-js-vue-config-sass-variables

不使用 CLI 时提供修改后的 vuetify 变量的正确方法是什么?

我正在将一个旧项目从 v1(手写笔)升级到 v2(sass),我需要覆盖一些变量,假设我只需要将字体系列更改为 Arial。

我也在使用 treeshaking 和 vuetify。

现在我有点卡住了,因为我不知道在哪里导入样式覆盖...在 src/main.ts 中导入这些显然不起作用。

我在这里创建了一个最小的复制:https://github.com/Sharsie/vuetify-theme-repro/

我目前拥有的是 build 目录中的 webpack 配置和 src/styles/main.scss

中的样式覆盖
$body-font-family: Arial;

@import "~vuetify/src/styles/styles.sass";

运行 该项目创建一个简单的页面,打印出 v-app 容器

的计算样式
  <v-app id="app">
    <v-container>
      <v-content>
        <p>Wanted font-family: Arial</p>
        <p>Current font-family: {{ fontFamily }}</p>
      </v-content>
    </v-container>
  </v-app>

在深入了解 vue-cli 的源代码后,我发现配置只是传递给 sass-loader 选项,所以解决方案非常简单:

而不是像这样通过 vue.config.js 为样式表提供变量:

module.exports = {
  css: {
    loaderOptions: {
      sass: {
        data: `@import "~@/styles/main.scss"`,
      },
    },
  },
}

你可以像这样直接将它提供给 webpack 配置中的 sass-loader 选项:

module.exports = {
  ...
  module: {
    rules: [
    ...
    {
      test: /\.(s?c|sa)ss$/,
      use: [
        'vue-style-loader',
        'css-loader',
        {
          loader: 'sass-loader',
          options: {
            implementation: sass,
            sassOptions: {
              fiber: fibers,
            },
            prependData: `@import "~/styles/main.scss"`,
          },
        },
      ],
    }
    ...
    ]
  }
  ...
}

或 sass-loader<8.0.0

            options: {
              implementation: sass,
              fiber: fibers,
              data: `@import "~/styles/main.scss"`,
            },