描述bug
在querySelector
中使用css-loader选项中的getLocalIdent: getCSSModuleLocalIdent
可能会导致在使用模块化CSS类名时出现意外行为。
你是否尝试恢复依赖关系?
是的
你在用户指南中搜索了哪些术语?
getCSSModuleLocalIdent
环境
webpack
重现步骤
(请在这里写下你的步骤:)
- 在readme中使用完全相同的webpack配置。
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,
},
],
},
];
}
- 在app中编写以下代码。
import styles from '../someStyle.css'
document.querySelector('.' + styles.foo);
function Component() {
return <div className={styles.foo} />
}
- 希望运气好。在某些罕见的情况下,
styles.foo
可能包含字符+
,而querySelector
将抛出错误或返回null。
预期行为
getCSSModuleLocalIdent的返回值不包括+
。
实际行为
getCSSModuleLocalIdent的返回值可能包含+
。
可复现的演示
查看我的forks tychenjiajun@28d10e6
在测试用例中,如果输入的类名为'class1020',输出的类名将为file_class1020__V+98r
。在querySelector
中使用此类名会导致错误,参见https://codepen.io/chankcccc/pen/MWEmxpZ
7条答案
按热度按时间brjng4g31#
解:我们最近也遇到了这个问题。看起来可以通过使用$x^{
CSS.escape()
}$来解决:$x^{
}=x^{(1+a)(1-b)x}$
2w3rbyxf2#
我们最近也遇到了这个问题。看起来你可以通过使用
CSS.escape()
来解决:好主意。我们的解决方案是复制原始的
getLocalIndent
方法,并将哈希类型从base64
更改为base62
也许我应该为此提交一个 PR。
kyxcudwk3#
我最近也遇到了这个问题,生成的类有
/
,但浏览器没有正确地将它们应用到元素上。与 @tychenjiajun 类似,我修改了 getLocalIdent 函数,但我没有使用
base62
,而是根据 https://datatracker.ietf.org/doc/html/rfc4648#section-5 将base64
的第62个和第63个字符替换为它们的 url-safe 对应字符。这是我的代码:
5uzkadbs4#
我也遇到了这个问题。我的解决方案是在
getHashDigest
中将digestType参数的值从"base64"更改为"base64url"。base64url
是在nodejs 14中引入的。由于我刚刚提出了关于css模块哈希冲突的#12013问题,我可以在那里解决这个问题。顺便问一下,为什么这个问题现在才出现呢?6rvt4ljy5#
好的,我不知道base64url存在。由于我的项目一直使用webpack 4,我不得不也使用react-scripts v4。注意到从4.0.1升级到4.0.2会导致计算不同的哈希值。
pdkcd3nj6#
已修复PR #12013
9rnv2umw7#
我也遇到了这个问题,使用 CSS.escape() 来解决,等待 cra 修复。