SASS kullanırken farklı bir dizinden bir dosyayı nasıl içe aktarabilirim?


93

SASS'de başka bir dizinden bir dosya içe aktarmak mümkün mü? Örneğin, böyle bir yapıya sahip olsaydım:

- root_directory
    - sub_directory_a
        - _common.scss
        - template.scss
    - sub_directory_b
        - more_styles.scss

template.scss, _common.scss dosyasını kullanarak içe aktarabilir, @import "common"ancak more_styles.scss'in _common.scss'i içe aktarması mümkün müdür? Birkaç farklı şeyler de dahil olmak üzere çalıştı @import "../sub_directory_a/common"ve @import "../sub_directory_a/_common.scss"ancak hiçbir şey işe görünüyor.

Yanıtlar:


69

Görünüşe göre SASS'de yapılan bazı değişiklikler, başlangıçta yapmayı denediğiniz şeyi mümkün kılmıştır:

@import "../subdir/common";

Bunu, şurada bulunan tamamen alakasız bir klasör için bile çalıştırdık c:\projects\sass:

@import "../../../../../../../../../../projects/sass/common";

Sadece ../sürücünün kök dizininde olacağınızdan ve gitmenizin iyi olduğundan emin olmak için yeterince ekleyin .

Elbette, bu çözüm güzel olmaktan uzaktır, ancak I c:\projects\sassortam değişkenini SASS_PATH(from :: load_paths referansı ) aynı değere ayarlayarak veya kullanmadan tamamen farklı bir klasörden çalışmak için bir içe aktarma alamadım .


10
"Güzel olmaktan uzak"! Ancak bu cevap çok fazla olumlu oy alıyor. Bu gerçekten daha iyi bir uygulama olarak kabul edilir -Imi? Bu yol adı değişirse, pek çok arama ve değiştirme işlemi olacaktır; ve .scss paylaşan herkesle aynı yerel klasör yapısını gerektirir
WiseOldDuck

14
"Sürücünün kök dizinine ulaşacağınızdan ve gitmenizin iyi olduğundan emin olmak için yeterince ../ ekleyin." Hahaha bu günümü yaptı.
Steve Harrison

4
Bu cevabı tamamen görmezden gelmenizi tavsiye ederim. Maalesef bu, yanlış oylarla cevaplanan birçok SO sorusundan biridir. Kodunuzun kolayca kırılmasını istiyorsanız, onu kullanın. Sağlam bir çözüm istiyorsanız, aşağıdaki cevabıma bakın.
adi518

2
@ adi518: "Kodunuzun kolayca kırılmasını istiyorsanız, kullanın" ifadeniz hakkında tartışabilirim. Verilen çözüm o zamandan beri (yani neredeyse 4 yıldır) bizim için çalışıyor ve hiçbir şeyi bozmadı. Bunun biraz kirli olabilecek, ancak işi hızlı bir şekilde ve ilgili araçların bazılarının iç kısımlarına çok fazla dalmadan bitiren çözümlerden biri olduğunu hissediyorum.
Oliver

2
Bunu cidden yapma.
shinzou

34

Sass'ın yükleme yoluna eklemek için -Ikomut satırı anahtarını veya :load_pathsRuby kodundaki seçeneği kullanabilirsiniz sub_directory_a. Öyleyse root_directory, Sass'ı buradan çalıştırıyorsanız , şöyle bir şey yapın:

sass -I sub_directory_a --watch sub_directory_b:sub_directory_b

Sonra basitçe kullanabilirsiniz @import "common"içinde more_styles.scss.


1
Harika. Tam olarak bilmek istediğim buydu. Ve bence MisterJack de bir şeylerin peşinde ama görünüşe göre Compass zaten yolda olan bir klasöre sahip.
spaaarky21

3
-I Birden fazla dizini içerecek zincir bayrakları, örneğinsass -I sub_directory_a -I sub_directory_c --watch sub_directory_b:sub_directory_b
bob esponja

20

Webpack'i sass-loader ile kullanmak ~proje kök yoluna başvurmak için kullanabilirim . Örneğin, OPs klasör yapısını ve sub_directory_b içindeki bir dosyada olduğunuzu varsayarsak:

@import "~sub_directory_a/_common";

Belgeler: https://github.com/webpack-contrib/sass-loader#resolving-import-at-rules


8
Bu node_modules/, projenin kökünden değil, projenin kökünden içe aktarılıyor gibi görünüyor .
Splaktar

Ben eklemek zorunda "sub_directory_a"kardeşime karşı includePathsve kullanımı @import "common";küstahlık-yükleyici içerir Eğik CLI kullanırken sözdizimi.
Splaktar

Bu onaylanmış cevap olmalıdır.
shinzou

4
Splaktar ile anlaşın. Sass-loader belgelerinden: webpack, dosyaları çözmek için gelişmiş bir mekanizma sağlar. Sass yükleyici, tüm sorguları web paketi çözümleme motoruna geçirmek için Sass'ın özel ithalatçı özelliğini kullanır. Böylece Sass modüllerinizi node_modules'den içe aktarabilirsiniz. Webpack'e bunun göreceli bir içe aktarma olmadığını söylemek için başlarına ~ ekleyin ... Başına sadece ~ eklemek önemlidir, çünkü ~ / ev dizinine çözümlenir.
Anthony

Bunun ~/benim için ana dizine atıfta bulunmadığını unutmayın . Veya test etmeye çalıştığım herhangi bir dizin. Bunun nereye atıfta bulunduğunu gerçekten denemenin ve anlamanın bir yolu var mı?
Douglas Gaskell

8

.scssFarklı bir göreceli konuma sahip iç içe içe aktarmaya sahip bir dosyayı içe aktarmak işe yaramaz. En çok önerilen yanıt (çok sayıda kullanarak ../), ../projenizin dağıtım işletim sisteminin köküne ulaşmaya yetecek kadar eklediğiniz sürece işe yarayacak kirli bir hack'tir .

  1. Hedef SCSS yolunu SCSS derleyicisi için bir arama hedefi olarak ekleyin. Bu, stil sayfaları klasörünü scss yapılandırma dosyasına ekleyerek elde edilebilir, bu, kullandığınız çerçevenin işlevidir,

pusula tabanlı çerçeveler için :load_pathsadresinde kullanın config.rd(Örn. raylar)

aşağıdaki kodu kullanabilirsiniz scss-config.jsoniçinfourseven/meteor-scss

{
  "includePaths": [
    "{}/node_modules/ionicons/dist/scss/"
  ]
}
  1. Mutlak yollar kullanın (göreceli yollara karşı).

Örnek, ile fourseven/meteor-scss, {}aşağıdaki örneğe göre projenizin en üst seviyesini vurgulamak için kullanabilirsiniz .

@import "{}/node_modules/module-name/stylesheet";

Özel bir şey yok meteor, sadece bir örnekti.
2018

4

Seçilen cevap geçerli bir çözüm sunmuyor.

OP'nin uygulaması düzensiz görünüyor. Paylaşılan / ortak bir dosya normalde partialsstandart bir ortak metin dizininin altında bulunur . Daha sonra partialskodunuzun herhangi bir yerinde kısmi sorunları çözmek için yapılandırma içe aktarma yollarınıza dizin eklemelisiniz .

Bu sorunla ilk kez karşılaştığımda, SASS'nin muhtemelen size Node'unkine benzer bir global değişken verdiğini __dirnameve mevcut çalışma dizini ( cwd) için mutlak bir yol tuttuğunu düşündüm . Maalesef öyle değil ve nedeni bir @importdirektif üzerinde enterpolasyonun mümkün olmaması, dolayısıyla dinamik bir içe aktarma yolu yapamazsınız.

SASS belgelerine göre .

:load_pathsSass yapılandırmanızda ayarlamanız gerekir . OP Pusula'yı kullandığından, bunu buradaki belgelere göre takip edeceğim .

CLI çözümünü amaçlandığı gibi kullanabilirsiniz, ancak neden? eklemek çok daha uygun config.rb. Geçersiz kılmak için CLI kullanmak mantıklı olacaktır config.rb(Örneğin, farklı oluşturma senaryoları).

Bu nedenle, config.rbprojenizin kök dizininde olduğunu varsayarak , aşağıdaki satırı ekleyin: add_import_path 'sub_directory_a'

Ve şimdi @import 'common';her yerde gayet iyi çalışacak.

Bu OP'yi yanıtlarken, daha fazlası var.

Ek

Bir CSS dosyasını gömülü bir şekilde, yani @importCSS'nin kutunun dışında sağladığı vanilya yönergesi aracılığıyla değil , bir CSS dosyası içeriğinin SASS'nizle gerçek bir şekilde birleştirilmesi yoluyla içe aktarmak istediğiniz durumlarla karşılaşmanız olasıdır . Kesin olmayan bir şekilde yanıtlanan başka bir soru daha var (çözüm ortamlar arası çalışmıyor). Çözüm, bu SASS uzantısını kullanmaktır .

Kurulduktan sonra, aşağıdaki satırı yapılandırmanıza ekleyin: require 'sass-css-importer've ardından, kodunuzda bir yere:@import 'CSS:myCssFile';

Bunun çalışması için uzantının atlanması gerektiğine dikkat edin.

Ancak, bir CSS dosyasını varsayılan olmayan bir yoldan içe aktarmaya çalışırken aynı sorunla karşılaşacağız ve add_import_pathCSS dosyalarına uymayacağız. Bunu çözmek için, yapılandırmanıza doğal olarak benzer olan başka bir satır eklemeniz gerekir:

add_import_path Sass::CssImporter::Importer.new('sub_directory_a')

Şimdi her şey güzel çalışacak.

Not: sass-css-importerBelgelerin CSS:, .cssuzantının çıkarılmasına ek olarak bir ön ek gerektiğini gösterdiğini fark ettim . Ne olursa olsun işe yaradığını öğrendim. Birisi şimdiye kadar cevapsız kalan bir konu başlattı .


2

Gulp, sass dosyalarınızı izlemek ve ayrıca includePaths ile diğer dosyanın yollarını eklemek için işi yapacak. misal:

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

7
İncludePaths'in sadece -Ikomut satırındaki seçeneği kullandığını anlıyorsunuz , değil mi?
cimmanon

2

node-sass(resmi SASS sarmalayıcı node.js), --include-pathbu tür gereksinimlere yardımcı olmak için bir komut satırı seçeneği sunar.

Misal:

İçinde package.json:

"scripts": {
    "build-css": "node-sass src/ -o src/ --include-path src/",
}

Şimdi, src/styles/common.scssprojenizde bir dosyanız varsa, onu @import 'styles/common';projenizin herhangi bir yerine içe aktarabilirsiniz .

Daha fazla ayrıntı için https://github.com/sass/node-sass#usage-1 adresine bakın .


1

İçe aktarılacak dosyayı tanımlamak için tüm klasörlerin ortak tanımlarını kullanmak mümkündür. Dosyayı tanımladığınız dosyaya bağlı olduğunun farkında olmalısınız. İçe aktarma seçeneği hakkında daha fazla bilgiyi buradan inceleyebilirsiniz .


1

Visual Studio'da Web Derleyicisi kullanıyorsanız includePath, compilerconfig.json.defaults içindeki yolu ekleyebilirsiniz . Bu ../durumda, derleyici içeri aktarımı aramak için bir konum olarak includePath'i kullanacağından, bir sayıya gerek yoktur .

Örneğin:

"includePath": "node_modules/foundation-sites/scss",

0

Bu yarım cevaptır.

Compass'a göz atın , onunla _common.scssbir partialsklasörün içine yerleştirebilir ve ardından onu içe aktarabilirsiniz @import common, ancak her dosyada çalışır.


Sanırım Miikka'nın cevabı gerçekten peşinde olduğum şeydi ama şimdi Compass'ı da merak ediyorum. Kısmi dizini bir şekilde belirli bir projeye özel mi? Veya kısmi dizine yerleştirilen dosyalar, Compass'ın kullanıldığı her yerde "global olarak" kullanılabilir mi?
spaaarky 21

4
Bu soruya hiç cevap vermiyor.
cimmanon

0

Ben de aynı problemle karşılaştım. Benim çözümümden buna girdim. İşte kodunuz:

- root_directory
    - sub_directory_a
        - _common.scss
        - template.scss
    - sub_directory_b
        - more_styles.scss

Bildiğim kadarıyla, bir scss'yi diğerine aktarmak isteyip istemediğinizi, bunun kısmi olması gerektiğini biliyorum. Farklı dizinden ithal ediyoruz ne zaman isim more_styles.scssTo _more_styles.scss. Sonra bunu template.scssbeğendiğiniz @import'a aktarın ../sub_directory_b/_more_styles.scss. Benim için çalıştı. Ama bahsettiğiniz ../sub_directory_a/_common.scssgibi çalışmıyor. Bu aynı dizindir template.scss. Bu yüzden işe yaramayacak.



0

En iyi yol, kullanıcı sass-loader kullanmaktır. Npm paketi olarak mevcuttur. Yolla ilgili tüm sorunları çözer ve bunu çok kolaylaştırır.


-6

Aynı problemim vardı ve aşağıdaki gibi dosyaya yol ekleyerek çözüm buldum:

@import "C: / xampp / htdocs / Scss_addons / Bootstrap / bootstrap";

@import "C: / xampp / htdocs / Scss_addons / Pusula / pusula";


1
Daha önce benzer bir cevap verilmiş olsa da, mutlak yol, genel cevap olarak sunucuya özgüdür (elbette "beğen" dediniz).
dakab
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.