:first-child
CSS selector with Emotion 10
Avoid usage of If :first-child
CSS selector is used in server-side rendered applications, React will show this warning in the console:
The pseudo class ":first-child" is potentially unsafe when doing server-side rendering. Try changing it to ":first-of-type"
Default server-side rendering in Emotion 10 renders the <style>
tag inline with the component, instead of extracting everything inside <head>
, similarly to "shadow CSS" in Web Components.
This approach enables streaming and requires no additional configuration, but does not work with nth child or similar selectors.
Here is an example of the :first-child
selector:
import styled from "@emotion/styled";
const Text = styled.p`
color: gray;
&:first-child {
color: black;
}
`;
export default () => (
<div>
<Text>Title</Text>
<Text>Subtitle</Text>
</div>
);
This is the DOM structure generated on the server-side:
<div>
<style data-emotion-css="1fyxi0m">
.css-1fyxi0m {
color: gray;
}
.css-1fyxi0m:first-child {
color: black;
}
</style>
<p class="css-1fyxi0m">Title</p>
<style data-emotion-css="1fyxi0m">
.css-1fyxi0m {
color: gray;
}
.css-1fyxi0m:first-child {
color: black;
}
</style>
<p class="css-1fyxi0m">Subtitle</p>
</div>
Since the first child is a <style>
instead of a <p>
element, the :first-child
selector won't work.
Solution
Use :first-of-type
, :last-of-type
or :nth-of-type
selectors.
Read more about an alternative SSR setup in the official documentation.