Czy w SASS można zaimportować plik z innego katalogu? Na przykład, gdybym miał taką strukturę:
- root_directory
- sub_directory_a
- _common.scss
- template.scss
- sub_directory_b
- more_styles.scss
template.scss może importować plik _common.scss przy użyciu, @import "common"
ale czy plik more_styles.scss może importować plik _common.scss? Próbowałem kilku różnych rzeczy, w tym @import "../sub_directory_a/common"
i @import "../sub_directory_a/_common.scss"
ale wydaje się, że nic nie działa.
-I
? Jeśli ta nazwa ścieżki ulegnie zmianie, będzie dużo wyszukiwania i zastępowania; i wymaga takiej samej struktury folderów lokalnych, jak każdy, kto udostępnia plik .scssMożesz użyć
-I
przełącznika wiersza poleceń lub:load_paths
opcji z kodu Ruby, aby dodaćsub_directory_a
do ścieżki ładowania Sassa. Więc jeśli używasz Sass zroot_directory
, zrób coś takiego:Następnie możesz po prostu użyć
@import "common"
wmore_styles.scss
.źródło
-I
flag obejmujących więcej niż jeden katalog, np.sass -I sub_directory_a -I sub_directory_c --watch sub_directory_b:sub_directory_b
Używając webpacka z sass-loaderem, mogę
~
odwołać się do ścieżki głównej projektu. Na przykład zakładając strukturę folderów OP i że jesteś w pliku wewnątrz sub_directory_b:Dokumentacja: https://github.com/webpack-contrib/sass-loader#resolving-import-at-rules
źródło
node_modules/
a nie z katalogu głównego projektu."sub_directory_a"
do mojegoincludePaths
i używać@import "common";
składni podczas korzystania z Angular CLI, który zawiera sass-loader.~/
to nie wydaje mi się odnosić do katalogu domowego. Lub dowolny katalog, który próbowałem przetestować. Czy jest jakiś sposób, aby faktycznie spróbować dowiedzieć się, do czego to się odnosi?Importowanie
.scss
pliku z zagnieżdżonym importem o innej pozycji względnej nie będzie działać. najczęściej proponowaną odpowiedzią (używającą dużo../
) jest po prostu brudny hack, który będzie działał tak długo, jak długo dodasz wystarczająco dużo,../
aby dotrzeć do katalogu głównego systemu operacyjnego wdrażania projektu.źródło
meteor
, to był tylko przykład.Wybrana odpowiedź nie jest realnym rozwiązaniem.
Praktyka OP wydaje się nieregularna. Plik współdzielony / wspólny zwykle
partials
znajduje się w standardowym katalogu standardowym. Następnie należy dodaćpartials
katalog do ścieżek importu konfiguracji, aby rozwiązać częściowe w dowolnym miejscu w kodzie.Kiedy napotkałem ten problem po raz pierwszy, pomyślałem, że SASS prawdopodobnie daje ci zmienną globalną podobną do zmiennej Node
__dirname
, która zachowuje bezwzględną ścieżkę do bieżącego katalogu roboczego (cwd
). Niestety tak się nie dzieje, a powodem jest to, że interpolacja@import
dyrektywy nie jest możliwa, dlatego nie można wykonać dynamicznej ścieżki importu.Według docs SASS .
Musisz ustawić
:load_paths
w konfiguracji Sassa. Ponieważ OP używa Compass, będę postępować zgodnie z dokumentacją tutaj .Możesz przejść z rozwiązaniem CLI zgodnie z przeznaczeniem, ale dlaczego? o wiele wygodniej jest go dodać
config.rb
. Sensowne byłoby użycie CLI do nadpisywaniaconfig.rb
(np. Różne scenariusze kompilacji).Zakładając, że
config.rb
znajdujesz się w katalogu głównym projektu, po prostu dodaj następujący wiersz:add_import_path 'sub_directory_a'
A teraz
@import 'common';
będzie działać dobrze wszędzie.Podczas gdy to odpowiada OP, jest więcej.
dodatek
Prawdopodobnie napotkasz przypadki, w których chcesz zaimportować plik CSS w sposób osadzony, to znaczy nie za pomocą
@import
dyrektywy waniliowej, którą CSS zapewnia po wyjęciu z pudełka, ale rzeczywiste połączenie zawartości pliku CSS z SASS. Jest jeszcze jedno pytanie , na które udzielono odpowiedzi niejednoznacznej (rozwiązanie nie działa w różnych środowiskach). Rozwiązaniem jest więc użycie tego rozszerzenia SASS.Po zainstalowaniu dodaj następujący wiersz do konfiguracji:
require 'sass-css-importer'
a następnie gdzieś w kodzie:@import 'CSS:myCssFile';
Zauważ, że rozszerzenie musi zostać pominięte, aby to zadziałało.
Jednak napotkamy ten sam problem podczas próby zaimportowania pliku CSS ze ścieżki innej niż domyślna i
add_import_path
nie obsługuje plików CSS. Aby rozwiązać ten problem, musisz dodać kolejną linię w konfiguracji, która jest oczywiście podobna:add_import_path Sass::CssImporter::Importer.new('sub_directory_a')
Teraz wszystko będzie ładnie działać.
PS, zauważyłem, że
sass-css-importer
dokumentacja wskazuje, żeCSS:
oprócz pominięcia.css
rozszerzenia wymagany jest przedrostek . Dowiedziałem się, że to działa niezależnie. Ktoś rozpoczął problem , który do tej pory pozostawał bez odpowiedzi.źródło
Gulp wykona zadanie oglądania twoich plików sass, a także dodawania ścieżek do innych plików za pomocą includePaths. przykład:
źródło
-I
opcji z wiersza poleceń, prawda?node-sass
(oficjalny wrapper dla SASSnode.js
) udostępnia opcję wiersza poleceń,--include-path
która pomaga w takich wymaganiach.Przykład:
W
package.json
:Teraz, jeśli masz plik
src/styles/common.scss
w swoim projekcie, możesz go zaimportować w@import 'styles/common';
dowolnym miejscu w projekcie.Więcej informacji można znaleźć pod adresem https://github.com/sass/node-sass#usage-1 .
źródło
Aby zdefiniować plik do zaimportowania, można użyć wspólnych definicji wszystkich folderów. Musisz tylko mieć świadomość, że jest to zależne od pliku, który go definiujesz. Więcej na temat opcji importu z przykładami możesz sprawdzić tutaj .
źródło
Jeśli używasz kompilatora sieci Web w programie Visual Studio, możesz dodać ścieżkę do
includePath
w pliku compilerconfig.json.defaults. Wtedy nie ma potrzeby../
określania pewnej liczby, ponieważ kompilator użyje funkcji includePath jako lokalizacji do wyszukania importu.Na przykład:
źródło
To jest połowa odpowiedzi.
Sprawdź Compass , dzięki któremu możesz umieścić swój folder
_common.scss
wpartials
folderze, a następnie zaimportować go@import common
, ale działa w każdym pliku.źródło
Napotkałem ten sam problem. Z mojego rozwiązania doszedłem do tego. Oto twój kod:
O ile wiem, jeśli chcesz zaimportować jeden plik scss do drugiego, musi to być fragment. Podczas importowania z innego katalogu, nazwij swój plik
more_styles.scss
do_more_styles.scss
. Następnie zaimportuj go do swojegotemplate.scss
podobnego @import../sub_directory_b/_more_styles.scss
. U mnie to zadziałało. Ale jak wspomniałeś,../sub_directory_a/_common.scss
nie działa. To ten sam katalogtemplate.scss
. Dlatego to nie zadziała.źródło
Zapoznaj się z użyciem parametru includePaths ...
„Kompilator SASS używa każdej ścieżki w loadPaths podczas rozpoznawania SASS @imports”.
https://stackoverflow.com/a/33588202/384884
źródło
Najlepszym sposobem jest skorzystanie z programu sass-loader. Jest dostępny jako pakiet npm. Rozwiązuje wszystkie problemy związane ze ścieżką i czyni to bardzo łatwym.
źródło
Miałem ten sam problem i znalazłem rozwiązanie, dodając ścieżkę do pliku:
@import "C: / xampp / htdocs / Scss_addons / Bootstrap / bootstrap";
@import "C: / xampp / htdocs / Scss_addons / Compass / compass";
źródło