JavaScript 的 import() 是动态导入语法,CSS 本身不支持 import() 或运行时逻辑;实际是 JS 封装 CSS-in-JS 模块后动态加载并注入样式,适用于主题切换等场景。
import() CSS 并不具备这一特性;它实际上是 JavaScript 所提供的动态导入语法。CSS 中也不存在 import() 函数;条件加载和运行时逻辑分支同样不在其支持范围内。
import()
CSS 是静态、声明式的样式表语言,本身不具备执行逻辑。所谓在 CSS 中使用 import()其实是常见误解,实际发挥作用的是 JS 模块系统。动态导入发生在 JS 文件中,例如导出 CSS-in-JS 样式对象的模块,而不是纯 .css 文件。
import() 结合 CSS-in-JS 完成按需渲染实现思路是将样式定义封装到 JS 模块中,再用 import() 先载入所需模块,组件再接收并注入其返回的样式对象。主题切换、A/B 测试、权限控制样式等场景都适用。
import() 中应当导出对象,供 CSS-in-JS 库进行消费(如 styled-components 的 css 模板字面量,或者 emotion 的 css 函数结果)import('./theme-dark.css') 后并不会自然“生效”;只有构建工具配备 CSS 文件动态加载插件才可以(如 Vite 的 import.meta.glob 或 Webpack 的 style-loader + css-loader 链式处理)const loadTheme = async (type) => { if (type === 'dark') { const { darkStyles } = await import('./styles/dark.js'); return darkStyles; } const { lightStyles } = await import('./styles/light.js'); return lightStyles;};
若模块会直接调用某些操作(如),那么动态导入的 CSS-in-JS 模块就带有副作用 injectGlobal 或写入 <style>,就可能因重复执行或竞态而失效。
立即学习前端免费学习笔记(深入);
import('./x.css') 默认只负责加载资源,并不会自动插入 <style> ,因此需要配合 import('./x.css?inline') 或使用 import.meta.glob 预构建import() 必须改为提前 resolve 或静态导入,因为 fallback 在此处不可用import(`./${theme}.js`) 会导致 bundler 保留全部匹配模块归根结底,分支控制始终属于 JS 层,CSS-in-JS 只是承载样式表达;不要要求 CSS 自行判断,因为这应由 JS 完成。