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

Reactjs+CRA+TS+Craco+Less环境下CSS Modules失效问题求助(无需eject项目)

Solution for CSS Modules + Less Not Working in CRA + TS + Craco

Let’s fix your issues step by step. The main problems in your setup are duplicate plugin entries, a typo in Less configuration, and missing TypeScript type definitions for CSS Modules.

1. Fix Your craco.config.js

You’ve added CracoLessPlugin twice, which causes configuration conflicts. There’s also a typo in the relativeUrls option. Update your config to this:

const CracoLessPlugin = require('craco-less')
const CracoAlias = require('craco-alias')

module.exports = {
  plugins: [
    {
      plugin: CracoLessPlugin,
      options: {
        cssLoaderOptions: {
          sourceMap: true,
          modules: {
            mode: 'local',
            localIdentName: '[local]___[hash:base64:5]',
          },
        },
        lessLoaderOptions: {
          lessOptions: {
            relativeUrls: false, // Fixed typo here
            sourceMap: true,
            javascriptEnabled: true,
          },
        },
      },
    },
    {
      plugin: CracoAlias,
      options: {
        source: 'tsconfig',
        baseUrl: '.',
        tsConfigPath: './tsconfig.path.json',
      },
    },
  ],
}

Key changes:

  • Removed the duplicate CracoLessPlugin entry (this was overriding your CSS Modules setup)
  • Fixed the typo orelativenUrls → relativeUrls (ensures Less resolves paths correctly)
  • Explicitly set modules.mode: 'local' to enforce scoped CSS Modules for .module.less files

2. Correct TypeScript Type Definitions for CSS Modules

Your current declaration doesn’t tell TypeScript what the imported classes object looks like. Update react-app-env.d.ts to:

/* eslint-disable spaced-comment */
/// <reference types="react-scripts" />
declare module '*.png'
declare module '*.jpg'
declare module '*.jpeg'
declare module '*.gif'
declare module '*.svg'
declare module '*.mp4'
declare module '*.mov'

declare module '*.module.less' {
  const classes: Record<string, string>;
  export default classes;
}

This tells TypeScript that any .module.less file exports an object where keys are your original class names, and values are the scoped CSS class strings generated by CSS Modules.

3. Restart Your Dev Server

Craco doesn’t always pick up config changes on the fly. Stop your current dev server and restart it to apply the new configuration.

After these steps, your CSS Modules should work correctly:

  • Less variables like @accent-color will be resolved properly
  • Class names will be scoped (check browser dev tools to see generated names like navpanel__socials___abc12)
  • Nested selectors in your Less file will apply as expected

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 12:22:31