ssr中直接import './style.css'不会让css进html,因打包器在服务端不执行css提取逻辑;webpack需禁用minicssextractplugin并改用css-loader(exportonlylocals: false),vite需vite-plugin-css-injected-by-js内联,next.js app router要求全局css仅限layout.tsx顶层import。

SSR中直接import './style.css'不会让CSS进HTML——这不是代码写错了,是打包器根本没在服务端执行提取逻辑。
Webpack服务端构建必须禁用MiniCssExtractPlugin
该插件只在浏览器端生成.css文件,Node.js环境里它不产出任何内容,还可能让css-loader跳过CSS字符串导出。你看到的document is not defined错误,往往就是style-loader试图操作DOM导致的,但真正卡住样式注入的,是MiniCssExtractPlugin在服务端“静默失效”。
- Webpack配置中对
.css和.module.css规则,移除MiniCssExtractPlugin.loader,改用css-loader+string-loader(或自定义loader返回export default css.toString()) -
css-loader必须设exportOnlyLocals: false(默认为true),否则连css.toString()都不可用 - 若用CSS Modules,额外加
modules.exportLocalsConvention: 'camelCaseOnly',避免类名映射污染样式字符串提取
Vite SSR需靠vite-plugin-css-injected-by-js内联
Vite默认不支持服务端CSS提取,import语句在Node里只是空执行。你不手动干预,renderToString出来的HTML里就只有class名,没有样式规则。
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
- 安装插件:
npm install vite-plugin-css-injected-by-js - 在
vite.config.ts的ssr配置下启用,它会把CSS内容挂到模块的__vite_ssr_exports__.css属性上 - 服务端渲染前,用
ssrLoadModule('./Button.module.css')动态导入,再取mod.css拼入 - 注意:不能用
require()或静态import,Vite SSR上下文不识别CommonJS路径解析
Next.js app目录只认app/layout.tsx里的顶层import
Next.js 13+的app目录彻底废弃了_document.tsx和任意位置的CSS import。你在组件里写import './xxx.css',构建时会被直接忽略——不是bug,是设计如此。
- 所有全局CSS必须写在
app/layout.tsx或app/[slug]/layout.tsx顶部,且只能是import语句,不能包裹在函数或条件里 - CSS Modules(如
Button.module.css)必须通过import styles from '...'+className={styles.root}显式使用,文件本身不会自动注入 - 动态加载的组件(
dynamic(..., { ssr: true }))内部的importCSS无效,样式不会随组件SSR进HTML - 删掉
next.config.js里所有cssModules、postcss相关配置——Next.js默认已启用,手动配反而可能触发降级行为
React Static / JSS等CSS-in-JS方案依赖插件的beforeRenderToElement钩子
CSS-in-JS库(JSS、Emotion、styled-components)的样式是运行时生成的,静态构建阶段不执行JS,自然拿不到样式字符串。不借助插件,导出的HTML就是无样式的裸DOM。
- 以
react-static-plugin-jss为例,它在beforeRenderToElement生命周期里调用jss.toString(),把当前渲染树生成的所有规则转成字符串 - 结果通过
headElements注入到HTML的,确保首屏样式零延迟 - 客户端hydrate时,JSS实例需复用同一
SheetsRegistry,否则样式重复插入或丢失 - 如果你自己实现,关键不是“怎么生成CSS”,而是“在哪个时机、用哪个registry实例去调
toString()”——早了没内容,晚了来不及塞进HTML
最容易被忽略的是注入顺序:服务端拼出来的CSS字符串如果一股脑塞在末尾,就会被后续<link rel="stylesheet">覆盖;而客户端hydrate后又按组件顺序重插<style></style>,造成样式跳变。必须严格按组件渲染依赖链收集,并控制<style></style>标签在HTML中的相对位置。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










