使用SASS时如何从其他目录导入文件?

spa*_*y21 81 import sass

在SASS中,是否可以从另一个目录导入文件?例如,如果我有这样的结构:

- root_directory
    - sub_directory_a
        - _common.scss
        - template.scss
    - sub_directory_b
        - more_styles.scss
Run Code Online (Sandbox Code Playgroud)

template.scss可以导入_common.scss,@import "common"但是more_styles.scss可以导入_common.scss吗?我尝试了一些不同的东西,包括@import "../sub_directory_a/common"@import "../sub_directory_a/_common.scss",但似乎没有任何工作.

Oli*_*ver 67

看起来SASS的一些变化使您最初尝试做的事情成为可能:

@import "../subdir/common";
Run Code Online (Sandbox Code Playgroud)

我们甚至将这个用于一些完全不相关的文件夹位于c:\projects\sass:

@import "../../../../../../../../../../projects/sass/common";
Run Code Online (Sandbox Code Playgroud)

只需加上足够的../,以确保你最终会在驱动器根目录,你很高兴.

当然,这个解决方案远非漂亮,但我无法从完全不同的文件夹中导入工作,既不使用I c:\projects\sass也不将环境变量SASS_PATH(从:: load_paths引用)设置为相同的值.

  • "只需添加足够的../,以确保你最终会在驱动器根目录,你很高兴." 哈哈哈,这让我的一天. (11认同)
  • 它"远非漂亮"!但这个答案得到了很多赞成.这真的被认为比`-I`更好吗?如果该路径名发生变化,将会有大量的搜索和替换; 并且它需要与共享.scss的任何人相同的本地文件夹结构 (8认同)
  • 我建议完全忽略这个答案.不幸的是,这是许多SO问题中的一个,这些问题在投票时回答错误.如果您希望代码轻松破解,请使用它.如果您需要强大的解决方案,请参阅下面的答案. (4认同)
  • @ adi518:我可以争论你的陈述"如果你想让你的代码轻易破解,请使用它." 从那以后,给定的解决方案一直在为我们工作(现在差不多4年),并没有破坏任何东西.我觉得这是一个可能有点脏的解决方案之一,但是可以快速完成工作,而不必深入研究所涉及的一些工具的内部结构. (2认同)

Mii*_*kka 33

您可以使用Ruby代码中的-I命令行开关或:load_paths选项添加sub_directory_a到Sass的加载路径.因此,如果您正在运行Sass root_directory,请执行以下操作:

sass -I sub_directory_a --watch sub_directory_b:sub_directory_b
Run Code Online (Sandbox Code Playgroud)

然后,你可以简单地使用@import "common"more_styles.scss.

  • 链`-I`标志包含多个目录,例如`sass -I sub_directory_a -I sub_directory_c --watch sub_directory_b:sub_directory_b` (3认同)

Sam*_*mmi 14

使用带有sass-loader的webpack我可以使用〜来引用项目根路径.例如,假设OPs文件夹结构,并且您在sub_directory_b中的文件中:

@import "~sub_directory_a/_common";
Run Code Online (Sandbox Code Playgroud)

请参阅sass-loader自述文件中的Usage/Imports下的内容:https://github.com/webpack-contrib/sass-loader

  • 这似乎是从`node_modules /`导入的,而不是从项目的根目录导入的。 (2认同)
  • 同意Splaktar。来自sass-loader文档:webpack提供了一种高级的机制来解析文件。sass-loader使用Sass的自定义导入器功能将所有查询传递到Webpack解析引擎。因此,您可以从node_modules导入Sass模块。只需在它们前面加上〜即可告诉webpack这不是相对导入...重要的是仅在其前面加上〜,因为〜/会解析到主目录。 (2认同)

hel*_*ode 8

导入.scss具有不同相对位置的嵌套导入的文件将不起作用.最常见的答案(使用很多../)只是一个肮脏的黑客,只要你添加足够../的东西到达项目的部署操作系统的根目录就可以工作.

  1. 添加目标SCSS路径作为SCSS编译器的搜索目标.这可以通过将stylesheets文件夹添加到scss配置文件中来实现,这是您正在使用的框架的功能,

使用:load_pathsconfig.rd基于罗盘的框架(例轨)

使用下面的代码scss-config.jsonfourseven/meteor-scss

{
  "includePaths": [
    "{}/node_modules/ionicons/dist/scss/"
  ]
}
Run Code Online (Sandbox Code Playgroud)
  1. 使用绝对路径(相对路径).

例如,fourseven/meteor-scss您可以使用{}以下示例突出显示项目的顶级

@import "{}/node_modules/module-name/stylesheet";
Run Code Online (Sandbox Code Playgroud)


小智 5

Gulp 将完成监视 sass 文件的工作,并使用 includePaths 添加其他文件的路径。例子:

gulp.task('sass', function() {
  return gulp.src('scss/app.scss')
    .pipe($.sass({
      includePaths: sassPaths
    })
    .pipe(gulp.dest('css'));
});
Run Code Online (Sandbox Code Playgroud)