Parcel:为每个 React 组件使用单独的 SCSS 文件,但使用变量文件

Posted

技术标签:

【中文标题】Parcel:为每个 React 组件使用单独的 SCSS 文件,但使用变量文件【英文标题】:Parcel: using separate SCSS files for each React component, but with a variables file 【发布时间】:2020-01-09 19:06:31 【问题描述】:

即使我是 React 和打包程序(以及这两者的组合)的新手,我仍在努力寻找建立高效 Web 开发工作流程的方法。我的目标是让每个 React 组件都使用自己的 SCSS 文件,其他组件的样式表无法访问该文件。不过需要一些全局文件,比如variables.scss,这就是问题所在。

这是我的文件结构(来自 src 文件夹)目前的样子:

├── assets
├── components
│   ├── App
│   │   ├── index.js
│   │   └── index.scss
│   ├── Taskbar
│   │   ├── index.js
│   │   └── index.scss
│   └── Window
│       ├── index.js
│       └── index.scss
├── index.js
└── sass
    ├── mixins.scss
    └── variables.scss

我正在使用 Parcel 和 node-sass 来导入这些 SCSS 文件。如您所见,每个组件都有自己的文件夹,其中包含一个 SCSS 文件。

每个组件都像这样加载其指定的样式表:

import React from 'react';
import './index.scss';
import Taskbar from '../Taskbar';

export default class App extends React.Component 
  render() 
    return (
      <div id="app">
        <Taskbar />
      </div>
    )
  

我喜欢保留这种方法,因为样式表仅在组件本身被导入时使用。

问题

如果你再看一下我的文件结构,sass 文件夹中有两个文件(variables.scss 和 mixins.scss)。我希望所有组件都可以访问该文件夹中的所有文件。

我尝试在应用程序中简单地导入文件,以便可以在所有文件中访问它,如下所示:

import '../../sass/variables.scss';
import '../../sass/mixins.scss';

这些当然会加载,但我不能使用这些文件中声明的变量和函数,例如Taskbar/index.scss

所以我的问题是:如何在“受保护的”SCSS 文件中使用这些全局 sass 变量/函数?

【问题讨论】:

【参考方案1】:

欢迎来到***!很棒的第一篇文章。内容丰富、清晰、切中要害。

理想情况下,您共享的SCSS 将是部分的,您将使用@import 语法而不是import

来自Sass guide:

您可以创建包含少量 CSS 的小部分 Sass 文件 可以包含在其他 Sass 文件中。这是一个很好的方法 模块化您的 CSS 并帮助使事情更易于维护。 一个 partial 只是一个以下划线开头的 Sass 文件。你 可能会将其命名为 _partial.scss。下划线让 Sass 知道该文件只是一个部分文件,它不应该是 生成一个 CSS 文件。 Sass 部分与 @import 一起使用 指令

工作示例


一些补充说明...

主观上“更好”的文件夹结构(请参阅下面的注释了解原因):

  └── src
      ├── assets
      ├── components
      |   |
      │   ├── App
      |   |   ├── __tests__
      |   |   |   └── App.test.js
      │   │   ├── index.js
      │   │   └── styles.scss (App.scss)
      |   |
      │   ├── Taskbar
      |   |   ├── __tests__
      |   |   |   └── Taskbar.test.js
      │   │   ├── index.js
      │   │   └── styles.scss (Taskbar.scss)
      |   |
      │   └── Window
      |       ├── __tests__
      |       |   └── Window.test.js
      │       ├── index.js
      │       └── styles.scss (Window.scss)
      |
      ├── styles
      |   ├── _mixins.scss
      |   ├── _variables.scss
      |   └── styles.scss (exports all shared partials)
      |
      └── index.js
避免将index.scss 用于组件级样式表,因为当您开始添加测试时,如果您只编写import Component from "./index" 而不使用扩展名,您会混淆Webpack 想要哪个导入。这有 50/50 的机会抛出 export is not a class or function 错误。作为一般经验法则,我将使用与父文件夹相同的名称或使用 styles 并将 .scss 扩展名添加到导入中,以区分其与普通 .js 导入的唯一性。 可选:您可以将部分导入到单个非部分文件中,然后将该文件导入到每个组件级样式表中。请参阅我的示例here。这节省了为每个组件级样式表一遍又一遍地编写多个@import 语句的时间;但是,当您可能只想要一件事时,它的缺点是要导入所有内容。

而且...如果您感到无聊并且有时间,我会详细说明我为什么喜欢这个folder structure。

【讨论】:

以上是关于Parcel:为每个 React 组件使用单独的 SCSS 文件,但使用变量文件的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 React.js 中为组件使用单独的 CSS 文件

使用 Parceljs 时,为 Prime React 组件包含 css 文件的最佳方法是啥?

如何将 React 组件导出为 NPM 包以在单独的项目中使用?

如何使用 Parcel 2 在 React 中使用 SVG 内联?

React UseEffect 依赖于上下文不会立即更新组件

Parcel Bundler 和 React 服务器端渲染