SCSS 파일로 일반 CSS 파일을 가져 오시겠습니까?


509

어쨌든 Sass의 @import명령 으로 일반 CSS 파일을 가져올 수 있습니까? sass의 모든 SCSS 구문을 사용하지는 않지만 여전히 결합 / 압축 기능을 즐기고 있으며 모든 파일의 이름을 * .scss로 바꾸지 않고 사용할 수 있기를 원합니다.


1
예, 방법이 있습니다 : @input 문에서 CSS 파일 경로에서 '.css'확장자를 제거하십시오 :) (sass 버전> = 3.2에서 작동)
Kamil Kiełczewski

2018 년 현재 일반 CSS 파일에서 SASS@import 를 사용 하면 일반 CSS @import 만 생성해야합니다 . 이는 하나 이상의 HTTP 요청을 의미하며 결합하거나 압축하지 않습니다. 일부 구현이 다르게 작동하면 언어 사양과 다른 비표준 기능이라고 말합니다.
Álvaro González

답변:


215

이 글을 쓰는 시점에서 이것이 구현되지 않은 것처럼 보입니다.

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

libsass (C / C ++ 구현)의 경우 가져 오기는 파일 *.css과 같은 방식으로 작동 *.scss합니다. 확장자는 생략하면됩니다.

@import "path/to/file";

가져옵니다 path/to/file.css.

자세한 내용은 이 답변 을 참조 하십시오.

Ruby 구현에 대한 이 답변 을 참조하십시오 (sass gem)


23
@kleinfreund는 Sass 3.3.1에서는 사실이 아닙니다. 이 @import문장은 전혀 변경되지 않고 결과 CSS 파일에 나타납니다. Sass는 @GSto와 같이 참조되는 CSS 파일을 포함하지 않습니다. Sass 3.4 또는 4.0에서 구현 될 것 같습니다
fregante

1
Gulp 또는 Grunt를 사용하는 경우 다른 도구를 사용하여 CSS 파일을 가져 오면 더 쉽고 지금 작동합니다 . gulp-import-css를 사용 하는데 그런트가 무엇인지 잘 모르겠습니다.
fregante

3
libsass적어도 작동합니다 . 답변 stackoverflow.com/questions/7111610/… 및 PR github.com/sass/libsass/pull/754
ivn

"가져 오기는 파일 *.css과 같은 방식으로 작동 *.css합니다" 는 팽팽한 설명입니다. 당신은 그들 중 하나가되어야한다는 것을 의미 *.scss했습니다.
underscore_d

1
v3.5.3부터 libsass는 이것이 표준이 아닌 동작이므로 의존해서는 안된다고 경고합니다. (대신에 "이 동작을 유지하기 위해 사용자 정의 입력기를 사용합니다.") github.com/sass/libsass/releases/tag/3.5.3
iX3

383

같은 문제를 겪은 후 여기의 모든 답변과 github의 sass 저장소에 대한 의견과 혼동되었습니다.

2014 년 12 월부터이 문제가 해결되었음을 알려 드리고자합니다. 이제 css파일을 sass 파일로 직접 가져올 수 있습니다. github 의 다음 PR 은 문제를 해결합니다.

@import "your/path/to/the/file"파일 이름 뒤에 확장자가없는 구문은 now-와 동일 합니다. 파일을 직접 가져옵니다. *.css끝에 추가 하면 css규칙으로 변환됩니다 @import url(...).

webpack 과 같은 "멋진"새로운 모듈 번 들러 를 사용하는 ~경우 경로의 시작 부분에 사용해야 합니다. 따라서 다음 경로를 가져 오려면 다음과 node_modules/bootstrap/src/core.scss같이 작성하십시오
@import "~bootstrap/src/core".

참고 :
모든 사람에게 해당되는 것은 아닙니다. 귀하의 통역사가 libsass그것을 기반으로 한다면 제대로 작동 해야 합니다 ( 이것을 확인 하십시오 ). 나는 @importnode-sass를 사용하여 테스트 했으며 정상적으로 작동합니다. 불행히도 이것은 작동하며 일부 루비 인스턴스에서는 작동하지 않습니다.


1
이것은 구현 된 것처럼 보이지만 libsass루비 구현 sass를 사용할 때이 구문이 작동하는 것처럼 보이지만 sass-css-importer필요한 경우에만 가능 합니다. 적어도 그것은 내가보고있는 것입니다. 다른 사람이 이것을 확인할 수 있습니까?
bsara

5
최신 버전의 sass를 가지고 있습니까? 나는 잠시 동안이 구문을 사용하고있다 그리고 그것은 모두 잘 작동 rubynodejs통역. 파일 이름 뒤에 확장자를 넣지 않았는지 확인 했습니까? 올바른 구문은 @import "path/to/style/file( .css확장자 없이 )
tftd

4
내 Gemfile.lock에 따라 루비 sass v3.4.18 (Jekyll 포함)을 사용하고 있습니다. 아직도보고 Error: File to import not found or unreadable: cssdep/cssfile있습니다. 내가 그것을 만들면 cssdep/cssfile.scss갑자기 작동합니다. 따라서 경로 문제가 아니며 어떤 이유로 SASS에서 '.css'파일을 포함시킬 수 없습니다. (
thom_nic

1
ruby -v: ruby 2.2.2p95 (2015-04-13 revision 50295) [x64-mingw32] sass -v: Sass 3.4.17 (Selective Steve)여기서 일하지 않음
Cyril CHAPON

5
감사합니다! Node-sass를 사용하여 normalize.css를 가져올 수있었습니다@import "node_modules/normalize.css/normalize";
Nick

260

포함 할 css 파일에 밑줄을 추가하고 확장자를 scss (예 :)로 전환해야합니다 _yourfile.scss. 그런 다음이 방법으로 호출하면됩니다.

@import "yourfile";

그리고 CSS 표준 @import 지시문을 사용하는 대신 파일 내용이 포함됩니다.


1
컨벤션과 표준에 관한 것일 수도 있습니다.
David Morales

70
밑줄은 별도의 파일로 컴파일되지 않도록하는 것입니다.
요나

4
누군가 궁금해하는 경우 Sass의 SCSS 구문이 CSS3의 상위 집합이기 때문에 이것이 작동합니다. 세미콜론이 필요한 이유이기도합니다.
Jacob Wan

46
예를 들어 일부 공급 업체 CSS 파일의 확장자를 변경할 수 없습니다.
Slava Fomin II

7
컴퓨터 / 서버에 있다면 가능합니다! 그리고 원하지 않으면 심볼릭 링크도 있습니다.
ste

260

이것은 구현 및 버전부터 병합 된 3.2( 풀 # 754 에 합병 2015년 1월 2일 을 위해 libsass: 문제 originaly 여기에 정의 된 sass# 193 # 556 , libsass# 318 ).

긴 이야기를 짧게 줄이려면 다음 구문을 사용하십시오.

  1. 원시 CSS 파일을 가져 오기 (포함)

    구문은 끝에 확장 이 없습니다.css (부분을 실제로 읽은 s[ac]ss|css후 SCSS / SASS에 인라인으로 포함).

    @import "path/to/file";

  2. 전통적인 방식으로 CSS 파일을 가져 오기

    구문은, 전통적인 방법으로 진행 .css연장 끝에 (에 결과를 @import url("path/to/file.css");컴파일 CSS 인치) :

    @import "path/to/file.css";

그리고 그것은 훌륭합니다 :이 구문은 우아하고 간결하며 이전 버전과 호환됩니다! 그것은과 뛰어난 작동 libsass하고 node-sass.

__

의견에 대한 추가 추측을 피하려면 다음과 같이 명시 적으로 작성하십시오. Ruby 기반 Sass 는 7 년간의 토론 후에도이 기능이 아직 구현되지 않았습니다 . 이 답변을 작성할 때 4.0에서는 아마도의 도움으로 이것을 달성하는 간단한 방법이있을 것이라고 약속했습니다 @use. 새로운 "예정된" "제안 승인"태그가 문제 # 556 과 새로운 @use기능 에 할당 된 것 같습니다 .

무언가가 변하자마자 답변이 업데이트 될 수 있습니다 .


3
명확히하기 위해 CSS를 sass로 가져 오는 것이 나를 위해 다음과 같이 작동했습니다. @import url ( "path / to / file-without-css-extension");
Craig Wayne

1
루비 기반 버전의 sass에서는 실제로 작동하지 않습니다. 예를 들어, sass myFile.scss : output.css 명령은 css 가져 오기와 함께 실패하지만 .css 파일의 확장자를 .scss로 변경하면 작동합니다. 이 의견을 쓰는 시점에서 최신 버전으로 실행하십시오 : 3.4.22 / Selective Steve. 이는 grunt-contrib-sass와 같이 루비 버전을 사용하는 모든 작업 실행자에게도 영향을 미칩니다.
ansorensen 2016 년

@ansorensen, 나는 당신 측에서 혼란이 있다고 생각합니다. ".css 파일의 확장자를 .scss로 변경할 때 작동합니다"는 무슨 뜻 입니까? 전체 아이디어는 정규 CSS 파일 과 두 가지 작업 방식에 관한 것입니다 (SCSS 가져 오기와 혼동하지 마십시오). 질문과 답변을 한 번 더 읽으십시오.
Farside

@Farside 혼란이 없습니다. Ruby의 최신 버전의 sass gem에서는 'path / to / file'가져 오기 구문이 작동하지 않습니다. 가져 오기로 sass를 실행하면 가져온 경로의 파일 확장자가 .scss 인 경우 가져 오기가 성공적으로 수행되고 파일에 .css가 있으면 실패합니다. 이 질문은 CSS를 scss로 가져 오기를 요구하며 lib-sass 및 node-sass에 대한 답변을 제공합니다. 이 기능은 루비 기반 버전의 sass에는 해당되지 않습니다.
ansorensen 2016 년

1
@ ansorensen, omg, 당신에게서 많은 텍스트가 있습니다 ... 나는 명시 적이며 다른 사람을 혼동하지 않습니다. Node-sassNode.js 라이브러리 LibSass ( C 버전 의 Sass)입니다. 단일 언급이 아니 libsass거나 node-sass루비에 근거한 것이 아니며, 원래 질문에서만 RUBY 버전에 대한 단일 언급이 아닙니다. 다음 번에 3 개의 주석을 작성하기 전에주의 깊게 읽으십시오. 나는 모든 참조를 가지고 있습니다 : 이슈 # 193에 따라 루비 버전에 대해 5 년간 토론 한 후에도 여전히 구현되지 않았으며, ver. 4.0 을 사용할 수 있습니다.
Farside

37

Chris Eppstein은 인라인 CSS 가져 오기 기능을 갖춘 나침반 플러그인을 만들었습니다.

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

이제 CSS 파일 가져 오기는 다음과 같이 쉽습니다.

@import "CSS:library/some_css_file"

3
더 이상 사용되지 않는 시작점을 사용하여 실패했습니다. "무엇을 할 수는 없겠지만 ..."처음 나왔을 때 좋았지 만 다시 작동하려면 업데이트가 필요하거나 더 이상 사용되지 않는 플러그인을 설치해야합니다. 감사합니다, C§
CSS

18

.css수정하지 않으려 는 파일 이있는 경우 확장명을 변경하지 마십시오 .scss( 예 :이 파일은 유지 관리하지 않는 분기 된 프로젝트의 파일 임). 항상 심볼릭 링크를 만든 다음로 가져올 수 있습니다 .scss.

심볼릭 링크를 만듭니다.

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


symlink 파일을 대상으로 가져옵니다 .scss.

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


대상 출력 .css파일은 .scssCSS 가져 오기 규칙이 아닌 가져온 symlink 파일의 컨텐츠를 보유합니다 ( @yaz가 댓글이 많은 투표로 언급 함 ). 확장명이 다른 파일이 중복되어 있지 않으므로 초기 .css파일 내에서 이루어진 모든 업데이트가 즉시 대상 출력으로 가져옵니다.

심볼릭 링크 (Symlink 또는 Soft Link)는 절대 또는 상대 경로 형식으로 다른 파일에 대한 참조를 포함하고 경로 이름 확인에 영향을주는 특수한 유형의 파일입니다.
http://en.wikipedia.org/wiki/Symbolic_link


9
심볼릭 링크를 추가하는 것은 매우 휴대용 솔루션 (즉, 여러 개발자 또는 빌드 시스템) 아니다
LocalPCGuy

@LocalPCGuy .css, 예를 들어 공유 리포지토리를 통해 모든 파일 ( 및 생성 된 symlink)을 모두가 사용할 수있는 경우입니다.
Nik Sumeiko

방금이 작업을 수행 하고이 스레드의 sym 링크에 대해 답변하려고했지만 이미 여기에 있습니다. 이 요구가 드물다는 것은 사실이지만, 제 상황은 CSS 파일을 전혀 수정하지 않기를 원했기 때문에 (바우어 파일이기 때문에) 심볼릭 링크를 만들고 가져 오기가 완벽하게 작동했습니다.
Aaron Krauss

2
들어 윈도우 사용자, 동일한 기능이 다른 구문을 것 mklink /H <link> <target>, 그것은라고 하드 링크 @mrsafraz.
Farside

5

써드 파티 importer를 사용하여 @import시맨틱 을 사용자 정의 할 수 있습니다 .

노드 말대꾸-수입 한 번 작동, 노드 말대꾸 (Node.js를위한)은 수입 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 실패

일반적으로, 사용자 정의 수입이 변경 될 수 있음을 알고 있는 수입 의미를. 사용하기 전에 문서를 읽으십시오.


4

내가 올바른 CSS가 scss와 호환되면 CSS 확장을 scss로 변경할 수 있으며 계속 작동해야합니다. 확장명을 변경하면 해당 확장명을 가져올 수 있으며 파일에 포함됩니다.

그렇게하지 않으면 sass는 원하지 않는 CSS @import를 사용합니다.


16
불행히도 때때로 가져온 정적 CSS 파일은 일부 정적 자산을 패키지하는 라이브러리에서와 같이 제어 할 수 없습니다.
에릭 Drechsel

2

나는 우아한 Rails와 같은 방법을 알아 냈습니다. 먼저 .scss파일 이름을로 바꾸고 .scss.erb다음과 같은 구문을 사용하십시오 ( highlight_js-rails4 gem CSS asset의 예 ).

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

SCSS를 통해 파일을 직접 호스팅 할 수없는 이유 :

이렇게 @importSCSS에서하는 것은 당신이 명시 적으로 전체 경로 중 하나 또는 다른 방법을 사용뿐만 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.erbSCSS를 Rails 용 템플릿으로 효과적으로 전환했습니다. 이제 <%= ... %>템플릿 태그를 사용할 때마다 Rails 템플릿 프로세서는 이러한 스 니펫을 다른 템플릿과 마찬가지로 코드 출력으로 대체합니다.

파일에 진술 asset_path("highlight_js/github")하면 .scss.erb두 가지 작업이 수행됩니다.

  1. rake assets:precompile적절한 CSS 파일을 미리 컴파일 하도록 작업을 트리거 합니다.
  2. Rails 환경에 관계없이 자산을 적절하게 반영하는 URL을 생성합니다.

이것은 또한 SCSS 엔진이 CSS 파일을 파싱하지도 않는다는 것을 의미합니다. 그것은 단지 그것에 링크를 호스팅하고 있습니다! 따라서 호키 멍키 패치 또는 중대한 해결 방법이 없습니다. 우리는 의도 한대로 SCSS를 통해 CSS 자산을 제공하고 있으며 Rails의 의도대로 CSS 자산의 URL을 사용하고 있습니다. 단!


나에게 해결책은 약간 그늘진 것처럼 보이고 해킹처럼 들립니다. 그러나 조사에 좋은 일입니다!
Farside

0

간단한 해결 방법 :

전체 또는 거의 모든 CSS 파일은 마치 scss처럼 해석 될 수 있습니다. 또한 블록 내부로 가져올 수도 있습니다. CSS의 이름을 scss로 바꾸고 가져옵니다.

실제 구성에서는 다음을 수행합니다.

먼저 .css 파일을 임시 파일로 복사합니다. 이번에는 확장자가 .scss입니다. 그런트 구성 예 :

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-interpretable artifact가 포함되어 있는지 확인하십시오 (불가능하지만 발생하면 결과를 디버깅하기가 어렵고 위험합니다).


-3

이제 다음을 사용하여 가능합니다.

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

3
gem sass-css-importer이 설치되어있는 경우에만 sass가 스위치 -r sass-css-importer와 함께 호출되고 .css파일 경로에서 생략됩니다.
Bernhard Döbler

-4

이 작동하는지 확인할 수 있습니다.

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

Chriss Epstein의 신용 : https://github.com/sass/sass/issues/193


1
scss 파일에서 이것을 어떻게 사용할 수 있습니까?
Adrian Ber

-10

단순한.

@import "경로 /to/file.css";


6
나는 이것을 시도했지만 파일을 압축 할 때 파일의 내용을 그 내용으로 가져 가지 않을 것입니다. @ import 줄만 유지합니다.
GSto

1
가장 낮은 점수의 답변이지만, 아이러니하게도, 이것은 올바른 방법으로 보입니다. 접미사를 포함시키는 것이 옳은 일입니다.
Wyck
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.