[英]How to prevent style tags of unused React components
我认为这个问题可能会扩展到 React 之外,但我仍然不确定 React 本身是否对问题负责。
环境是 React with TypeScript。 我在组件文件中使用 CSS 导入,因此每个组件都有其特定的样式表,并且我假设在实例化相应组件之前不会将这些样式添加到<head>
元素。 但事实证明,如果我从一个文件中导入一个组件,它只是重新导出所有组件,我不使用的所有其他组件的样式仍然添加到 DOM 中。
这是一个简单的例子,假设我在lib
文件夹中有两个简单的组件 - Avatar
和Button
。 它们看起来像这样( Button
类似):
import React from 'react';
import './avatar.css';
const Avatar: React.FC = (props: any) => {
return (
<div className="avatar">
{props.children}
</div>
);
}
export { Avatar };
然后我添加index.ts
来index.ts
组件,以获得简单的导入路径:
import { Avatar } from './Avatar';
import { Button } from './Button';
export { Avatar, Button };
最后,在我的AppComponent
我只想使用Button
组件:
import React from 'react';
import { Button } from './lib';
const App: React.FC = () => {
return (
<div className="App">
<Button>example</Button>
</div >
);
}
export default App;
令我惊讶的是,在<head>
元素中有<style>
标签不仅用于Button
,还用于Avatar
。 为什么会这样? 我的再导出配置有问题吗?
请注意,如果我直接从其文件中导入组件 - import { Button } from './lib/Button'
我不会获得Avatar
样式。
这个例子真的很简单,但真正的场景是与一个 React 组件库相关的,它包含了很多带有很多样式表的组件。 我想避免在 DOM 中插入如此多的<style>
标签,除非确实需要它们。
感谢您花时间在这上面!
以便每个组件都有其特定的样式表,并且我认为在实例化相应的组件之前不会将这些样式添加到元素中
这个假设是错误的。 React 使用 webpack 来捆绑它的文件,而 webpack 处理 CSS 导入的方式是加载项目依赖的所有 CSS 文件,并在开始时将它们放在<head>
元素中。
你可能会问:那我如何保持我的风格分开而不是混合在一起。
解决这个问题有3种方法
<div>
有一个与组件同名的className
,这样你的组件就会看起来像这样export default class ComponentOne extends Component {
...
render() {
return(
<div className="ComponentOne">
...
</div
)
}
}
您的组件 CSS 文件将如下所示:
.ComponentOne div img {
...
}
.ComponentOne .class-one {
...
}
通过这种方式,使用像 SASS 这样的 CSS 预处理器会派上用场,所以你的 .scss 文件将简单地以:
.ComponentOne {
...
}
@media queries
和other special effects like
:hover` 并且不建议将这种方法用于小组件经常挂载和卸载,因为一旦应用程序变大,这就会产生性能问题您可能还会问:既然所有样式表都是在乞讨时导入的,那我为什么不将所有样式放在一个大样式表中而不是将它们拆分。
除了拆分样式将使它们易于处理以便每个组件都有其单独的 CSS 文件并且 webpack 将处理导入它们这一事实之外,还有另一个好处:
假设您有一个feature1 组件,它也有一个feature1.css文件。 一开始,当您在主应用程序中导入了 feature1 时,webpack 也会导入其样式表并将其放入<head>
元素中。
但是假设将来您决定不再使用feature1 组件,并且您现在正在使用另一个具有自己的feature2.css文件的feature2 组件。 现在因为没有其他组件正在导入feature1 组件,webpack 也会忽略将feature1.css导入到<head>
元素中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.