Làm cách nào để tải phông chữ tuyệt vời bằng SCSS (SASS) trong Webpack bằng các đường dẫn tương đối?


84

Tôi có font-awesome trong thư mục node_modules của mình, vì vậy tôi cố gắng nhập nó vào tệp .scss chính của mình như sau:

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

Nhưng biên dịch gói Webpack không thành công, nói với tôi

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

vì tệp font-awesome.scss tham chiếu đến một đường dẫn tương đối, '../fonts/'.

Làm cách nào để yêu cầu scss \ webpack @import một tệp khác và sử dụng thư mục của tệp đó làm thư mục chính để các đường dẫn tương đối của nó hoạt động như mong đợi?


Tôi không biết webpack, nhưng bạn có thể đặt .eot vào ../../node_modules/font-awesome/fonts/fontawesome-webfont.eotkhông?
BrTkCa

Tôi có thể làm điều đó bằng cách thay đổi tệp phông chữ tuyệt vời, nhưng sau đó tôi sẽ mất các thay đổi bất cứ khi nào tôi cập nhật npm, vì vậy đó không phải là một tùy chọn.
Richard

webpack hoạt động cùng nhau express @Richard?
BrTkCa

Không, không sử dụng express
Richard

Tôi đang sử dụng npm cho trình tải sass font-awesome. bạn đã sử dụng một cái khác?
Winnemucca

Câu trả lời:


139

Sử dụng

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

nơi $fa-font-pathbiến được nhìn thấy trongfont-awesome/scss/_variables.scss

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

Dấu ngã "~" được nội suy bởi sass-loader bằng cách sử dụng chủ nghĩa webpack .


11
Không làm việc cho tôi, nó biên dịch nhưng tôi chỉ nhận được hình chữ nhật trong trang web của tôi ...: /
Donovan Charpin

1
Tôi phải đặt của tôi là $fa-font-path: "font-awesome/fonts"- tức là không có dấu ngã.
ctrlplusb

2
Bạn có thể giải thích chính xác hơn một chút về nơi bạn chỉnh sửa những gì không? Tôi không hiểu câu trả lời này
Richard

@Richard bạn có thể làm điều này làm việc cho bạn không? Ngoài ra, hãy đánh dấu đây là câu trả lời!
Ascherer

Không, tôi đã sử dụng câu trả lời dưới đây vào thời điểm đó.
Richard

29

Dường như không có bất kỳ cách nào để @import các tệp có đường dẫn tương đối của riêng chúng trong SCSS \ SASS.

Vì vậy, thay vào đó, tôi quản lý để làm cho điều này hoạt động:

  • Nhập tệp scss \ css font-awesome vào tệp .js hoặc .jsx của tôi , không phải tệp biểu định kiểu của tôi:

    nhập 'font-awesome / scss / font-awesome.scss';    
  • Thêm cái này vào tệp webpack.config của tôi:

    mô-đun:
    {
        bộ nạp:
        [
            {test: /\.js?$/, trình tải: 'babel-loader? cacheDirectory', loại trừ: / (node_modules | bower_components) /},
            {test: /\.jsx?$/, trình tải: 'babel-loader? cacheDirectory', loại trừ: / (node_modules | bower_components) /},
            {test: /\.scss?$/, trình tải: ['style-loader', 'css-loader', 'sass-loader']},         
            {test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, trình tải: 'file-loader? mimetype = image / svg + xml'},
            {test: /\.woff(\?v=\d+\.\d+\.\d+)?$/, trình tải: "file-loader? mimetype = application / font-woff"},
            {test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/, trình tải: "file-loader? mimetype = application / font-woff"},
            {test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, trình tải: "file-loader? mimetype = application / octet-stream"},
            {test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, trình tải: "file-loader"},
        ]
    }

Làm thế nào để bạn xử lý một đường dẫn phông chữ khác? Ý tôi là bạn nhập scss ở đó nhưng bạn không thể thay đổi đường dẫn đến tệp phông chữ của mình, ví dụ: nếu bạn cần thay đổi nó để sản xuất và phông chữ được tìm thấy trong một thư mục khác. Có ý kiến ​​gì không? Đó là những gì tôi cần làm.
LordTribual

Tôi chưa phải thay đổi những thứ để sản xuất. Tôi tưởng tượng rằng tôi sẽ chỉ sao chép mọi thứ từ công trình địa phương của tôi và để lại các con đường một mình. Nếu không, có thể xem phần đầu ra của webpack.config.js và xem liệu bạn có thể thay đổi đường dẫn hay không. Hoặc chỉ cần thêm một bước xây dựng bài đăng trong phần tập lệnh package.json của bạn .
Richard

2
Đã hoạt động. Tôi đã thay đổi đường dẫn cho trình tải và bây giờ nó đang tải các phông chữ từ đường dẫn được chỉ định.
LordTribual

Bạn không cần phải bao gồm tệp phông chữ tuyệt vời trong javascript. Bạn vẫn có thể đưa nó vào scss của mình, miễn là bạn đặt đường dẫn phông chữ như user137794 đề xuất, sau đó cập nhật tệp webpack.config để tính đến các loại phông chữ như bạn đề xuất.
Dave Lancea

Bạn đã sử dụng npm nào? Tôi đang sử dụng trình tải tuyệt vời phông chữ sass và không thành công.
Winnemucca

20

Sau đây làm việc cho tôi:

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

Điều này là để nhập font-awesome& phông chữ bắt buộc trong dự án. Thay đổi khác là trong webpackcấu hình, để tải các phông chữ cần thiết bằng cách sử dụng file-loader.

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

12

Giải quyết bằng cách thay đổi app.scss:

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

Cách này hữu ích để giữ cho các phụ thuộc bên ngoài không thay đổi và không được phiên bản.


2
Bạn có thể tránh dòng 1 và sử dụng `! Default` ở cuối dòng 2.
Nighto

Thật tiếc là tôi không thể làm cho phương pháp này hoạt động vì nó có nghĩa là tôi không phải thay đổi _variables.scsstệp mỗi khi tôi biên dịch lại dự án. Nó không ghi đè lên $fa-font-pathhoặc bất kỳ biến khác cho rằng vấn đề .. vì vậy không chắc chắn làm thế nào bạn có thể làm it_
jesus g_force Harris

7

Tôi chỉ đặt đường dẫn trong tệp scss chính của mình và nó hoạt động:

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

7

Đây là cách nó hoạt động đối với tôi, mẹo là đặt $fa-font-pathđường dẫn của các phông chữ như sau.

$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';

Lưu ý : Vui lòng kiểm tra thư mục phông chữ của bạn node_modulestrong trường hợp của tôi là@fortawesome/fontawesome-free


1
@Muhammed Thực ra, việc tải các webfonts như thế này hơi khó. Khi bạn biên dịch sass sang css, theo cách biên dịch của bạn, phông chữ của bạn có thể không được biên dịch. Bạn có thể sao chép trực tiếp thư mục webfonts vào thư mục / public bên cạnh thư mục css của bạn. Bằng cách này, mã css phông chữ tuyệt vời sẽ tìm thấy các phông chữ và bạn sẽ ở bên an toàn.
Mycodingproject

6

Điều làm việc cho tôi là thêm resolve-url-loadervà bậtsourceMaps

Tôi đã nhập font-awesome vào .scsstệp gốc của mình :

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

Tệp gốc này được nhập vào main.jstệp của tôi được xác định là điểm nhập của Webpack:

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

Sau đó, các quy tắc mô-đun webpack cuối cùng của tôi trông giống như sau:

 ...
 {
    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]', },
  }
  ...

Ghi chú:

Tôi đã sử dụng mini-css-extract-plugin, có thể đăng ký như thế này:

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

url-loaderyêu cầu file-loaderphải được cài đặt, vì vậy nếu bạn gặp lỗi như:, cannot find module file-loaderthì chỉ cần cài đặt nó:

npm i -D file-loader

Liên kết hữu ích :

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


1

Đối với Phiên bản 5.14, những điều sau phù hợp với tôi:

$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 + webpack)

$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';
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.