如何在 React 组件中导入 CSS 文件

Posted

技术标签:

【中文标题】如何在 React 组件中导入 CSS 文件【英文标题】:How to import a CSS file in a React Component 【发布时间】:2017-02-12 16:46:42 【问题描述】:

我想将 CSS 文件导入到 react 组件中。

我尝试过import disabledLink from "../../../public/styles/disabledLink";,但出现以下错误;

找不到模块:错误:无法解析 c:\Users\User\Documents\pizza-app\client\src\ 中的“文件”或“目录”../../../public/styles/disabledLink components@./client/src/components/ShoppingCartLink.js 19:20-66 哈希:2d281bb98fe0a961f7c4 版本:webpack 1.13.2

C:\Users\User\Documents\pizza-app\client\public\styles\disabledLink.css 是我要加载的 CSS 文件的位置。

在我看来,导入似乎没有找到正确的路径。

我认为../../../ 会开始查找上面三个文件夹层的路径。

C:\Users\User\Documents\pizza-app\client\src\components\ShoppingCartLink.js 是应该导入 CSS 文件的文件的位置。

我做错了什么,我该如何解决?

【问题讨论】:

嘿,怎么了 :D,看起来上面只有两个文件夹(组件和 src) 嘿,你是对的,但它仍然不起作用。我注意到我不能使用导入,因为我不能在 CSS 文件中使用导出 这样使用***.com/questions/39926493/… 我收到错误 -> @media only screen and (min-width:320px) and (max-width:640px) ^ SyntaxError: Invalid or unexpected token at Module._compile (internal/modules /cjs/loader.js:723:23) 【参考方案1】:

我建议使用 CSS 模块:

反应

import React from 'react';
import styles from './table.css';

export default class Table extends React.Component 
    render () 
        return <div className=styles.table>
            <div className=styles.row>
                <div className=styles.cell>A0</div>
                <div className=styles.cell>B0</div>
            </div>
        </div>;
    

渲染组件:

<div class="table__table___32osj">
    <div class="table__row___2w27N">
        <div class="table__cell___2w27N">A0</div>
        <div class="table__cell___1oVw5">B0</div>
    </div>
</div>

【讨论】:

我会在下面添加第 1 部分作为答案。你可以按照我的回答来测试你的组件。 如果试过了,但它不起作用。我尝试像这样包含它:import styles from "./disabledLink.css"; 并得到以下错误:找不到模块:错误:无法解析 c:\Users\Basti Kluth\Documents\ 中的“文件”或“目录”./disabledLink.css Pizza-app\client\src\components @ ./client/src/components/ShoppingCartLink.js 19:20-49 css模块应该分开安装,github.com/css-modules/css-modules 我该如何为这种类型的 CSS 编写媒体查询,有什么想法吗?【参考方案2】:

使用 webpack 创建 bundle 时需要使用 css-loader。

安装它:

npm install css-loader --save-dev

并将其添加到 webpack 配置中的加载器:

module.exports = 
  module: 
    loaders: [
       test: /\.css$/, loader: "style-loader!css-loader" ,
      // ...
    ]
  
;

在此之后,您将能够在 js 中包含 css 文件。

【讨论】:

我不允许将另一个模块导入这个项目。他们的另一种解决方案是否仅适用于 reactjs 或原生 js? 所以我想我必须使用这样的东西:htmlElement.style 看起来有点难看。为什么不允许在捆绑包构建中添加更改? 这是一个关于reactjs的workship的后处理,我们被告知用workship期间包含的模块来解决需求 好的,但只是想提一下,获取样式标签不是 importing css 文件,正如您在问题中所问的那样。这是两个不同的问题。【参考方案3】:

如果你不需要,你甚至不必命名它:

例如

import React from 'react';
import './App.css';

在此处查看完整示例 (Build a JSX Live Compiler as a React Component)。

【讨论】:

对我不起作用,当我尝试使用 babel register 运行 mocha 时,我得到... I:\....css:1 (function (exports, require, module, __filename, __dirname ) .filter-bg ^ SyntaxError: Unexpected token . 或者,使用 react-helmet 并在 标签中注入 css(如果它是 url)【参考方案4】:

下面在 React 组件中导入一个外部 CSS 文件,并在网站的&lt;head /&gt; 中输出 CSS 规则。

    安装Style Loader和CSS Loader:
npm install --save-dev style-loader
npm install --save-dev css-loader
    在 webpack.config.js 中:
module.exports = 
    module: 
        rules: [
            
                test: /\.css$/,
                use: [ 'style-loader', 'css-loader' ]
            
        ]
    

    在组件文件中:
import './path/to/file.css';

【讨论】:

我使用 babel 来运行 watcher。也许它根本看不到 webpack.config.js 文件 你安装css-loader了吗?我也没有看到你的 webpack.config.js。 您可以添加更多对象格式的模块规则作为rules数组的值。【参考方案5】:

    安装样式加载器和 CSS 加载器:

    npm install --save-dev style-loader
    npm install --save-dev css-loader
    

    配置 webpack

    module: 
            loaders: [
                
                    test: /\.css$/,
                    loader: 'style-loader'
                , 
                    test: /\.css$/,
                    loader: 'css-loader',
                    query: 
                        modules: true,
                        localIdentName: '[name]__[local]___[hash:base64:5]'
                    
                
            ]
        
    

【讨论】:

【参考方案6】:

如果您只想将样式表中的一些样式注入组件而不捆绑整个样式表,我推荐https://github.com/glortho/styled-import。例如:

const btnStyle = styledImport.react('../App.css', '.button')

// btnStyle is now  color: 'blue'  or whatever other rules you have in `.button`.

注意:我是这个库的作者,我为大量导入样式和 CSS 模块不是最佳或最可行的解决方案的情况构建了它。

【讨论】:

【参考方案7】:

您也可以使用所需的模块。

require('./componentName.css');
const React = require('react');

【讨论】:

【参考方案8】:

上述解决方案已完全更改和弃用。如果您想使用 CSS 模块(假设您导入了 css-loaders)并且我一直试图为此找到答案很长时间,最终做到了。新版本中默认的 webpack loader 完全不同。

在你的webpack中,你需要找到一个以cssRegex开头的部分,并用这个替换它;


  test: cssRegex,
  exclude: cssModuleRegex,
  use: getStyleLoaders(
      importLoaders: 1,
      modules: true,
      localIdentName: '[name]__[local]__[hash:base64:5]'
  ),

【讨论】:

***.com/questions/53572200/… 替代解决方案【参考方案9】:

您可以在.jsx 文件中导入您的.css 文件

这是一个例子-

import Content from '../content/content.jsx';

【讨论】:

【参考方案10】:

CSS 模块让您可以在不同的文件中使用相同的 CSS 类名,而不必担心命名冲突。

Button.module.css

.error 
  background-color: red;

another-stylesheet.css

.error 
  color: red;

Button.js

import React,  Component  from 'react';
import styles from './Button.module.css'; // Import css modules stylesheet as styles
import './another-stylesheet.css'; // Import regular stylesheet
class Button extends Component 
  render() 
    // reference as a js object
    return <button className=styles.error>Error Button</button>;
  

【讨论】:

我们需要做些什么来让它工作吗? @AbhishekSharma..关于解决方案最重要的一点是,将您的 css 文件命名为 "something.module.css" 。该模块部分是使它工作的全部。【参考方案11】:

使用 extract-css-chunks-webpack-plugin 和 css-loader 加载器为我工作,见下文:

webpack.config.js 导入 extract-css-chunks-webpack-plugin

const ExtractCssChunks = require('extract-css-chunks-webpack-plugin');

webpack.config.js 添加css规则, 先提取 css 块然后 css 加载器 css-loader 将它们嵌入到 html 文档,确保 css-loader 和 extract-css-chunks-webpack-plugin 在 package.json 开发依赖项中

rules: [
      
        test: /\.css$/,
        use: [
          
            loader: ExtractCssChunks.loader,
          ,
          'css-loader',
        ],
      
]

webpack.config.js 制作插件实例

plugins: [
    new ExtractCssChunks(
      // Options similar to the same options in webpackOptions.output
      // both options are optional
      filename: '[name].css',
      chunkFilename: '[id].css'
    )
  ]

现在可以导入 css 现在在像 index.tsx 这样的 tsx 文件中,我可以像这样使用 import import './Tree.css' 其中 Tree.css 包含 css 规则,如

body 
    background: red;

我的应用程序正在使用打字稿,这对我有用,请检查我的源代码: https://github.com/nickjohngray/staticbackeditor

【讨论】:

【参考方案12】:

如果 css 文件位于要导入的同一文件夹中,则可以导入 css 文件,而不是简单地试试这个

导入'./styles.css'

如果 css 文件远离我们导航文件所在位置的组件并像这样使用它

导入'../mainstyles/styles.css'

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于如何在 React 组件中导入 CSS 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 vue 组件中导入 CSS 文件,范围仅限于组件?

如何在 React 组件中导入图像(.svg、.png)

在反应组件中导入分割的css文件

我无法在 React 中导入组件

如何在 Vue Nuxt 项目中导入整个 SCSS 文件夹?

如何在 React 应用程序的 typescript 文件中导入 js 模块(使用绝对路径)?