发布于 2026-01-06 2 阅读
0

OhSnap!Sass 文件夹结构,适用于 React Intro DEV's Worldwide Show and Tell Challenge,由 Mux 呈现:展示你的项目!

糟糕!React 的 Sass 文件夹结构

引言

由 Mux 赞助的 DEV 全球展示挑战赛:展示你的项目!

“OhSnap!”系列节目探索了一些您可以立即应用的实用小技巧。


引言

今天我们将一起了解我最近完成的一个React 项目的文件夹结构。

我使用的是node-sass npm 包,并且始终不使用 Bulma 或 Bootstrap 等任何 CSS 框架。

经过一番研究和反复试验,我发现以下方法对我有效。希望它也能对你有所帮助。


文件夹结构

为了清晰起见,以下内容已进行简化,但基本结构保持不变。您可以在这里查看实际的 GitHub 代码库

/src
• ———— /components
•      |———— /NominationContainer
•            |———— NominationContainer.js
•            |———— nominationContainer.scss  <—— (section 2)
• ———— /sassStyles  <—— (section 1)
•      |————  _animations.scss
•      |————  _functions.scss
•      |————  _global.scss
•      |————  _mixins.scss
•      |————  _typography.scss
•      |————  _variables.scss
Enter fullscreen mode Exit fullscreen mode

第一部分

此文件夹位于组件目录之外,包含所有可能影响多个组件的局部视图和样式。正如您将在第 2 节中看到的,各个组件会根据需要从这些局部视图中导入。

• ———— /sassStyles  <—— (section 1)
•      |————  _animations.scss
•      |————  _functions.scss
•      |————  _global.scss
•      |————  _mixins.scss
•      |————  _typography.scss
•      |————  _variables.scss
Enter fullscreen mode Exit fullscreen mode

_animations.scss

这个局部视图文件存储了实际的@keyframeCSS 动画。它有助于大幅减小组件样式表的大小。在我们的示例中,该文件存储了 22 个动画,相当于近 800 行代码!这为我们的组件文件节省了大量空间,现在组件文件只需引用此文件即可。

_functions.scss

这个局部视图包含了所有用于处理并返回值的 SASS 函数。我在这个项目中没有使用它们,但你可以在这个StackOverflow 帖子中找到一个很好的示例。

_global.scss

这个局部视图包含会覆盖全局元素(例如 `<div>`#root或 `<span> body` 元素)的样式。在我们的示例中,它还导入了_variable.scss文件以引用颜色。

_mixins.scss

这个局部视图可以容纳任何可重复的代码块。在我们的示例中,我使用 mixin 来确定断点大小。它们还使用了变量,因此如果我的整体lg大小发生变化,所有地方都会更新。

_typography.scss

这个局部视图包含了主要的排版元素样式,例如h1-h6`<style>` 、`<style>` 和全局类或 ID。正如您在示例p中看到的,我倾向于避免在此处应用过于具体的属性,例如颜色。这样,我就可以灵活地在应用程序的不同部分更改它,而无需担心属性的精确性。

_variables.scss

这个局部视图包含可重复使用的属性值,例如品牌颜色和尺寸。通过将值存储#002e25在变量中,$primaryDark2Color我可以将其应用于诸如颜色和​​尺寸之类的属性colorborder同时保留稍后全局更改颜色的选项。

第二部分

.js这是一个包含一个文件及其关联.scss样式文件的独立组件示例。

/src
• ———— /components
•      |———— /NominationContainer
•            |———— NominationContainer.js
•            |———— nominationContainer.scss  <—— (section 2)
Enter fullscreen mode Exit fullscreen mode

nominationContainer.scss

这是一个单个组件.scss文件的示例,其代码如下所示。请注意它是如何导入 `<component>` animations、 `<component> variables` 和mixin局部视图的。

因此,动画只需两行代码即可完成设置。颜色基于变量,媒体查询则从 mixin 中提取。

将来,我只需在原始部分文件中更改这些内容,它们就会在这里更新。

@import '../../../sassStyles/variables';
@import '../../../sassStyles/animations';
@import '../../../sassStyles/mixins';

.nom-container {
    background: $primaryDark1Color;
    height: 100%;
    padding: 26px 20px;
    margin-top: 15px;
    opacity: 0;

    -webkit-animation: fade-up 1s cubic-bezier(0.165, 0.840, 0.440, 1.000) 1.4s both;
        animation: fade-up 1s cubic-bezier(0.165, 0.840, 0.440, 1.000) 1.4s both;


    @include customMinBreakPoint(1024) {
        margin-top: 0;
        padding: 26px 0 50px 0;
        -webkit-animation: fade-left 1s cubic-bezier(0.165, 0.840, 0.440, 1.000)  both;
        animation: fade-left 1s cubic-bezier(0.165, 0.840, 0.440, 1.000)  both;
    }

    &__counter-wrapper {
        display: flex;
        justify-content: center;  
        margin-bottom: 30px;
        margin-top: 0;
        opacity: 0;

        -webkit-animation: fade-up 0.9s cubic-bezier(0.165, 0.840, 0.440, 1.000) 1.6s both;
        animation: fade-up 0.9s cubic-bezier(0.165, 0.840, 0.440, 1.000) 1.6s both;

        @include customMinBreakPoint(1024) {
            justify-content: flex-end; 
            margin-right: 50px;
            margin-bottom: 75px;

            -webkit-animation: fade-up 0.9s cubic-bezier(0.165, 0.840, 0.440, 1.000) 0.25s both;
            animation: fade-up 0.9s cubic-bezier(0.165, 0.840, 0.440, 1.000) 0.25s both;
        }

        @include customMinBreakPoint(1400) {
            margin-right: 12%;
        }

        @include customMinBreakPoint(1500) {
            margin-right: 15%;
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

缩略图使用Figma设计

文章来源:https://dev.to/gedalyakrycer/ohsnap-sass-folder-struct-for-react-483e