英文:
Dynamic import vite css
问题
有一个通过API调用捕获的theme
选项。我希望这个主题与我在Vue 3应用程序(使用vite)中创建的css文件(或它们的组合)相对应。
这些主题文件我想要“层叠”,这样我就可以有base.css
和style5.css
,它们将追加到其中。
我也在使用tailwind。
main.pcss
/* tailwind base */
@import 'tailwindcss/base';
@import 'tailwindcss/components';
@import 'tailwindcss/utilities';
我目前的做法(下面的代码)我不喜欢它有好几个原因,但这是我能够使其正常工作的唯一方法,使CSS能够正确导入并且不会导致FOUC。我希望组件和CSS能够一起加载。
所以这是我希望实现的事情:
- 在我指定的顺序加载样式表时没有FOUC
- 使用全局类样式(而不是作用域化),由tailwind用
@apply
等编译。 - 我希望完全移除组件,只导入CSS文件,以消除这一层间接性,但当我尝试在
yarn build
中使用它时,布局没有应用任何CSS。 - 如果我想对
base.css, style1.css
进行一些调整,我应该能够组合多个单独的CSS文件,如style1.css, style2.css
。如你所见,我不能对它们进行层叠,它们只能完全复制粘贴,这显然不是理想的情况。 - 我希望确保每个“主题”(一组CSS)都被捆绑,而不是所有主题都被捆绑在一起(出于文件大小的原因)。这就是为什么我使用异步组件的原因。
英文:
I have a theme
option I capture via API call. I want this theme to correspond with css files (or combinations of them) I have created in the Vue 3 app (using vite).
These theme files I would like to 'layer' so I can have base.css
, and style5.css
which would append to that.
I'm also using tailwind.
main.pcss
/* tailwind base */
@import 'tailwindcss/base';
@import 'tailwindcss/components';
@import 'tailwindcss/utilities';
The current way I'm doing this (below) I don't like it for several reasons, but it was the only way I could get it working where the CSS would import properly, and would not cause a FOUC. I want the component and the css to load together.
So these are the things I'm hoping to achieve
- No FOUC as the sheets load in the order I specify
- They use global class styles (not scoped), compiled by tailwind with
@apply
, etc. - I would love to remove the component entirely and just import CSS files, to remove this layer of indirection, but when I tried that with
yarn build
the layout had none of css applied. - Should multiple separate css files I can combine, like
base.css, style1.css
style1.css, style2.css
(if I want to make 1 tweak to style 1). As you see below I can't layer them, they just have to be copy pasted in full which is obviously not ideal - I want to make sure each 'theme' (group of css) is bundled and not all themes are bundled together (for file size reasons). This is why im using the async component
My layout component
<template>
<component v-if="theme" :is="themeComponent">
<slot />
</component>
</template>
<script>
import { computed, defineAsyncComponent } from 'vue';
import { useStore } from '@/store';
export default {
setup() {
const store = useStore();
const theme = computed(() => store.theme);
const themeComponent = defineAsyncComponent(() => {
if (theme.value === 'STYLE_1') return import('@/themes/Style1.vue');
if (theme.value === 'STYLE_2') return import('@/themes/Style2.vue');
return import('@/themes/StyleDefault.vue');
});
return {
theme,
themeComponent,
};
},
};
</script>
Here is my Style1.vue component:
<template>
<slot />
</template>
<style>
/* font */
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap');
/* base */
body {
@apply text-slate-800 bg-white;
font-family: 'Inter', sans-serif;
}
.link {
@apply hover:underline;
}
.wrapper {}
.container {
@apply px-4 mx-auto max-w-[750px];
}
.header {
@apply bg-gray-50;
}
.content {
@apply pb-20 border-t-2 border-b-2 border-blue-300 ;
}
...
答案1
得分: 2
你可以直接导入你的CSS文件:
if (theme.value === 'STYLE_1') {
import('@/assets/styles/style1.scss')
}
但是,由于你动态导入CSS,无法避免FOUC(无样式内容闪烁问题)。因为CSS是在JS和DOM加载之后才加载的。
英文:
You can import your CSS file directly:
if (theme.value === 'STYLE_1') {
import('@/assets/styles/style1.scss')
}
But, since you import your CSS dynamically, there is no way to avoid FOUC. Because the CSS is loaded after JS and after the DOM loaded
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论