SCSS dosyasında normal CSS dosyası içe aktarılsın mı?


509

Sass'ın @importkomutuyla normal bir CSS dosyasını içe aktarmak için yine de var mı ? Sass'ın tüm SCSS sözdizimini kullanmama rağmen, yine de özellikleri birleştiren / sıkıştıran zevk alıyorum ve tüm dosyalarımı * .scss olarak yeniden adlandırmadan kullanabilmek istiyorum


1
Evet, bir yol var: @input deyiminde css dosya yolundaki '.css' uzantısını kaldırın :) (sass sürümü için çalışır> = 3.2)
Kamil Kiełczewski

2018 itibariyle, SASS'ı@import normal bir CSS dosyasında kullanmak sadece normal bir CSS @import oluşturmalıdır . Bu, bir HTTP isteğinin daha fazla olması ve birleştirilmemesi veya sıkıştırılmaması anlamına gelir. Bazı uygulamalar farklı davranıyorsa, dil spesifikasyonundan farklı olan standart olmayan bir özellik olduğunu söyleyebilirim.
Álvaro González

Yanıtlar:


215

Bu yazının yazıldığı tarih itibariyle bunun uygulanmadığı anlaşılıyor:

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

Libsass (C / C ++ uygulaması) için içe aktarma *.css, *.scssdosyalar için olduğu gibi çalışır - uzantıyı atlamanız yeterlidir :

@import "path/to/file";

Bu içe aktarılacak path/to/file.css.

Daha fazla ayrıntı için bu cevaba bakınız.

Ruby uygulaması için bu cevaba bakınız (sass gem)


23
@kleinfreund Sass 3.3.1 ile doğru değildir. @importDeyim çıkan CSS dosyasındaki tüm ve görünmeden de değişmez, Sass @GSto gibi başvurulan CSS dosyası istiyor içermez. Sass 3.4 veya 4.0'da uygulanacak gibi görünüyor
fregante

1
Gulp veya Grunt kullanıyorsanız, CSS dosyalarınızı içe aktarmak için sadece farklı bir araç kullanın, daha kolay ve şimdi çalışıyor . Kullandığım yudum-ithalat-css Eminim Grunt eşdeğer ne değilim.
fregante

3
libsassEn azından ile çalışır . Stackoverflow.com/questions/7111610/… ve PR'ye
ivn

"İçe aktarma dosyalar *.cssiçin olduğu gibi çalışır *.css" bir totolojidir. Bunlardan birinin olmasını istedin *.scssdeğil mi?
underscore_d

1
V3.5.3'ten başlayarak, libsass bunun standart dışı bir davranış olduğu ve buna güvenilmemesi gerektiği konusunda uyarır. (Bunun yerine "Bu davranışı korumak için özel bir ithalatçı kullanın.") Github.com/sass/libsass/releases/tag/3.5.3
iX3

383

Aynı sorunu yaşadıktan sonra, buradaki tüm cevaplar ve github'daki sass deposu hakkındaki yorumlarla kafam karıştı.

Sadece Aralık 2014 itibariyle bu sorunun çözüldüğünü belirtmek istiyorum. Artık cssdosyaları doğrudan sass dosyanıza içe aktarmak mümkündür . Aşağıdaki github'daki PR sorunu çözmektedir.

Sözdizimi şu ankiyle aynı - @import "your/path/to/the/file"dosya adından sonra bir uzantı olmadan. Bu, dosyanızı doğrudan içe aktarır. *.cssSonuna eklerseniz , csskural haline dönüşür @import url(...).

Webpack gibi bazı "süslü" yeni modül paketleyicilerini kullanıyorsanız , muhtemelen ~yolun başında kullanımı kullanmanız gerekecektir . Yani, aşağıdaki yolu almak node_modules/bootstrap/src/core.scssistiyorsanız, şöyle bir şey yazacaksınız
@import "~bootstrap/src/core".

NOT:
Görünüşe göre bu herkes için işe yaramıyor. Senin tercüman dayalı ise libsassonun gerektiğini cezası (Kasaya çalışıyor bu ). @importDüğüm-sass kullanarak test ettim ve iyi çalışıyor. Ne yazık ki bu işe yarar ve bazı yakut örneklerde çalışmaz.


1
Bu uygulanmış gibi görünüyor, libsassancak sass'ın yakut uygulamasını kullanırken, bu sözdiziminin işe yaradığı görülüyor, ancak sadece sass-css-importergerekliyse. En azından ben görüyorum. Başka kimse bunu onaylayabilir mi?
bsara

5
Sass'ın en son sürümüne sahip olduğunuzdan emin misiniz? Bir süre bu sözdizimini kullanıyorum ve her ikisi ile para cezası çalışır rubyve nodejstercümanlar. Dosya adından sonra bir uzantı yerleştirip yerleştirmediğinizi kontrol ettiniz mi? Doğru sözdizimi @import "path/to/style/file( .cssuzantı olmadan )
tftd

4
Gemfile.lock göre yakut sass v3.4.18 (Jekyll ile) kullanıyorum. Hala görüyorum Error: File to import not found or unreadable: cssdep/cssfile. Bir yarattığımda cssdep/cssfile.scssaniden çalışır. Bu yüzden bir yol sorunu değil, nedense hala
SASS'tan

1
ruby -v: ruby 2.2.2p95 (2015-04-13 revision 50295) [x64-mingw32] sass -v: Sass 3.4.17 (Selective Steve)Burada çalışmıyor
Cyril CHAPON

5
Bunun için teşekkür ederim! Node-sass kullanarak normalize.css dosyasını içe aktarabildim@import "node_modules/normalize.css/normalize";
Nick

260

Eklenecek css dosyasına bir alt çizgi eklemeli ve uzantısını scss (ex:) olarak değiştirmelisiniz _yourfile.scss. O zaman sadece bu şekilde çağırmalısınız:

@import "yourfile";

CSS standardı @import yönergesini kullanmak yerine dosyanın içeriğini de içerecektir.


1
Belki konvansiyon ve standartlarla ilgili bir şey.
David Morales

70
Alt çizgi, ayrı bir dosya olarak derlenmesini önlemektir.
Jonah

4
Herkesin merak etmesi durumunda, bu işe yarar çünkü Sass'ın SCSS sözdizimi bir CSS3'ün üst kümesidir. Noktalı virgül de bu yüzden gereklidir.
Jacob Wan

46
Örneğin, bazı satıcı CSS dosyalarının uzantısını değiştiremezsiniz.
Slava Fomin II

7
Bilgisayarınızda / sunucunuzda ise yapabilirsiniz! Ve eğer istemiyorsanız sembolik bağlantılar da var.
ste

260

Bu hayata geçirildi ve sürümden başlayarak birleşti 3.2( pull # 754 üzerinde birleşti 2 Ocak 2015 için libsass:, sorunlar originaly burada tanımlandı sass# 193 # 556 , libsass# 318 ).

Uzun hikayeyi kısaltmak için, sonraki sözdizimi:

  1. ham CSS dosyasını içe aktarmak (dahil etmek)

    sözdizimi olmadan.css (kısmi gerçek okuma sonuçları sonunda uzatma s[ac]ss|cssve SCSS / SAS'lara içi bunu içerir):

    @import "path/to/file";

  2. CSS dosyasını geleneksel bir şekilde içe aktarmak için

    sözdizimi sonunda uzantı ile.css geleneksel yoldan gider ( @import url("path/to/file.css");derlenmiş CSS sonuçlanır ):

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

Ve çok iyi: bu sözdizimi zarif ve laconic, artı geriye dönük uyumlu! O ile mükemmel bir performans sergiliyor libsassve node-sass.

__

Bu açıkça yazılı, yorum daha spekülasyonları önlemek için: Yakut merkezli Sass hala bu özellik vardır uygulanmayan tartışmaların 7 yıl sonra. Bu cevabı yazarken, 4.0'da bunu başarmanın basit bir yolu olacağına söz veriyoruz, muhtemelen yardımıyla @use. Çok yakında bir uygulama olacak gibi görünüyor, yeni "planlanan" "Teklif Kabul Edildi" etiketi 556 numaralı sorun ve yeni @useözellik için atandı .

bir şey değişir değişmez cevap güncellenebilir .


3
sadece açıklığa kavuşturmak için, css'i sass olarak içe aktarmak benim için şu şekilde çalıştı: @import url ("css-uzantısı olmadan / to / file yolu");
Craig Wayne

1
Bu aslında sass'ın yakut tabanlı versiyonunda işe yaramaz. Örneğin: sass myFile.scss: output.css komutu bir css içe aktarma işlemiyle başarısız olur, ancak .css dosyasının uzantısını .scss olarak değiştirdiğinizde çalışır. Bu yorumun yazımından itibaren en son sürümle çalıştırın: 3.4.22 / Seçici Steve. Bu, grunt-katkıda-sass gibi yakut sürümünü kullanan tüm görev koşucularını da etkiler.
ansorensen

@ansorensen, bence yanınızda bir karışıklık var. ".Css dosyasının uzantısını .scss olarak değiştirdiğinizde çalışır" ile ne demek istersiniz ? Tüm fikir tam olarak normal CSS dosyaları ve onlarla çalışmanın iki yolu hakkındaydı (SCSS'yi içe aktarmayla karıştırmayın). Lütfen soru ve cevabı bir kez daha okuyun.
Farside

@Farside Karışıklık yok. 'Path / to / file' sözdizimini içe aktar, Ruby'deki sass gem'in en son sürümünde çalışmaz. Sass'ı bir içe aktarmayla çalıştırdığımda, içe aktarılan yoldaki dosya bir .scss uzantısına sahip olduğunda içe aktarma başarıyla çalışır ve dosyada bir .css olduğunda başarısız olur. Soru css'nin scss'e aktarılmasını ister ve lib-sass ve node-sass için bir cevap sağlarsınız. Bu işlevin sass'ın yakut tabanlı sürümlerinde olmadığını söylüyorum.
ansorensen

1
@ansorensen, aman tanrım, sizden çok fazla metin ... Açıktım ve kimseyi karıştırmayın. Node-sassNode.js kütüphanesi LibSass ( Sass'ın C versiyonu ). Tek bir söz değil libsassya node-sassda Ruby tabanlı, sadece orijinal soruda RUBY sürümü hakkında tek bir söz değil. Bir dahaki sefere üst üste 3 yorum yazmadan önce lütfen dikkatle okuyun. Tüm referanslarım var: # 193 sayısına göre , Ruby sürümü için 5 yıllık tartışmadan sonra hala uygulanmadı, bu işlevselliği sadece ver. 4.0 satışa sunulacak.
Farside

37

Herkese iyi haberler, Chris Eppstein satır içi css içe aktarma işlevine sahip bir pusula eklentisi oluşturdu:

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

Şimdi, bir CSS dosyasını içe aktarmak şu kadar kolay:

@import "CSS:library/some_css_file"

3
Kullanımdan kaldırılmış başlangıç ​​noktası kullanıldığından başarısız oluyor. "Ne var, ama asla olamaz ..." İlk çıktığında harikaydı, ama tekrar çalışmak için bir güncellemeye ihtiyacı var ya da kullanımdan kaldırılmış eklentileri yüklemelisiniz. Teşekkürler, C§
CSS

18

.cssDeğiştirmek istemediğiniz bir dosyanız varsa, uzantısını da değiştirmeyin .scss( örneğin, bu dosya sürdürmediğiniz çatallı bir projeden ), her zaman bir symlink oluşturabilir ve daha sonra onu bilgisayarınıza aktarabilirsiniz .scss.

Bir sembolik bağlantı oluşturur:

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


Symlink dosyasını bir hedefe aktarır .scss:

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


Hedef çıktı .cssdosyanız .scssbir CSS içe aktarma kuralı değil ( @yaz tarafından en yüksek yorum oyu ile belirtilir) içe aktarılan symlink dosyasındaki içerikleri tutacaktır . Ve farklı uzantılara sahip çoğaltılmış dosyalarınız yok, yani ilk .cssdosyada yapılan herhangi bir güncelleme hemen hedef çıktınıza aktarılır.

Sembolik bağlantı (ayrıca sembolik bağlantı veya yumuşak bağlantı), mutlak veya göreli yol biçiminde başka bir dosyaya başvuru içeren ve yol adı çözümlemesini etkileyen özel bir dosya türüdür.
- http://en.wikipedia.org/wiki/Symbolic_link


9
Bir symlink eklemek çok taşınabilir bir çözüm değildir (yani birden fazla geliştirici veya inşa sistemi)
LocalPCGuy

Örneğin, her iki dosya da ( .cssve oluşturulan symlink) paylaşılan bir depo aracılığıyla herkes tarafından kullanılabilirse, satın alın.
Nik Sumeiko

Ben sadece bunu yaptım ve bu iş parçacığı üzerindeki sym bağlantıları hakkında cevap olacak, ama zaten burada olduğunu sevindim! Bu ihtiyacın nadir olduğu doğrudur, ancak durumum CSS dosyasını hiç değiştirmek istemiyordu (çünkü bir bower dosyasıydı), bu yüzden bir symlink oluşturma ve mükemmel çalışan içe aktarma.
Aaron Krauss

2
İçin , Windows kullanıcıları, aynı işlevselliği farklı bir sözdizimi olurdu mklink /H <link> <target>ve denir sabit bağlantı @mrsafraz.
Uzak

5

Anlambilimi importerözelleştirmek için bir üçüncü taraf kullanabilirsiniz @import.

Düğüm-küstahlık-ithalat-once ile çalışır, düğüm-sass (node.js için) ithalat CSS dosyaları satır içine alabilirsiniz.

Doğrudan kullanım örneği:

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

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

Örnek grunt-sass yapılandırması:

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 öğesinin şu anda açık bir altçizgi olmadan Sass parçalarını içe aktaramayacağını unutmayın. Örneğin dosya ile partials/_partial.scss:

  • @import partials/_partial.scss başarılı
  • @import * partials/partial.scss başarısız

Genelde, özel bir ithalatçı değişebilir unutmayın herhangi ithalat anlambilim. Kullanmaya başlamadan önce dokümanları okuyun.


4

Eğer doğru iseniz css scss ile uyumludur, böylece scss için bir css uzantısını değiştirebilirsiniz ve çalışmaya devam etmelidir. Uzantıyı değiştirdikten sonra içe aktarabilirsiniz ve dosyaya dahil edilir.

Bunu yapmazsanız, sass, istemediğiniz bir şey olan css @import'u kullanacaktır.


16
maalesef bazen içe aktarılan css dosyaları, bazı statik varlıkları paketleyen bir kitaplıkta olduğu gibi sizin kontrolünüz dışındadır.
Eric Drechsel

2

Bunu yapmak için zarif, Rails benzeri bir yol buldum. Öncelikle .scssdosyanızı şu şekilde yeniden adlandırın .scss.erb, ardından böyle bir sözdizimi kullanın ( vurgulama_js-rails4 gem CSS öğesi için örnek ):

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

Dosyayı neden doğrudan SCSS aracılığıyla barındıramıyorsunuz :

@importSCSS'de yapmak , tam yolu bir şekilde veya başka şekilde kullandığınız sürece CSS dosyaları için iyi çalışır. Geliştirme modunda, rails svarlıkları derlemeden sunar, böylece böyle bir yol çalışır ...

@import "highlight_js/github.css";

... çünkü barındırılan yol tam anlamıyla /assets/highlight_js/github.css. Sayfayı sağ tıklatıp "kaynağı görüntüle" yi tıklarsanız, ardından yukarıdaki sayfayla stil sayfasının bağlantısını tıklarsanız, @importiçinde şöyle görünen bir satır görürsünüz:

@import url(highlight_js/github.css);

SCSS motoru çevirir "highlight_js/github.css"için url(highlight_js/github.css). Bu, varlıkların önceden derlendiği üretimde çalıştırmaya karar verene kadar yüzme adıyla çalışacak ve dosya adına bir karma eklenecektir. SCSS dosyası hala /assets/highlight_js/github.cssönceden derlenmemiş ve üretimde olmayan bir statik çözülecektir .

Bu çözüm nasıl çalışır:

Birincisi, .scssdosyayı taşıyarak .scss.erbSCSS'yi Rails için bir şablona dönüştürdük. Artık, <%= ... %>şablon etiketlerini her kullandığımızda , Rails şablon işlemcisi bu parçacıkları kodun çıkışıyla değiştirecektir (diğer şablonlarda olduğu gibi).

Belirten asset_path("highlight_js/github")içinde .scss.erbdosyanın iki şey yapar:

  1. rake assets:precompileUygun CSS dosyasını önceden derlemek için görevi tetikler .
  2. Rails ortamından bağımsız olarak varlığı uygun şekilde yansıtan bir URL oluşturur.

Bu ayrıca SCSS motorunun CSS dosyasını ayrıştırmadığı anlamına gelir; sadece bir bağlantıyı barındırıyor! Yani hokey maymun yamaları ya da iğrenç çözümler yok. Bir CSS varlığını amaçlandığı şekilde SCSS üzerinden sunuyoruz ve adı geçen CSS varlığına Rails amaçlanan bir URL kullanıyoruz. Tatlı!


Bana göre çözüm biraz gölgeli görünüyor ve daha çok bir hack gibi geliyor. Ama bu soruşturma için iyi bir iş!
Farside

0

Basit geçici çözüm:

Tüm veya neredeyse tüm css dosyası scss gibi yorumlanabilir. Ayrıca bir bloğun içine aktarılmasını sağlar. Css dosyasını scss olarak yeniden adlandırın ve alın.

Gerçek yapılandırmamda aşağıdakileri yapıyorum:

Öncelikle .css dosyasını bu sefer .scss uzantılı geçici bir dosyaya kopyalarım. Grunt örnek yapılandırma:

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

Sonra .scss dosyasını üst scss'nizden içe aktarabilirsiniz (örneğimde, bir bloğa bile aktarılır):

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

Not: bu tehlikeli olabilir, çünkü css'nin birkaç kez ayrıştırılması etkili bir şekilde sonuçlanacaktır. Orijinal css'nizde scss tarafından yorumlanabilen herhangi bir eser olup olmadığını kontrol edin (bu mümkün değildir, ancak gerçekleşirse, sonuç hata ayıklamak zor ve tehlikeli olacaktır).


-3

Artık aşağıdakileri kullanarak mümkündür:

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

3
yalnızca gem sass-css-importeryüklüyse, sass anahtarla çağrılır -r sass-css-importerve .cssdosya yolundan çıkarılır
Bernhard Döbler

-4

Bu çalışmayı onaylayabilirim:

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'a teşekkür ederiz: https://github.com/sass/sass/issues/193


1
Bunu scss dosyanızda nasıl kullanabilirsiniz?
Adrian Ber

-10

Basit.

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


6
Bunu denedim, ancak sıkıştırırken dosyanın içeriğini çekmeyecek, sadece @import satırını tutacak.
GSto

1
En düşük puanlı cevap, ama ironik olarak, şimdi doğru yol bu gibi görünüyor. Soneki dahil etmek doğru olan şeydir.
Wyck
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.