ChatGPT解决这个技术问题 Extra ChatGPT

在 SCSS 文件中导入常规 CSS 文件?

无论如何要使用 Sass 的 @import 命令导入常规 CSS 文件吗?虽然我没有使用 sass 中的所有 SCSS 语法,但我仍然喜欢它的组合/压缩功能,并且希望能够在不将所有文件重命名为 *.scss 的情况下使用它

是的,有一种方法:只需在 @input 语句中的 css 文件路径中删除 '.css' 扩展名 :) (适用于 sass 版本 >=3.2)
截至 2018 年,在常规 CSS 文件中使用 SASS @import 应该只生成常规 CSS @import。这意味着多了一个 HTTP 请求,并且没有合并或压缩。如果某些实现的行为不同,那么我会说这是一个与语言规范不同的非标准功能。

t
tftd

在遇到同样的问题后,我对这里的所有答案以及对 github 中 sass 存储库的评论感到困惑。

我只想指出,截至 2014 年 12 月,这个问题已经得到解决。现在可以将 css 文件直接导入到您的 sass 文件中。 github 中的以下 PR 解决了该问题。

语法与现在相同 - @import "your/path/to/the/file",文件名后没有扩展名。这将直接导入您的文件。如果您在末尾附加 *.css,它将转换为 css 规则 @import url(...)

如果您使用一些“花哨”的新模块捆绑器,例如 webpack,您可能需要在路径的开头使用 use ~。因此,如果您想导入以下路径 node_modules/bootstrap/src/core.scss,您可以编写类似
@import "~bootstrap/src/core" 的内容。

注意:
看来这并不适合所有人。如果您的解释器基于 libsass,它应该可以正常工作(结帐 this)。我已经在 node-sass 上使用 @import 进行了测试,它工作正常。不幸的是,这在某些 ruby 实例上有效并且不起作用。


这似乎在 libsass 中实现,但是当使用 sass 的 ruby 实现时,这种语法似乎有效,但前提是您需要 sass-css-importer。至少这是我所看到的。其他人可以证实这一点吗?
你确定你有最新版本的 sass 吗?我使用这种语法已经有一段时间了,它适用于 rubynodejs 解释器。您是否检查过您是否没有在文件名后放置扩展名?正确的语法是 @import "path/to/style/file(没有 .css 扩展名)
根据我的 Gemfile.lock,我正在使用 ruby sass v3.4.18(带有 Jekyll)。仍然看到 Error: File to import not found or unreadable: cssdep/cssfile。如果我创建一个 cssdep/cssfile.scss 它会突然起作用。所以不是路径问题,出于某种原因,我仍然无法包含来自 SASS 的“.css”文件 :(
ruby -v : ruby 2.2.2p95 (2015-04-13 revision 50295) [x64-mingw32] sass -v : Sass 3.4.17 (Selective Steve) 在这里不工作
这次真是万分感谢!我能够使用带有 @import "node_modules/normalize.css/normalize"; 的 node-sass 导入 normalize.css
F
Farside

这是从版本 3.2 开始实施和合并的(pull #7542015 年 1 月 2 日合并为 libsass,问题最初在此处定义:sass#193 #556、{6 }#318)。

长话短说,接下来的语法:

导入(包含)原始 CSS 文件,语法是**没有 `.css`** 扩展名(导致实际读取部分 `s[ac]ss|css` 并将其包含在内联到 SCSS/ SASS): @import "路径/到/文件";以传统方式导入 CSS 文件 语法以传统方式进行,**带有 `.css` 扩展名** 在末尾(结果为 `@import url("path/to/file.css");` in你编译的 CSS): @import "path/to/file.css";

而且非常好:这种语法优雅简洁,而且向后兼容!它与 libsassnode-sass 配合得很好。

__

为避免在评论中进一步猜测,请明确写下:基于 RubySass 在经过 7 年的讨论后仍然未实现此功能。在撰写此答案时,已承诺在 4.0 中将有一种简单的方法来完成此操作,可能需要 @use 的帮助。似乎很快就会有一个实现,新的 “计划” “Proposal Accepted” 标记已分配给 issue #556 和新的 @use 功能。

UPD: 2020 年 10 月 26 日lib-sass was deprecated,因此 issue #556 立即关闭

__

答案可能会更新,一旦发生变化。


澄清一下,将 css 作为 sass 导入对我来说是这样的:@import url("path/to/file-without-css-extension");
这实际上不适用于基于 ruby 的 sass 版本。例如,命令:sass myFile.scss:output.css 在导入 css 时失败,但在将 .css 文件的扩展名更改为 .scss 时有效。使用撰写此评论时的最新版本运行:3.4.22 / Selective Steve。这也会影响任何使用 ruby 版本的任务运行器,例如 grunt-contrib-sass。
@ansorensen,我认为您对此感到困惑。 “将 .css 文件的扩展名更改为 .scss 时有效”是什么意思?整个想法完全是关于常规 CSS 文件,以及使用它们的两种方式(不要与导入 SCSS 混淆)。请再读一遍问题和答案。
@Farside 没有混淆。 Import 'path/to/file' 语法在 Ruby 中最新版本的 sass gem 中不起作用。当我使用导入运行 sass 时,当导入路径中的文件具有 .scss 扩展名时导入成功,而当文件具有 .css 时导入失败。该问题要求将 css 导入 scss,并且您提供了 lib-sass 和 node-sass 的答案。我评论说这个功能不在基于 ruby 的 sass 版本中。
@ansorensen,天哪,你发了这么多文字......我很明确,不要混淆任何人。 Node-sass 是一个 Node.js 库 LibSass(Sass 的 C 版本)。没有一次提到 libsassnode-sass 是基于 Ruby 的,也没有只在原始问题中提到 RUBY 版本。请仔细阅读,然后再连续写 3 条评论。我有所有的参考资料:根据 issue#193,经过 5 年的 Ruby 版本讨论后仍未实现,他们仅在 ver 时承诺此功能。 4.0 将可用。
D
DaveAlden

截至撰写本文时,这似乎尚未实现:

https://github.com/sass/sass/issues/193

对于 libsass(C/C++ 实现),导入对 *.css 的工作方式与对 *.scss 文件的工作方式相同 - 只需省略扩展名:

@import "path/to/file";

这将导入 path/to/file.css

有关详细信息,请参阅 this answer

请参阅 this answer 了解 Ruby 实现(sass gem)


@kleinfreund 不适用于 Sass 3.3.1。 @import 语句根本没有更改,并出现在生成的 CSS 文件中,Sass 不包括 @GSto 要求的引用的 CSS 文件。 It looks like it will be implemented in Sass 3.4 or 4.0
如果您使用 Gulp 或 Grunt,只需使用不同的工具来导入您的 CSS 文件,它会更容易并且现在可以使用。我使用 gulp-import-css,我不确定 Grunt 的等价物是什么。
它至少适用于 libsass。查看答案 stackoverflow.com/questions/7111610/… 和 PR github.com/sass/libsass/pull/754
“对 *.css 的导入与对 *.css 文件的导入方式相同” 是重言式。你的意思是其中之一是*.scss,对吧?
从 v3.5.3 开始,libsass 警告这是非标准行为,不应依赖。 (改为“使用自定义导入器来维护此行为。”)github.com/sass/libsass/releases/tag/3.5.3
R
Rubens Mariuzzo

您必须在要包含的 css 文件前添加下划线,并将其扩展名切换为 scss(例如:_yourfile.scss)。然后你只需要这样称呼它:

@import "yourfile";

它将包含文件的内容,而不是使用 CSS 标准的 @import 指令。


谢谢!这行得通,但我发现我不需要在前面加上下划线就可以了。下划线有什么我遗漏的吗?
下划线是为了防止它被编译为一个单独的文件。
如果有人想知道,这是因为 Sass 的 SCSS 语法是 CSS3 的超集。这也是为什么需要分号的原因。
例如,您不能更改某些供应商 CSS 文件的扩展名。
如果它在您的计算机/服务器上,您可以!如果你不想的话,还有符号链接。
R
Rafal Pastuszak

大家好消息,Chris Eppstein 创建了一个具有内联 css 导入功能的指南针插件:

https://github.com/chriseppstein/sass-css-importer

现在,导入 CSS 文件非常简单:

@import "CSS:library/some_css_file"

由于使用已弃用的起点而失败。 “什么是,但永远不可能......”我确信它刚推出时很棒,但它需要更新才能再次运行,或者您必须安装已弃用的插件。谢谢,C§
M
Moshe Katz

如果您有不想修改的 .css 文件,也不要将其扩展名更改为 .scss例如,此文件来自您不维护的分叉项目),您可以始终创建符号链接,然后将其导入到您的 .scss

创建符号链接:

ln -s path/to/css/file.css path/to/sass/files/_file.scss


将符号链接文件导入目标 .scss

@import "path/to/sass/files/file";


您的目标输出 .css 文件将包含来自导入的符号链接 .scss 文件的内容,而不是 CSS 导入规则(@yaz 以最高评论票数提及)。而且您没有具有不同扩展名的重复文件,这意味着在初始 .css 文件中进行的任何更新都会立即导入您的目标输出。

符号链接(也称为符号链接或软链接)是一种特殊类型的文件,它以绝对或相对路径的形式包含对另一个文件的引用,并且会影响路径名解析。 – http://en.wikipedia.org/wiki/Symbolic_link


添加符号链接不是一个非常便携的解决方案(即多个开发人员或构建系统)
@LocalPCGuy 例如,当每个文件(.css 和创建的符号链接)都可以通过共享存储库供所有人使用时。
我刚做了这个,打算回答这个线程上的符号链接,但很高兴它已经在这里了!确实,这种需求很少见,但我的情况是根本不想修改 CSS 文件(因为它是一个 bower 文件),所以构建一个符号链接并导入效果很好。
对于 Windows 用户,相同的功能会有不同的语法 mklink /H <link> <target>,它被称为 硬链接 @mrsafraz。
j
joews

您可以使用第三方 importer 自定义 @import 语义。

node-sass(用于 Node.js)一起使用的 node-sass-import-once 可以内联导入 CSS 文件。

直接使用示例:

var sass = require('node-sass');,
    importOnce = require('node-sass-import-once');

sass.render({
  file: "input.scss",
  importer: importOnce,
  importOnce: {
    css: true,
  }
});

示例 grunt-sass 配置:

var importOnce = require("node-sass-import-once");
grunt.loadNpmTasks("grunt-sass");

grunt.initConfig({
  sass: {
    options: {
      sourceMap: true,
      importer: importOnce
    },
    dev: {
      files: {
        "dist/style.css": "scss/**/*.scss"
      }
    }
  });

请注意,node-sass-import-once 当前无法在没有显式前导下划线的情况下导入 Sass 部分。例如文件 partials/_partial.scss

@import partials/_partial.scss 成功

@import * partials/partial.scss 失败

通常,请注意自定义导入器可以更改任何导入语义。在开始使用之前阅读文档。


P
Pickels

如果我是正确的 css 与 scss 兼容,那么您可以将 css 的扩展名更改为 scss,它应该可以继续工作。更改扩展名后,您可以将其导入,它将包含在文件中。

如果您不这样做,那么 sass 将使用您不想要的 css @import。


不幸的是,有时导入的 css 文件超出了您的控制范围,例如在包含一些静态资产的库中。
S
Synthead

我想出了一种优雅的、类似 Rails 的方式来做到这一点。首先,将您的 .scss 文件重命名为 .scss.erb,然后使用如下语法(highlight_js-rails4 gem CSS asset 的示例):

@import "<%= asset_path("highlight_js/github") %>";

为什么不能直接通过 SCSS 托管文件:

只要您以一种或另一种方式明确使用完整路径,在 SCSS 中执行 @import 就可以很好地处理 CSS 文件。在开发模式下,rails s 提供资源而不编译它们,因此这样的路径有效...

@import "highlight_js/github.css";

...因为托管路径实际上是 /assets/highlight_js/github.css。如果您右键单击页面并“查看源代码”,然后单击带有上述 @import 的样式表的链接,您将在其中看到如下所示的一行:

@import url(highlight_js/github.css);

SCSS 引擎将 "highlight_js/github.css" 转换为 url(highlight_js/github.css)。直到您决定尝试在预编译资产的生产环境中运行它并在文件名中注入哈希,这将顺利运行。 SCSS 文件仍将解析为未预编译且在生产中不存在的静态 /assets/highlight_js/github.css

该解决方案的工作原理:

首先,通过将 .scss 文件移动到 .scss.erb,我们有效地将 SCSS 变成了 Rails 的模板。现在,每当我们使用 <%= ... %> 模板标签时,Rails 模板处理器都会将这些片段替换为代码的输出(就像任何其他模板一样)。

.scss.erb 文件中声明 asset_path("highlight_js/github") 有两个作用:

触发 rake assets:precompile 任务以预编译适当的 CSS 文件。无论 Rails 环境如何,都会生成适当反映资产的 URL。

这也意味着 SCSS 引擎甚至没有解析 CSS 文件。它只是托管它的链接!因此,没有胡说八道的猴子补丁或严重的变通办法。我们按照预期通过 SCSS 提供 CSS 资产,并按照 Rails 的预期使用指向所述 CSS 资产的 URL。甜的!


对我来说,这个解决方案似乎有点阴暗,听起来更像是一个黑客。但调查工作做得很好!
D
David Asbill

要将常规 CSS 文件导入 Sass:

官方 Sass 文档:Import CSS into Sass

https://i.stack.imgur.com/F6yyw.jpg


p
peterh

简单的解决方法:

所有或几乎所有 css 文件也可以解释为好像它是 scss。它还可以将它们导入块中。将 css 重命名为 scss,然后将其导入。

在我的实际配置中,我执行以下操作:

首先,我将 .css 文件复制到一个临时文件中,这次使用 .scss 扩展名。 Grunt 示例配置:

copy: {
    dev: {
        files: [
            {
                src: "node_modules/some_module/some_precompiled.css",
                dest: "target/resources/some_module_styles.scss"
            }
        ]
    }
}

然后你可以从你的父 scss 导入 .scss 文件(在我的例子中,它甚至被导入到一个块中):

my-selector {
  @import "target/resources/some_module_styles.scss";
  ...other rules...
}

注意:这可能很危险,因为它会有效地导致 css 被多次解析。检查您的原始 css 是否包含任何 scss 可解释的工件(这是不可能的,但如果发生,结果将难以调试并且很危险)。


S
Shlomi Schwartz

现在可以使用:

@import 'CSS:directory/filename.css';

仅当安装了 gem sass-css-importer 时,使用开关 -r sass-css-importer 调用 sass 并且从文件路径中省略 .css
M
Macario

我可以确认这是有效的:

class CSSImporter < Sass::Importers::Filesystem
  def extensions
    super.merge('css' => :scss)
  end
end

view_context = ActionView::Base.new
css = Sass::Engine.new(
  template,
  syntax:     :scss,
  cache:      false,
  load_paths: Rails.application.assets.paths,
  read_cache: false,
  filesystem_importer: CSSImporter # Relevant option,

  sprockets:  {
    context:     view_context,
    environment: Rails.application.assets
  }
).render

感谢克里斯·爱泼斯坦:https://github.com/sass/sass/issues/193


你如何在你的 scss 文件中使用它?
A
Adam Stacoviak

简单的。

@import "路径/到/file.css";


我已经尝试过了,但是在压缩文件时它不会将文件的内容拉到那个文件中,它只会保留@import 行。
最低分的答案,但具有讽刺意味的是,现在这似乎是正确的方法。包括后缀是正确的做法。