
1) 【一句话结论】CSS-in-JS适合动态样式和组件级样式管理,CSS模块化适合静态内联组件的样式,布局组件开发中,若组件需动态调整样式(如根据props变化),优先选CSS-in-JS;若布局静态,选CSS模块化,具体需结合业务需求。
2) 【原理/概念讲解】CSS-in-JS是将CSS代码嵌入JavaScript文件,通过JS对象或函数动态生成样式,实现样式与组件逻辑绑定,类似“将CSS变成可编程的JS对象,动态生成样式”,常用于需要动态计算样式或全局样式管理的场景。CSS模块化是ES模块导出CSS文件,通过import引入,每个CSS文件的作用域仅限于当前组件,避免样式污染,类似“把CSS文件变成模块,导入后样式仅作用于当前组件,像JS模块一样”。
3) 【对比与适用场景】
| 特性/场景 | CSS-in-JS | CSS模块化 |
|---|---|---|
| 定义 | 将CSS嵌入JS,通过JS生成样式 | ES模块导出CSS文件,文件作用域 |
| 核心特性 | 动态样式、样式与JS绑定、作用域管理(需库支持) | 静态样式、文件作用域、减少全局污染 |
| 使用场景 | 动态布局(如根据props调整位置/颜色)、全局样式管理、组件级样式(尤其是有动态属性时) | 静态内联组件(如按钮、卡片)、减少样式冲突、快速开发内联组件 |
| 注意点 | 需构建工具(如webpack)支持,样式作用域需库管理,可能增加构建复杂度 | 样式文件需正确导入,避免路径错误,样式复用需额外管理(如CSS变量) |
4) 【示例】
import styled from 'styled-components';
const DynamicLayout = styled.div`
background-color: ${props => props.color || 'blue'};
padding: 20px;
border-radius: 8px;
`;
const App = () => (
<DynamicLayout color="red">
动态布局组件
</DynamicLayout>
);
import styles from './Button.module.css';
const Button = () => (
<button className={styles.button}>
静态按钮
</button>
);
(Button.module.css内容:`.button { padding: 10px; background: #007bff; color: white; border: none; border-radius: 4px; cursor: pointer; }”)5) 【面试口播版答案】面试官您好,关于CSS-in-JS和CSS模块化的比较,核心结论是CSS-in-JS适合动态样式和组件级样式管理,CSS模块化适合静态内联组件的样式。在布局组件开发中,若组件需要根据props动态调整样式(比如动态改变背景色或布局位置),我会选择CSS-in-JS,因为可以动态绑定样式,比如用styled-components写组件,通过props传入颜色,实现样式动态变化;如果布局是静态的,比如按钮、卡片这些内联组件,用CSS模块化更简单,通过导入CSS文件,样式仅作用于当前组件,避免全局污染。举个例子,假设一个动态布局的组件,用CSS-in-JS可以写styled组件,代码如下(伪代码):const DynamicBox = styled.div背景色动态绑定props.color`,这样根据props变化样式,而CSS模块化适合静态按钮,导入样式后样式固定。
6) 【追问清单】
withTheme或自定义作用域),确保样式仅作用于当前组件。global.css),导入后作用于所有组件,或使用CSS变量统一管理。7) 【常见坑/雷区】