logo
  • 指南
  • 配置
  • 插件
  • API
  • 示例
  • 社区
  • Modern.js 2.x 文档
  • 简体中文
    • 简体中文
    • English
    • 开始
      介绍
      快速上手
      版本升级
      名词解释
      技术栈
      核心概念
      页面入口
      构建工具
      Web 服务器
      基础功能
      路由
      路由基础
      配置式路由
      数据管理
      数据获取
      数据写入
      数据缓存
      渲染
      服务端渲染(SSR)
      服务端流式渲染(Streaming SSR)
      渲染缓存
      静态站点生成(SSG)
      渲染预处理 (Render Preprocessing)
      样式开发
      引入 CSS
      使用 CSS Modules
      使用 CSS-in-JS
      使用 Tailwind CSS
      HTML 模板
      引用静态资源
      引用 JSON 文件
      引用 SVG 资源
      引用 Wasm 资源
      调试
      数据模拟(Mock)
      网络代理
      使用 Rsdoctor
      使用 Storybook
      测试
      Playwright
      Vitest
      Jest
      Cypress
      路径别名
      环境变量
      构建产物目录
      部署应用
      进阶功能
      使用 Rspack
      使用 BFF
      基础用法
      运行时框架
      扩展 BFF Server
      扩展一体化调用 SDK
      文件上传
      跨项目调用
      优化页面性能
      代码分割
      静态资源内联
      产物体积优化
      React Compiler
      提升构建性能
      浏览器兼容性
      配置底层工具
      源码构建模式
      服务端监控
      Monitors
      日志事件
      指标事件
      国际化
      基础概念
      快速开始
      配置说明
      语言检测
      资源加载
      路由集成
      API 参考
      高级用法
      最佳实践
      自定义 Web Server
      专题详解
      模块联邦
      简介
      开始使用
      应用级别模块
      服务端渲染
      部署
      集成国际化能力
      常见问题
      依赖安装问题
      命令行问题
      构建相关问题
      热更新问题
      已下线功能
      📝 编辑此页面
      上一页引入 CSS下一页使用 CSS-in-JS

      #使用 CSS Modules

      CSS Modules 让我们能以模块化的方式编写 CSS 代码,并且可以在 JavaScript 文件中导入和使用这些样式。使用 CSS Modules 可以自动生成唯一的类名,隔离不同模块之间的样式,避免类名冲突。

      Modern.js 默认支持使用 CSS Modules,无需添加额外的配置。我们约定使用 [name].module.css 文件名来启用 CSS Modules。

      以下样式文件会被视为 CSS Modules:

      • *.module.scss
      • *.module.less
      • *.module.css

      #示例

      • 编写样式:
      /* button.module.css */
      .error {
        background: red;
      }
      • 使用样式:
      // Button.tsx
      import React, { Component } from 'react';
      // 引入样式文件
      import styles from './button.module.css';
      
      export default () => {
        return <button className={styles.error}>Error Button</button>;
      };

      #为所有样式文件启用 CSS Modules

      在默认情况下,只有 *.module.css 结尾的文件才被视为 CSS Modules 模块。

      如果你想将源码目录下的所有 CSS 文件当做 CSS Modules 模块进行处理,可以通过开启 output.disableCssModuleExtension 来实现,比如:

      export default {
        output: {
          disableCssModuleExtension: true,
        },
      };

      设置后,以下两个文件都会被视为 CSS Modules:

      import styles1 from './foo.module.css';
      import styles2 from './bar.css';
      Tip

      我们不推荐开启此配置项,因为开启 disableCssModuleExtension 后,CSS Modules 文件和普通 CSS 文件无法得到明确的区分,不利于长期维护。

      #为指定的样式文件启用 CSS Modules

      在默认情况下,只有 *.module.css 结尾的文件才被视为 CSS Modules 模块。

      如果你想只为一些指定的样式文件启用 CSS Modules,可以通过配置 output.cssModules 来实现,比如:

      export default {
        output: {
          cssModules: {
            auto: resource => {
              return resource.includes('.module.') || resource.includes('shared/');
            },
          },
        },
      };

      如果你需要自定义 CSS Modules 的其他配置,可以通过 tools.cssLoader 进行设置。

      #添加类型声明

      当你在 TypeScript 代码中引用 CSS Modules 时,TypeScript 可能会提示该模块缺少类型定义:

      TS2307: Cannot find module './index.module.css' or its corresponding type declarations.

      此时你需要为 CSS Modules 添加类型声明文件,请在项目中创建 src/global.d.ts 文件,并添加相应的类型声明:

      src/global.d.ts
      declare module '*.module.css' {
        const classes: { readonly [key: string]: string };
        export default classes;
      }
      
      declare module '*.module.scss' {
        const classes: { readonly [key: string]: string };
        export default classes;
      }
      
      declare module '*.module.sass' {
        const classes: { readonly [key: string]: string };
        export default classes;
      }
      
      declare module '*.module.less' {
        const classes: { readonly [key: string]: string };
        export default classes;
      }
      
      declare module '*.module.styl' {
        const classes: { readonly [key: string]: string };
        export default classes;
      }

      如果你开启了 disableCssModuleExtension 配置值,还需要添加以下类型:

      src/global.d.ts
      declare module '*.css' {
        const classes: { readonly [key: string]: string };
        export default classes;
      }
      
      declare module '*.scss' {
        const classes: { readonly [key: string]: string };
        export default classes;
      }
      
      declare module '*.sass' {
        const classes: { readonly [key: string]: string };
        export default classes;
      }
      
      declare module '*.less' {
        const classes: { readonly [key: string]: string };
        export default classes;
      }
      
      declare module '*.styl' {
        const classes: { readonly [key: string]: string };
        export default classes;
      }

      添加类型声明后,如果依然存在上述错误提示,请尝试重启当前 IDE,或者调整 global.d.ts 所在的目录,使 TypeScript 能够正确识别类型定义。

      #生成准确的类型定义

      上述方法虽然可以解决 CSS Modules 在 TypeScript 中的类型问题,但是无法准确地提示出某个 CSS 文件导出了哪些类名。

      Modern.js 支持为 CSS Modules 生成准确的类型声明,你只需要开启 output.enableCssModuleTSDeclaration 配置项,再执行构建命令,Modern.js 就会为项目中所有的 CSS Modules 文件生成相应的类型声明文件。

      export default {
        output: {
          enableCssModuleTSDeclaration: true,
        },
      };

      #示例

      例如某个文件夹下面有 src/index.ts 和 src/index.module.scss 两个文件:

      src/index.ts
      import styles from './index.module.scss';
      
      export default () => {
        <div>
          <div className={styles.pageHeader}>Page Header</div>
        </div>;
      };
      // index.module.scss
      .page-header {
        color: black;
      }

      执行构建命令后,会自动生成 src/index.module.scss.d.ts 类型声明文件:

      src/index.module.scss.d.ts
      // This file is automatically generated.
      // Please do not change this file!
      interface CssExports {
        'page-header': string;
        pageHeader: string;
      }
      export const cssExports: CssExports;
      export default cssExports;

      此时再打开 src/index.ts 文件,可以看到 styles 对象已经具备了准确的类型。

      #相关配置

      在上述例子中,src/index.module.scss.d.ts 是编译生成的代码,你可以选择将它们提交到 Git 仓库里,也可以选择在 .gitignore 文件中忽略它们:

      # Ignore auto generated CSS declarations
      *.module.css.d.ts
      *.module.sass.d.ts
      *.module.scss.d.ts
      *.module.less.d.ts
      *.module.styl.d.ts

      此外,如果生成的代码导致了 ESLint 报错,你也可以将上述配置添加到 .eslintignore 文件里。