Nuxt & Vuetify:如何控制 CSS 文件的加载顺序?

Posted

技术标签:

【中文标题】Nuxt & Vuetify:如何控制 CSS 文件的加载顺序?【英文标题】:Nuxt & Vuetify: how to control the order in which CSS files are loaded? 【发布时间】:2019-11-02 02:11:11 【问题描述】:

在我的Nuxt/Vuetify 应用程序中,我试图在Vuetify 的CSS 之后加载我的自定义CSS,但无论如何Vuetify 的CSS 都会在之后加载。我试图颠倒 CSS 数组中的顺序:

css: [
    '~/assets/style/main.scss',
    '~/assets/style/app.styl'
  ],

...然后交换这些,无济于事。

previous question on this topic 的流行加上它缺乏答案让我认为问题出在Vuetify' 方面,作者没有费心去解决这个问题。

但也许这不是正确的解释,确实有解决方案?

【问题讨论】:

我相信你必须编辑 nuxt.config.js。在您的自定义 css 中导入 vuetify css 并在您的自定义 CSS 之外禁用自动加载它的技术也可能是一种解决方案。 【参考方案1】:

这仍然是vuetify 2.2.19nuxt 2.0.0@nuxt/vuetify 中的问题。第一个解决方案可能是在nuxt.config.json(在构建部分)中设置extractCss: true。但对我来说,这会导致 HMR 错误 - 样式在开发环境中不会动态更新,我必须在每次样式更新后重新加载页面。

在我的情况下,正确的解决方案是:

    禁用@nuxt/vuetify,完全删除vuetify部分,从buildModules中删除'@nuxtjs/vuetify

    nuxt.config.js 的样式部分中以正确的顺序加载样式。我不在 vuetify 中使用自定义 sass 变量,对我来说就像:

css: [
  'vuetify/dist/vuetify.min.css',
  '@mdi/font/css/materialdesignicons.css',
  '~/assets/styles/main.scss'
]

    即使您使用自定义 sass 变量,我也建议您在单独的构建步骤中基于它们预编译 vuetify 并将其放置在静态文件夹中,因为它们通常不会经常更改。

    使用以下插件手动包含 vuetify:

import Vue from 'vue'
import Vuetify from 'vuetify'
import en from 'vuetify/lib/locale/en'
import lt from 'vuetify/lib/locale/lt'
import pl from 'vuetify/lib/locale/pl'
import colors from '~/config/colors'

Vue.use(Vuetify)

export default ( app ) => 
  app.vuetify = new Vuetify(
    lang: 
      locales:  en, lt, pl ,
      current: 'en'
    ,
    icons: 
      iconfont: 'mdi'
    ,
    theme: 
      options: 
        customProperties: true
      ,
      themes: 
        light: colors
      
    
  )

【讨论】:

但是通过这种方式你会失去 css 上的 treeshaking 功能,对吧?【参考方案2】:

我遇到了同样/类似的问题。

在我的情况下,我(有点)通过删除 nuxt 配置中的所有 css 加载来解决它:

css: [
    // ~/assets/style/app.styl,
    // ~/assets/style/custom.styl,
],

并将其添加到 plugins/vuetify.js:

import Vue from 'vue'
import Vuetify from 'vuetify/lib'
import colors from 'vuetify/es5/util/colors'

import 'assets/style/app.styl'
import 'assets/style/custom.styl'

Vue.use(Vuetify)

现在我可以覆盖默认的 Vuetify 主题,但使用热模块替换重新编译代码需要更长的时间。

也许不是最好的方法,但我找不到更好的方法。

【讨论】:

【参考方案3】:

如前所述,这是 Nuxt 一直存在的问题。但是,您有几个选择。

选项 1 肮脏但简单的方法...

从 nuxt.config.js 中删除您的覆盖 CSS(保留 Vuetify) 然后在 default 布局中添加覆盖代码 style 块。

<style lang="sass">
  @import assets/style/main.scss
</style>

这种方法的问题是,如果您添加额外的布局,您将不得不复制它。

选项 #2 更好但可能更复杂的方法

创建一个“全部”css 文件并将两者都导入其中。我说更复杂,因为您可能需要先将手写笔编译成 CSS,然后才能导入。但是,我假设您没有更改 Vuetify 样式,因此这可能不会成为问题。

all.scss(确保将其命名为 .scss 以便处理)

@import "app.styl";
@import "main.scss";

将所有 CSS(按您想要的任何顺序)导入到该 CSS 文件中。

nuxt.config.js

css: [
    '~/assets/style/all.scss',
  ],

【讨论】:

【参考方案4】:

这似乎是 Nuxt 的一个未解决问题,不幸的是没有解决。 Vuetify 说他们不认为它站在他们这边: https://github.com/vuetifyjs/vuetify-loader/issues/23

从 Nuxt ^2.7.1 开始,人们遇到了 css 文件加载不一致的问题。 in this issue 和 this issue 都引用了它。

他们似乎正在尝试修复它,as noted here。不幸的是,在此版本发布之前,我认为除了恢复到较低版本之外,您无能为力。

【讨论】:

以上是关于Nuxt & Vuetify:如何控制 CSS 文件的加载顺序?的主要内容,如果未能解决你的问题,请参考以下文章

将 Google 字体系列添加到 Nuxt&Vuetify 项目

Vuetify,Nuxt,在开发模式下使用摇树

使用 Jest 测试 Nuxt + Vuex + Vuetify 的设置

<v-icon> vuetify material Icon (mdi) 在 vuetify 和 nuxt 应用程序中显示问题?

如何在 Nuxt/Vuetify 中从头部删除 Google 字体 Roboto?

在 Nuxt、Vue、jest 和 Vuetify 中为项目编写单元测试