css - 具有相同类名的不同 css 模块会相互覆盖

标签 css webpack css-loader css-modules

我正在使用 webpack 并尝试将 css 模块用于我的主题,例如:

<style lang="scss" module="theme1">
  .header {
    color: red;
  }
</style>

<style lang="scss" module="theme2">
  .header {
    color: blue;
  }
</style>

但是,两个 .header 标签都从 css-loader 获取相同的 localIdentName,因此第二个主题每次都会覆盖另一个。
我的加载器链:vue-loader、css-loader、sass-loader
我当前的 localIdentName:'[local]_[hash:base64:5]'(路径和名称都没有结果,我只是希望有某种 [value] 标签。

最佳答案

显然这是因为自定义注入(inject)名称在 v14 -> v15 从 vue-loader 升级期间被破坏。

这是 GitHub 上的问题,其中包含更多详细信息: https://github.com/vuejs/vue-loader/issues/1578

临时解决方案(放在css-loader的模块选项中):

{
  localIdentName: '[module]_[local]_[hash:base64:5]',
  getLocalIdent(context, localIdentName, localName) {
    const { resourceQuery, resourcePath } = context;
    const { index, module } = loaderUtils.parseQuery(resourceQuery);

    const selector = loaderUtils.interpolateName(context, localIdentName, {
      context: context.rootContext,
      content: resourcePath + resourceQuery + localName,
    })
      .replace(/\[local\]/gi, localName)
      .replace(/\[module\]/gi, typeof module === 'boolean' ? '' : module)
      .replace(/\[index\]/gi, index)
      .replace(new RegExp('[^a-zA-Z0-9\\-_\u00A0-\uFFFF]', 'g'), '-')
      .replace(/^((-?[0-9])|--)/, '_$1');

    return selector;
  },
}

关于css - 具有相同类名的不同 css 模块会相互覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58825556/

相关文章:

html - 为什么我的div在调整大小时停在左边

javascript - 使用一个按钮完成向下滚动时向上滚动一个div

css - 为什么内联样式表的 'img' 元素样式会覆盖 `img` 标签上的内联样式?

javascript - 无法使用webpack从主JS文件中的其他JS文件获取全局变量

javascript - Webpack - 输出不同的文件扩展名?

Webpack 将 CSS 加载到单独的 &lt;style&gt; 标签中

android - ionic 元素的绿色底部边框显示在 android 上,工作 iOS - Ionic

javascript - 从使用 React 和 Webpack 构建的网站的 url 中删除 .html 扩展名

reactjs - 使用 Link 模块的 Next.js 页面未通过 CSS 导入加载文件

javascript - Webpack url() 使用 css-loader 进行路径解析