首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法从CSS模块转换中跳过第三方库CSS

无法从CSS模块转换中跳过第三方库CSS
EN

Stack Overflow用户
提问于 2018-06-14 14:16:04
回答 3查看 1.8K关注 0票数 3

我第一次尝试CSS模块和React,Webpack和我找到了至少三种方法来实现它:

  1. css-装载机
  2. react css模块
  3. babel-plugin-react css-模块

为了平衡代码的简单性和性能,我使用了babel-plugin-react-css-modules,除了一件事之外,一切看起来都很好:我的第三方库(Bootstrap和Font )也包含在code转换中。

代码语言:javascript
复制
<NavLink to="/about" styleName="navigation-button"></NavLink>

上面的代码将一个正确转换的className分配给NavLink。但是,内部的span需要引用全局样式才能呈现图标。

代码语言:javascript
复制
<span className="fa fa-info" />

上面的span没有被分配给预期的转换className,但是我的捆绑样式表没有这些CSS类,因为它们正被转换成其他类,以模拟本地范围。

下面是我的.babelrc文件中激活babel-plugin-react-css-modules的内容

代码语言:javascript
复制
{
  "presets": ["env", "react"],
  "plugins": [
    ["react-css-modules", {
      "generateScopedName": "[name]__[local]___[hash:base64:5]",
      "filetypes": {
        ".less": {
          "syntax": "postcss-less"
        }
      }
    }]
  ]
}

在我的Webpack配置中,下面是为转换配置css-loader的部分:

代码语言:javascript
复制
{
    test: /\.(less|css)$/,
    exclude: /node_modules/,
    use: extractCSS.extract({
        fallback: 'style-loader',
        use: [
            {
                loader: 'css-loader',
                options: {
                    minimize: true,
                    modules: true,
                    sourceMap: true,
                    localIdentName: '[name]__[local]___[hash:base64:5]'
                }
            },
            {
                loader: 'less-loader'
            }
        ]
    })
}

据我所知,上面的规则应该排除库样式表,我还尝试为排除的样式表添加另一条规则,但是这似乎不起作用,因为我猜这些样式表仍然与原始规则进行了转换。

为了从这两个库导入CSS,我在父样式表中有以下两行声明了一些全局样式:

代码语言:javascript
复制
@import '../../../node_modules/bootstrap/dist/css/bootstrap.min.css';
@import '../../../node_modules/font-awesome/css/font-awesome.min.css';
EN

回答 3

Stack Overflow用户

发布于 2018-12-14 14:05:55

我发现以下两种方法可能会有帮助:

简而言之,到目前为止,似乎没有任何选项可以忽略/排除css模块webpack插件模块化的某些路径。理想情况下,插件应该支持它,但以下是一些您可以尝试的方法:

使用两种webpack规则来利用webpack规则排除/包含

代码语言:javascript
复制
module.exports = {
  rules: [
    {
      test: /\.css$/,
      exclude: /node_modules/,
      use: [
        'style-loader',
        {
          loader: 'css-loader',
          options: {
            modules: true,
            localIdentName: '[path]__[local]___[hash:base64:5]',
          },
        },
      ],
    },
    {
      test: /\.css$/,
      include: /node_modules/,
      use: ['style-loader', 'css-loader']
    }
  ]
}

...or,从上面的第二个答案中注入webpack的getLocalIdent,手动排除某些路径。

代码语言:javascript
复制
const getLocalIdent = require('css-loader/lib/getLocalIdent');

{
  loader: 'css-loader',
  options: {
    modules: true,
    localIdentName: '[path][name]__[local]--[hash:base64:5]',
    getLocalIdent: (loaderContext, localIdentName, localName, options) => {
      return loaderContext.resourcePath.includes('semantic-ui-css') ?
        localName :
        getLocalIdent(loaderContext, localIdentName, localName, options);
    }
  }
}
票数 5
EN

Stack Overflow用户

发布于 2020-10-30 15:56:04

对我来说,使用:global起了作用:

代码语言:javascript
复制
.my-component {
    :global {
        .external-ui-component {
           padding: 16px;
           // Some other styling adjustments here
        }
        ...
    }
}

Ps:对于webpack的配置,请看另一个答案。

来源

票数 3
EN

Stack Overflow用户

发布于 2021-02-07 21:55:03

来自playing771的更新解决方案

代码语言:javascript
复制
 {
    loader: 'css-loader',
    options: {
      modules: {
        auto: (resourcePath) => !resourcePath.includes('node_modules'),
        localIdentName: '[name]__[local]__[hash:base64:5]',
      },
    },
 },
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50859629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档