[vitejs/vite]Vite CSS 插入顺序问题

2024-07-18 133 views
8

当我同时使用 TailWind CSS 与 Naive UI 的时候,Naive UI 的 按钮样式会错误,原因是 vite 会把CSS插入到 标签的最后,覆盖了 Naive UI 的样式。我想问的是我想控制 CSS的插入位置或者时机,我该怎么做?

https://stackblitz.com/edit/vitejs-vite-7hjumw?file=src%2FApp.vue&terminal=dev

System:
    OS: macOS 12.1
    CPU: (8) arm64 Apple M1
    Memory: 178.88 MB / 16.00 GB
    Shell: 5.8 - /bin/zsh
  Binaries:
    Node: 17.3.0 - /opt/homebrew/bin/node
    Yarn: 3.1.1 - /opt/homebrew/bin/yarn
    npm: 8.3.0 - /opt/homebrew/bin/npm
    Watchman: 2021.12.27.00 - /opt/homebrew/bin/watchman
  Browsers:
    Chrome: 96.0.4664.110
    Firefox: 94.0.1
    Safari: 15.2
  npmPackages:
    @vitejs/plugin-vue: ^2.0.0 => 2.0.1 
    vite: ^2.7.2 => 2.7.9

回答

7

我刚看了下代码, 这应该不是 vite 的问题, 在 naive-ui 中作者用了css-render 这个库去挂载一些样式, 传了 head:true 这个参数

  // naive-ui
  style.mount({
    id: clsPrefix === undefined ? mountId : clsPrefix + mountId,
    head: true,
    props: {
      bPrefix: clsPrefix ? `.${clsPrefix}-` : undefined
    },
    ssr: ssrAdapter
  })
  globalStyle.mount({
    id: 'naive-ui/global',
    head: true,
    ssr: ssrAdapter
  })

在css-render 库中, 传了这个参数会执行以下代码

  // css-render
  if (head) {
    document.head.insertBefore(target, document.head.querySelector('style, link'))
  } else {
    document.head.appendChild(target)
  }

导致 naive-ui 的样式会插在 head 中的任何 style/link 标签之前

1

@toSayNothing 感谢,讲解得十分透彻,谢谢你的解答。

0

naive-ui最新的版本可以通过 控制样式插入的位置,我使用后,vite 依然会把项目中其他样式插入到head 的最后

4

@07akioni @qinfensky 那就简单了呀, 不用在 index.html 中写这个 meta 标签, 在 import 完要排在 naive-ui 前的样式后, 手动挂载这个 meta 标签让后面 naive-ui 执行的时候识别就行了.?

import { createApp } from 'vue';
import App from './App.vue';
import './style.scss';
// import 完要在naive-ui前的样式后, 手动挂个meta标签, 
document.head.insertAdjacentHTML('beforeend', '<meta name="naive-ui-style" />');

createApp(App).mount('#app');

https://stackblitz.com/edit/vitejs-vite-ftgdi7?file=src%2Fmain.js&terminal=dev @Niputi maybe one more day ??

3

@toSayNothing 经我测试是无效的,我在 main.ts 的第一行执行 // import 完要在naive-ui前的样式后, 手动挂个meta标签, document.head.insertAdjacentHTML('beforeend', '<meta name="naive-ui-style" />'); 结果样式还是没正常显示,请问你测试了是正常的吗?

7

@qinfensky 你看我前面发的 stackblitz , 都是正常的 这是naive-ui 2.23.2 版本的feat, 你是不是没有更新到最新版; 我看你一开始发的那个预览链接里面用的还是2.23.1的版本

2

@toSayNothing 缓存了,确实是疏忽了,没问题了,谢谢

9

@qinfensky 好的, 另外可以close掉这个issue哈