@use 时未定义的字体真棒变量

Undefined Font Awesome Variable when @use

我正在尝试在我的 Laravel 项目 Sass 文件中使用 Font Awesome。我通过 NPM 安装:

npm install --save @fortawesome/fontawesome-free

太棒了,我看到它安装在我的 node_modules 中并且可以看到 scss 文件夹在那里,一切看起来都不错。我看了一些人们如何将它包含在他们的 Sass 文件中的例子,他们都在使用 @import。如果我使用 @import,我发现它也能按预期工作。

@import "~@fortawesome/fontawesome-free/scss/fontawesome.scss";
@import "~@fortawesome/fontawesome-free/scss/solid.scss";

.add-new {
    &:before {
        @include fa-icon;
        content: fa-content( $fa-var-plus );
    }
}

查看 Sass 支持 docs for @import 虽然它说不鼓励:

The Sass team discourages the continued use of the @import rule. Sass will gradually phase it out over the next few years, and eventually remove it from the language entirely. Prefer the @use rule instead.

我的问题有两个:

  1. 这看起来很麻烦。我将在整个项目中使用 Font Awesome,但要在文件之间使用它,我需要记住 @use 两个 Font Awesome 文件:
    @use "~@fortawesome/fontawesome-free/scss/fontawesome.scss" as *;
    @use "~@fortawesome/fontawesome-free/scss/solid.scss" as *;
  1. 上面的 Sass 代码似乎不起作用。 我收到 fa-content() 不存在或 $fa-var-plus 的错误不存在。使用 @use 指令似乎无法访问它们。

由于我对其中许多技术(Laravel、Sass 等)不熟悉,所以我希望得到一个信息丰富的答案来解释 为什么 这种情况正在发生,什么 可能的解决方案是。假设我想遵循 Sass 警告并遵守使用 @use 指令。也许还解释 why/not 这是可取的。

对于未来的读者,我已经在 Font Awesome library 中提出了这个问题。如果您 运行 遇到类似问题,可以在他们的 Github 问题跟踪器中表达您的担忧。

回答您的问题out-of-order:

错误:

这里应该没有任何明显的错误。不过,这可能与您 运行 的 Sass 版本有关。我没有 Laravel 经验,但在我看来他们在他们的文档中使用了 Node Sass,这不支持新的模块 @use 语法。为了使用新的语法,你需要确保你有 Dart Sass。 Dart Sass 是 Sass 的核心实现,并将始终提供最多 up-to-date 功能。

繁琐:

新语法的目标是使依赖关系显式和本地化,因此这确实意味着许多文件会有一些额外的开销。尽管如此,还是有办法简化你所拥有的。我建议创建一个包含两个 @forward 规则的本地 Sass 文件——基本上将这两个 npm 导入合并到一个本地模块中:

// _fa.scss
@forward "~@fortawesome/fontawesome-free/scss/fontawesome";
@forward "~@fortawesome/fontawesome-free/scss/solid";

现在您可以在任何需要的地方加载那个本地文件 font-awesome,它会转发两个 npm 文件:

@use "fa" as *;

.add-new {
    &:before {
        @include fa-icon;
        content: fa-content( $fa-var-plus );
    }
}

请注意,Sass 导入路径不需要 .scss 扩展名和 _ 前缀。

最终的解决方案是:

// scss/1-globals/_fa.scss
@forward "~@fortawesome/fontawesome-free/scss/fontawesome";
@forward "~@fortawesome/fontawesome-free/scss/solid" as fas-*; // Prefixed to prevent conflicts

// scss/3-components/_my-component.scss
@use "1-globals/fa" as *;

.button {
    
    &:before {
        @extend %fa-icon; // Base Font Awesome Styles
        @extend .fas;     // FA Type (far, fas, fab)
        content: fa-content( $fa-var-plus ); // Function to pull in icon
    }
    
}

Mirian 在这方面帮了大忙,非常感谢!我觉得这个问题还没有得到很好的记录,我可能会在新主题中提出后续问题。