Duplicated CSS rules in production
See original GitHub issueWhen using this CLI plugin, there are duplicated CSS rules when using CSS modules and the “composes” feature. This seems to be caused by the critical CSS that’s inlined into the <head>
and is both happening in development and production (main issue).
I’ve created the following test repo (https://github.com/mrksbnch/vue-ssr-css-issue) that I created using vue create
(Vue router as the only feature) and vue add @akryum/vue-cli-plugin-ssr
. Afterwards, I added a test.css file in the folder assets
and composed (<style module>
) two style declarations from that file in Home.vue
and HelloWorld.vue
.
You can see the duplicated rules after running npm run ssr:serve
or npm run ssr:build
and npm run ssr:start
in the dev tools:
Both CSS rules are inlined on the server side (<style data-vue-ssr-id>
):
This is just a simple test repo with only one CSS rule. In a proper app this will cause a lot (!) of duplicated CSS rules and increase the file size by quite a bit. I’ve tested it with a simple app and I noticed some rules being duplicated 5 or 6 times.
Issue Analytics
- State:
- Created 5 years ago
- Comments:15 (3 by maintainers)
Top GitHub Comments
Actually, the styles don’t get added twice by the SSR plugin, but you get the styles delivered with the server side-rendered page and as soon as you mount the app on the client side on top of the pre-rendered dom, Vue adds the styles of the components again. So it is not really a Bug or an Issue, but it is simply a reality of prerendering. Right now I am working on a solution to this (for example extract the CSS from the JS bundle and inject them into the HTML). I keep you updated and tell you as soon as I’ve managed to solve this problem
@enriqg9 We don’t use SCSS, so I’m not sure if I can be of much support, but I have some ideas of what you could try:
I would recommend taking a look at your built webpack config using
vue inspect > output.js
and then taking a look a the generated output.js file. It might give you some insight into the structure of your loaders and why it can’t seem to find options for vue-style-loader under the scss rule.Is it just throwing that error for scss or for css as well?
Is it possible that one of the “types” is not relevant in your case, so that is causing an error? If so, you could try removing it.
You could try only modifying options if they exist. If you can just prevent the error with an undefined check, then maybe it could work.
You can put console.logs in your chainWebpack function and they will log in the terminal where you run vue-cli-service start. It’s a bit hard to read, but you could use this to figure out which type or rule is causing the error.
Webpack is very confusing to me, especially with vue-cli so I am sorry that I can’t be of more help.