Skip to content

getCSSModuleLocalIdent may cause unexpected behavior when using moduled CSS class names in querySelector #11775

Open
@tychenjiajun

Description

@tychenjiajun

Describe the bug

Use getLocalIdent: getCSSModuleLocalIdent in css-loader option may cause unexpected behavior when using moduled CSS class names in querySelector.

Did you try recovering your dependencies?

Yes

Which terms did you search for in User Guide?

getCSSModuleLocalIdent

Environment

webpack

Steps to reproduce

(Write your steps here:)

  1. Use exactly the same webpack config in readme.
const getCSSModuleLocalIdent = require('react-dev-utils/getCSSModuleLocalIdent');

// In your webpack config:
// ...
module: {
  rules: [
    {
      test: /\.module\.css$/,
      use: [
        require.resolve('style-loader'),
        {
          loader: require.resolve('css-loader'),
          options: {
            importLoaders: 1,
            modules: {
              getLocalIdent: getCSSModuleLocalIdent,
            },
          },
        },
        {
          loader: require.resolve('postcss-loader'),
          options: postCSSLoaderOptions,
        },
      ],
    },
  ];
}
  1. Write the following codes in app
import styles from '../someStyle.css'

document.querySelector('.' + styles.foo);

function Component() { 
  return <div className={styles.foo} />
}
  1. Hopes for the luck. In some rare cases, styles.foo may includes character + and querySelector will throw error or return null.

Expected behavior

return value of getCSSModuleLocalIdent doesn't includes +.

Actual behavior

return value of getCSSModuleLocalIdent may includes +.

Reproducible demo

Checkout my forks tychenjiajun@28d10e6
In the test cases, if input class name is 'class1020', the output class name will be file_class1020__V+98r. Using this class name inquerySelector causes error, see https://codepen.io/chankcccc/pen/MWEmxpZ

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions