相对于根目录的 SCSS 导入

Posted

技术标签:

【中文标题】相对于根目录的 SCSS 导入【英文标题】:SCSS Import Relative to Root 【发布时间】:2017-08-09 11:51:03 【问题描述】:

我正在重构一个 Angular 应用程序,当我将组件移动到新的目录位置时,我发现在组件的 SCSS 文件中处理 @import 路径变得有点乏味。

例如,假设我的应用程序根目录中有文件src/_mixins.scss,组件src/app/my-widget/my-widget.component.scss@import '../../mixins'; 一样导入SCSS。一切顺利。

但后来我决定my-widget.component 确实是另一个组件my-thingy.component 下的“共享组件”,所以我在src/app/my-thingy 下创建了一个shared 文件夹并将src/app/my-widget 中的所有内容移动到其中。

希望你还在我身边...所以,现在我有了src/app/my-thingy/shared/my-widget,我修改了我的SCSS文件以导入@import '../../../../mixins'

注意:这是一个简化的示例。一些路径变得相对较深(不是双关语......或者是吗?)所有这些./ 有点多。

TL;DR

如果从一开始我就可以在我所有组件的 SCSS 文件中相对于根目录导入 _mixins.scss,那将是 超级方便,这样我就不必一直搞砸了重构时的@import 路径。 (例如,类似于@import '~/mixins' 的东西)。 这样的事情存在吗?

我已经尝试过(遗憾的是,失败了):

    @import '~/mixins'; /** I had real hope for this one **/ @import 'mixins'; /** Just being overly optimistic here **/ @import '~//mixins'; /** Now I'm just making stuff up **/

我知道我已经不得不修改我的 mod 文件以指向带有所有这些“移动的东西”的组件的新路径,但是......嘿,少一件事,对吗?

【问题讨论】:

【参考方案1】: 如果您使用的是 Angular CLI,请查看Global styles、"stylePreprocessorOptions" 选项。 对于webpack,你可以在sassLoader插件配置中配置includePaths。 gulp 构建也是如此,您将 includePaths 传递给 sass 插件。

无论您的构建工具是什么,sass 都会将这些路径视为根路径,因此您可以直接导入它们,因此:

includePaths: ["anywhere/on/my/disk"]

您可以只使用@import 'styles' 而不是@import 'anywhere/on/my/disk/styles'

【讨论】:

在使用自动 CLI 命令将 Angular 5 升级到 Angular 7 后,npm test(使用 Karma)出现问题。原来angular.json 中的“test.options”部分也需要stylePreprocessorOptions 谢谢鲍里斯,我也遇到了同样的问题!【参考方案2】:

在使用meteor-scss 时,您可以使用 来引用项目路径的顶层,因此类似的方法会起作用。

@import "/node_modules/module-name/stylesheet";

您还可以使用 tilda 运算符 ~ 如果使用 webpack(或 angular-cli),则按照以下方式访问 node_modules 下的库 -- 感谢 @splintor

@import "~module-name/stylesheet";

【讨论】:

如果使用 webpack(或 angular-cli),访问node_modules 下的库也可以使用波浪号运算符 - @import "~module-name/stylesheet"; @Jessycormier 如答案 中所述,代表项目根目录。因此,从根目录(绝对引用)引用文件可能比从文件位置(例如通过../../)的相对引用更容易 Angular 的 webpack 配置和 Jetbrains 的 sass 工具都不知道如何用这种语法解决任何问题。 以上引用使用meteor-scss【参考方案3】:

angular-cli 的解决方案是将stylePreprocessorOptions 添加到.angular-cli.json


    "apps": [
        ...
        "stylePreprocessorOptions": 
            "includePaths": [
                "./app/global-styles"
            ]
        ,
        ...
    ]

如果您使用服务器端渲染,请记住为 s-s-r 和主应用程序构建添加此内容 - 否则您将获得 NodeInvocationException: Prerendering failed because of error: Error: Cannot find module 'C:\Users\...\ClientApp\dist-server\main.bundle.js'


    "apps": [
            ...
            "outDir": "dist",
            "stylePreprocessorOptions": 
                "includePaths": [
                    "./app/global-styles"
                ]
            ,
            ...
        ,
        
            ...
            "name": "s-s-r",
            "outDir": "dist-server",
            "stylePreprocessorOptions": 
                "includePaths": [
                    "./app/global-styles"
                ]
            ,
            ...
        
    ]

【讨论】:

【参考方案4】:

路径的定义取决于您的 Angular 版本。在我们的项目中,旧版本使用angular-cli.json,新版本使用angular.json

对于 "@angular/cli": "~1.7.4" 使用 angular-cli.json:

"stylePreprocessorOptions": 
    "includePaths": [
      "../src",
      "./scss"
    ]
  ,

对于“@angular/cli”:“~7.0.6”:

"stylePreprocessorOptions": 
    "includePaths": [
       "./src",
       "./src/scss"
    ]
 

【讨论】:

我可以补充一点,如果您使用预处理器路径,那么您不应该在导入中使用波浪号。我很难学会这一点。【参考方案5】:

如果我正确理解了这个问题,那么使用@import 'src/app/...' 可以正常工作。

例如

@import 'src/mixins';

请注意,路径上没有前导反斜杠。

(这是在 Angular 9 上测试的)

【讨论】:

【参考方案6】:

对我有用的是

/* file src/assets/scss/app.scss */

@import "src/assets/css/style";
    删除了文件名末尾的“.css”, 从“src/assets/...”导入(无反斜杠)

这从 Angular 11 + Webpack 中的 .scss 导入了一个 .css 文件,

【讨论】:

以上是关于相对于根目录的 SCSS 导入的主要内容,如果未能解决你的问题,请参考以下文章

webpack 3 sass-loader 无法导入没有相对路径的 scss 文件

sass在vue注意的地方

如何使用环境变量在 Nuxt 中动态导入 SCSS 样式表

如何从.net core 2.1 Angular 6模板中的非相对路径导入ts和scss文件

使用 SASS 时,如何从不同目录导入文件?

关于from . import 的一个问题