当我导入多个 .scss 文件时,如何在 html 头部只包含一个 CSS 文件?

How do i include only one CSS file in the html head when I import multiple .scss files?

我的网站结构有点像

src/
    components/
        Footer/
            index.jsx
            style.scss
        Header/
            index.jsx
            style.scss
        Navbar/
            index.jsx
            style.scss
...

在我的每个 index.jsx 个文件中,我有 import './style.scss' 个。

在我最近开发的 Gatsby website 中,我只能在头部看到一个样式标签,尽管我可能有几十个包含 import ./style.scss.

的组件

我现在正在开发一个非 Gatsby、React 和 Webpack 的网站,当我的组件经常包含 import ./style.scss 时使用相同的方法,但看起来每个导入的都有一个样式标签样式文件。

我想知道 Gatsby 的功能,以及如何在我的非 Gatsby 网站中包含相同类型的功能

这项工作由 webpack, not by Gatsby. Of course, Gatsby extends from a custom implementation but you can import the same behavior into another project by adding a custom webpack configuration (as you can do in Gatsby as well) 完成。

webpack bundles all JavaScript, JSON, and CSS(默认不支持SCSS,需要通过添加自定义webpack的配置或者通过插件)文件使用 code-splitting technique。这允许您将代码分成几个包,根据需要或请求加载。

此外,可能对您有用的一件事是使用主要文件来收集一些导入。给定:

src/
    components/
        Footer/
            index.jsx
            style.scss
        Header/
            index.jsx
            style.scss
        Navbar/
            index.jsx
            style.scss

您可以在 /src/styles 下创建一个名为 styles.scss 的文件并且:

@import 'components/Footer/style';
@import 'components/Header/style';
@import 'components/Navbar/style';

然后在包含其他组件的顶级组件中导入文件。


更新:

您所说的警告是由于输入错误 order in styles。这并不重要,因为 webpack 分块了所有这些样式,但它们会产生警告。有一个名为 ignoreOrder 的 属性(默认设置为 false)。您可以通过以下方式修复它:

const MiniCssExtractPlugin = require('mini-css-extract-plugin');

module.exports = {
  plugins: [
    new MiniCssExtractPlugin({
      ignoreOrder: true, // here
    }),
  ],
  module: {
    rules: [
      {
        test: /\.css$/i,
        use: [MiniCssExtractPlugin.loader, 'css-loader'],
      },
    ],
  },
};