Jak załadować font-awesome używając SCSS (SASS) w Webpack używając ścieżek względnych?


85

Mam font-awesome w moim folderze node_modules, więc próbuję zaimportować go do mojego głównego pliku .scss w następujący sposób:

@import "../../node_modules/font-awesome/scss/font-awesome.scss";

Ale kompilacja pakietów Webpack kończy się niepowodzeniem, co mi mówi

Error: Cannot resolve 'file' or 'directory' ../fonts/fontawesome-webfont.eot 

ponieważ plik font-awesome.scss odnosi się do ścieżki względnej „../fonts/”.

Jak mogę powiedzieć scss \ webpack, aby zaimportował inny plik i użył folderu tego pliku jako folderu domowego, aby jego ścieżki względne działały zgodnie z oczekiwaniami?


Nie znam pakietu webpack, ale czy możesz włożyć plik .eot ../../node_modules/font-awesome/fonts/fontawesome-webfont.eot?
— BrTkCa

Mógłbym to zrobić, zmieniając plik awesome fontów, ale wtedy straciłbym zmiany za każdym razem, gdy zaktualizuję npm, więc to nie jest opcja.
— Richard

webpack działa razem express @Richard?
— BrTkCa

Nie, nie korzystam z ekspresu
— Richard

Używam npm do programu ładującego font-awesome Sass. czy użyłeś innego?
— Winnemucca

Odpowiedzi:


139

Posługiwać się

$fa-font-path: "~font-awesome/fonts";
@import "~font-awesome/scss/font-awesome";

gdzie $fa-font-pathzmienna jest widocznafont-awesome/scss/_variables.scss

$fa-font-path: "../fonts" !default;

Tylda "~" jest interpolowana przez program ładujący sass przy użyciu mechanizmu webpack .


11
U mnie nie działa, kompiluje się, ale na mojej stronie
— pojawia

1
Musiałem ustawić jako $fa-font-path: "font-awesome/fonts"- czyli bez tyldy.
— ctrlplusb

2
Czy mógłbyś nieco dokładniej wyjaśnić, gdzie edytujesz co? Nie rozumiem tej odpowiedzi
— Richard

@Richard, czy udało Ci się sprawić, by to działało dla Ciebie? Oznacz to również jako odpowiedź!
— Ascherer

Nie, użyłem wówczas mojej odpowiedzi poniżej.
— Richard,

29

Wygląda na to, że nie ma sposobu na @importowanie plików, które mają własne ścieżki względne w SCSS \ SASS.

Zamiast tego udało mi się uruchomić to :

  • Zaimportuj plik scss \ css font-awesome do moich plików .js lub .jsx, a nie do moich plików arkuszy stylów:

    import 'font-awesome / scss / font-awesome.scss';    
  • Dodaj to do mojego pliku webpack.config:

    moduł:
    {
        ładowarki:
        [
            {test: /\.js?$/, loader: 'babel-loader? cacheDirectory', exclude: / (node_modules | bower_components) /},
            {test: /\.jsx?$/, loader: 'babel-loader? cacheDirectory', exclude: / (node_modules | bower_components) /},
            {test: /\.scss?$/, loaders: ['style-loader', 'css-loader', 'sass-loader']},         
            {test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, loader: 'file-loader? mimetype = image / svg + xml'},
            {test: /\.woff(\?v=\d+\.\d+\.\d+)?$/, loader: "file-loader? mimetype = application / font-woff"},
            {test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/, loader: "file-loader? mimetype = application / font-woff"},
            {test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, loader: "file-loader? mimetype = application / octet-stream"},
            {test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, loader: "file-loader"},
        ]
    }

Jak radzisz sobie z inną ścieżką czcionki? Chodzi mi o to, że importujesz tam scss, ale nie możesz zmienić ścieżki do plików czcionek, np. Jeśli chcesz ją zmienić do produkcji, a czcionki znajdują się w innym folderze. Jakieś pomysły? To jest to, co muszę zrobić.
— LordTribual

Nie muszę jeszcze zmieniać materiału do produkcji. Wyobrażam sobie, że po prostu skopiowałbym wszystko z mojej lokalnej kompilacji i zostawił ścieżki w spokoju. W przeciwnym razie może zajrzyj do sekcji wyjściowej pliku webpack.config.js i zobacz, czy możesz zmienić ścieżki. Lub po prostu dodaj krok po kompilacji w sekcji skryptów package.json .
— Richard

2
Działa. Zmieniłem ścieżkę do programu ładującego i teraz ładuje czcionki z określonej ścieżki.
— LordTribual

Nie musisz dołączać pliku scss z niesamowitymi czcionkami do javascript. Nadal możesz dołączyć go do swojego scss, o ile ustawisz ścieżkę czcionki, taką jak sugeruje user137794, a następnie zaktualizuj plik webpack.config, aby uwzględnić typy czcionek zgodnie z sugestią.
— Dave Lancea

Którego NMP użyłeś? Używam niesamowitego programu ładującego czcionki Sass i nie odnoszę sukcesu.
— Winnemucca

20

Pracowały dla mnie następujące:

$fa-font-path: "~font-awesome/fonts";
@import "~font-awesome/scss/font-awesome";

Ma to na celu zaimportowanie font-awesome& wymaganych czcionek do projektu. Inna zmiana dotyczy webpackkonfiguracji, aby załadować wymagane czcionki przy użyciu file-loader.

{
  test: /\.scss$/,
  loaders: ['style', 'css?sourceMap', 'sass'
  ],
}, {
  test: /\.(png|jpg|jpeg|gif|svg|woff|woff2|ttf|eot)(\?.*$|$)/,
  loader: 'file'
}

12

Rozwiązanie rozwiązane przez zmianę mojego app.scss:

@import '~font-awesome/scss/_variables.scss';
$fa-font-path: "~font-awesome/fonts";
@import '~font-awesome/scss/font-awesome.scss';

Ten sposób jest przydatny, aby zachować niezmienione i niewersjonowane zależności zewnętrzne.


2
Możesz ominąć linię 1 i użyć `! Default` na końcu linii 2.
— Nighto

Szkoda, że ​​nie mogę uruchomić tej metody, ponieważ oznaczałoby to, że nie musiałem zmieniać _variables.scsspliku za każdym razem, gdy rekompilowałem projekt. Nie nadpisuje $fa-font-pathani żadnej innej zmiennej w tym zakresie .. więc nie jestem pewien, jak udało ci się to zrobić_
— jesus g_force Harris

9

Tak to działało dla mnie, sztuka polega na ustawieniu $fa-font-pathścieżki czcionek w następujący sposób.

$fa-font-path: "~@fortawesome/fontawesome-free/webfonts/";
@import '~@fortawesome/fontawesome-free/scss/fontawesome.scss';
@import '~@fortawesome/fontawesome-free/scss/solid.scss';
@import '~@fortawesome/fontawesome-free/scss/brands.scss';

Uwaga : node_modulesw moim przypadku sprawdź folder z czcionkami@fortawesome/fontawesome-free


1
@Muhammed Właściwie ładowanie takich czcionek internetowych jest trochę trudne. Kiedy kompilujesz sass do css, zgodnie z twoim sposobem kompilacji, twoje czcionki mogą nie zostać skompilowane. Możesz skopiować folder webfonts bezpośrednio do swojego folderu publicznego / obok folderu css. W ten sposób niesamowity kod CSS dla czcionek znajdzie czcionki i będziesz po bezpiecznej stronie.
— Mycodingproject

7

Po prostu ustawiłem ścieżkę w moim głównym pliku scss i działa:

$fa-font-path: "../node_modules/font-awesome/fonts";
@import '~font-awesome/scss/font-awesome.scss';

6

Pomogło mi dodanie resolve-url-loaderi włączeniesourceMaps

Już zaimportowałem font-awesome w moim .scsspliku głównym :

@import "~font-awesome/scss/font-awesome";
...

Ten plik główny jest importowany do mojego main.jspliku zdefiniowanego jako punkt wejścia Webpack:

import './scss/main.scss';
...

Wtedy moje końcowe reguły modułu webpacka wyglądają tak:

 ...
 {
    test: /\.(sa|sc|c)ss$/,
    use: [
      MiniCssExtractPlugin.loader,
      'css-loader',
      { loader: 'postcss-loader', options: { sourceMap: true }, },
      'resolve-url-loader',
      { loader: 'sass-loader', options: { sourceMap: true }, },
    ],
  }, {
    test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
    loader: 'url-loader',
    options: { limit: 1000, name: 'fonts/[name].[ext]', },
  }
  ...

Uwaga:

Użyłem mini-css-extract-plugin, które można zarejestrować w ten sposób:

new MiniCssExtractPlugin({
    filename: 'css/main.css',
    chunkFilename: '[id].[hash]',
}),

url-loaderwymaga file-loaderinstalacji, więc jeśli pojawi się błąd taki jak cannot find module file-loader:, po prostu zainstaluj:

npm i -D file-loader

Przydatne linki :

https://github.com/webpack/webpack/issues/2771#issuecomment-277514138 https://github.com/rails/webpacker/issues/384#issuecomment-301318904


1

W przypadku wersji 5.14 działały następujące rozwiązania:

$fa-font-path : '../node_modules/@fortawesome/fontawesome-free/webfonts';

@import "../node_modules/@fortawesome/fontawesome-free/scss/solid";

@import "../node_modules/@fortawesome/fontawesome-free/scss/brands";

@import "../node_modules/@fortawesome/fontawesome-free/scss/fontawesome";

0

v.4 (Symofony 4 + pakiet sieciowy)

$fa-font-path: "~components-font-awesome/webfonts";
@import '~components-font-awesome/scss/fa-brands';
@import '~components-font-awesome/scss/fa-regular';
@import '~components-font-awesome/scss/fa-solid';
@import '~components-font-awesome/scss/fontawesome';
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.