You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React 18.2.0中为何所有SCSS文件会被全局加载?

问题:React组件切换时所有样式表均被加载

我使用React 18.2.0,代码结构如下:

Onboarding.jsx

import "../../styles/screens/_onboarding.scss";

export default function Onboarding({ setPaymentSuccess }) {
  return (
    <div className="card">
      <div className="banner"></div>
      <div className="content">
        <div className="logo">
          <img src={logo} alt="" />
        </div>

CreateAccount.jsx

import "../../styles/screens/_createAccount.scss";

export default function CreateAccount() {
  return (
    <div className="card">
      <div className="banner"></div>
      <div className="content">
        <div className="logo">
          <img src={logo} alt="" />
          <span className="caption">Baker's Fifa Snipe Bot</span>
        </div>

        <div className="hairline"></div>
        <div className="text-content">
          <div className="text-caption">Terms of Service</div>
          <div className="text-paragraph">
            <span className="link">Continue reading...</span>
          </div>
        </div>

Purchase.jsx

import "../styles/pages/_purchase.scss";

export default function Purchase() {
  const [paymentSuccess, setPaymentSuccess] = useState(false);
  const [loggedIn, setLoggedIn] = useState(false);

  return (
    <div className="wrapper">
      <div className="container">
        {!paymentSuccess && (
          <Onboarding setPaymentSuccess={setPaymentSuccess} />
        )}
        {paymentSuccess && <CreateAccount />}
      </div>
    </div>
  );
}

无论加载Onboarding还是CreateAccount组件,所有样式表都会被加载,请问问题出在哪里?


解答

这是因为Webpack(或你使用的构建工具)会在编译阶段就处理所有导入的样式文件,将它们打包到最终输出中,和组件是否被条件渲染无关。只要样式文件被组件导入,不管组件有没有实际渲染,样式都会被加载并注入页面。

可以通过以下方式解决:

  • 使用CSS Modules:将样式文件命名为[name].module.scss,通过模块化方式导入,样式会被限定在组件内部,避免全局污染,同时构建工具会按需处理样式作用域:

    // Onboarding.jsx
    import styles from "../../styles/screens/_onboarding.module.scss";
    
    // 使用样式
    <div className={styles.card}>...</div>
    
  • 动态导入样式:在组件挂载时动态导入样式文件,只有组件被渲染时才会加载对应样式:

    // Onboarding.jsx
    import { useEffect } from 'react';
    
    export default function Onboarding({ setPaymentSuccess }) {
      useEffect(() => {
        import("../../styles/screens/_onboarding.scss");
      }, []);
    
      return (
        // 组件内容
      )
    }
    

    注意:需要确保构建工具支持动态导入,若需要样式卸载逻辑,可在组件卸载时移除对应的样式标签。

  • 使用CSS-in-JS方案:比如Styled Components、Emotion等,样式与组件绑定,只有组件渲染时才会生成并注入对应的样式规则。


内容的提问来源于stack exchange,提问作者ChethiyaKD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 01:41:02