【问题标题】:Dynamic imports for SCSS / Compass?SCSS / Compass 的动态导入?
【发布时间】:2013-01-24 19:57:53
【问题描述】:

我有一个 SCSS 项目,它通过 Compass 建立在 Foundation 之上。它定义了一组 sass 变量,然后根据这些变量定义了一堆规则:(我的项目有更多的变量设置和导入语句;这被简化了。)

vars.scss:

$foo = #fafafa
$bar = 14px;

// rules using $foo and $bar
@import '_rules';

然后我使用 compass 编译 vars.scss,对于那组 sass 变量来说一切都很好。但是,我还希望能够以不同的方式为我的应用程序设置主题,并通过定义一组可以覆盖原始变量的新变量来生成不同的主题:

vars.scss:

$foo = #fafafa
$bar = 14px;

@import 'otherVars';

@import '_rules';

当我有 70 多个主题时,我无法手动编辑文件。 (对于我的应用而言,拥有这么多主题是必要的。)我真正想要的是能够执行以下操作:

vars.scss:

$foo = #fafafa
$bar = 14px;

@import '{{otherVars}}';

@import '_rules';

然后我可以这样称呼:

compass --otherVars themes/theme2

这样就很容易抽出所有主题,因为我可以为每个主题调用一次compass。

SCSS 允许您这样做吗?我看了一下,好像不是这样的。

我目前的解决方法是将原来的vars.scss拆分成前缀和后缀:

_app_prefix.scss:

$foo = #fafafa
$bar = 14px;

_app_suffix.scss:

@import '_rules';

app.scss:

@import '_app_prefix';
// no overrides by default
@import '_app_suffix';

要为特定主题覆盖它,您需要创建一个如下所示的文件:

theme2.scss:

@import '_app_prefix';

// only override $foo - let the original value of $bar stand
$foo = #ebebeb;

@import '_app_suffix';

这可行,但有点痛苦并引入了额外的样板。

我的下一个问题是想要有额外的@import 'rules_foo' 语句,这些语句也需要动态构造。所以我的总体幻想是这样的:

vars.scss:

$foo = #fafafa
$bar = 14px;

@import '{{otherVars}}';

@import '_rules';
{{ @import 'additional_rules' for additional_rules in rules }}

我可以打电话:

compass --otherVars themes/theme2 --rules "rules_1" "rules_2" "rules_3"

(很明显,这有点手忙脚乱,但希望你能明白。)

有没有办法做到这一点?还是我必须求助于把手或其他模板语言?

【问题讨论】:

    标签: compass-sass sass


    【解决方案1】:

    对于使用 Grunt 编译 SCSS/SASS 文件的人,解决方案是在“sass”任务配置中添加一个额外的参数 loadPath,如下所示:

    sass: {
      options: {
        loadPath: ['../src/css/themes/myTheme/'],
        style: 'nested',
        precision: 2
      },
    

    然后在 /src/css/import.scss 中,您可以包含主题中的这些文件,就好像它们在当前目录中一样:

    @import "config";
    

    该文件来自 /src/css/themes/myTheme/config.scss。

    注意:您当然可以为 Grunt 任务添加一个参数,并让主题名称动态化!

    【讨论】:

      【解决方案2】:

      您总是可以生成一个临时文件发送到指南针。用python代码:

      import sys
      with open('tmp.scss', 'w') as out:
          out.write(("""
      $foo = #fafafa
      $bar = 14px;
      
      @import '%(pre-rules)s';
      
      @import '_rules';
      %(post-rules)s
          """ % {'pre-rules': sys.argv[1], 'post-rules': '\n'.join(["@import '%s';" % x for x in sys.argv[2:]])}).strip())
      

      你可以这样称呼它:

      python stackoverflow.py themes/theme2 rules_1 rules_2 rules_3
      

      它会使用您想要的输出创建/覆盖 tmp.scss。

      【讨论】:

      • 是的,但它在构建时不能动态设置,并且不允许多次导入。
      • 嗯,是的,好吧,你是对的......我改变了我的答案以更接近你的问题。希望有帮助!
      • 是的,我目前正在采用这种方法(我正在使用车把)。我希望有一些不那么老套的东西。
      猜你喜欢
      • 2020-08-23
      • 1970-01-01
      • 1970-01-01
      • 2021-05-11
      • 2020-02-18
      • 1970-01-01
      • 2022-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多