Best way to include CSS? Why use @import?
From a page speed standpoint, @import
from a CSS file should almost never be used, as it can prevent stylesheets from being downloaded concurrently. For instance, if stylesheet A contains the text:
@import url("stylesheetB.css");
then the download of the second stylesheet may not start until the first stylesheet has been downloaded. If, on the other hand, both stylesheets are referenced in <link>
elements in the main HTML page, both can be downloaded at the same time. If both stylesheets are always loaded together, it can also be helpful to simply combine them into a single file.
There are occasionally situations where @import
is appropriate, but they are generally the exception, not the rule.
I'm going to play devil's advocate, because I hate it when people agree too much.
1. If you need a stylesheet that depends on another one, use @import. Do the optimization in a separate step.
There are two variables you're optimizing for at any given time - the performance of your code, and the performance of the developer. In many, if not a majority of cases, it's more important to make the developer more efficient, and only then make the code more performant.
If you have one stylesheet that depends on another, the most logical thing to do is to put them in two separate files and use @import. That will make the most logical sense to the next person who looks at the code.
(When would such a dependency happen? It's pretty rare, in my opinion - usually one stylesheet is enough. However, there are some logical places to put things in different CSS files:)
- Theming: If you have different color schemes or themes for the same page, they may share some, but not all components.
- Subcomponents: A contrived example - say you have a restaurant page that includes a menu. If the menu is very different from the rest of the page, it'll be easier to maintain if it's in its own file.
Usually stylesheets are independent, so it's reasonable to include them all using <link href>
. However, if they are a dependent hierarchy, you should do the thing that makes the most logical sense to do.
Python uses import; C uses include; JavaScript has require. CSS has import; when you need it, use it!
2. Once you get to the point where the site needs to scale, concatenate all the CSS.
Multiple CSS requests of any kind - whether through links or through @imports - are bad practice for high performance web sites. Once you're at the point where optimization matters, all your CSS should be flowing through a minifier. Cssmin combines import statements; as @Brandon points out, grunt has multiple options for doing so as well. (See also this question).
Once you're at the minified stage, <link>
is faster, as people have pointed out, so at most link to a few stylesheets and don't @import any if at all possible.
Before the site reaches production scale though, it's more important that the code is organized and logical, than that it goes slightly faster.