Laravel Mix генерирует шрифты в другой каталог

Я использую laravel-mix, который построен поверх webpack. У меня проблема с каталогом шрифтов. Например, в пакете font-awesome есть файл scss и каталог шрифтов, в котором размещены все шрифты.

font-awesome:.
├───scss
│       fontawesome.scss
└───webfonts
        fa-regular-400.eot
        fa-regular-400.svg
        fa-regular-400.ttf
        fa-regular-400.woff
        fa-regular-400.woff2

Поэтому я помещаю этот пакет в свой каталог resources/assets/sass.

resources:.
└───asset
    └───sass
        │   main.scss
        │
        └───font-awesome (directory)

main.scss содержит код:

@import 'font-awesome/scss/fontawesome';

webpack.mix.js содержит:

mix.sass('resources/assets/sass/main.scss', 'public/css/frontend.css');

Все активы скомпилированы успешно. Теперь в каталоге public есть каталоги css и font, в которых есть все подобные шрифты.

public:.
│   index.php
│
├───css
│       frontend.css
│
├───fonts
│       fa-regular-400.eot
│       fa-regular-400.svg
│       fa-regular-400.ttf
│       fa-regular-400.woff
│       fa-regular-400.woff2

Но я хочу, я не хочу компилировать все шрифты в каталог public/fonts, я хочу скомпилировать как следующую структуру public/fonts/vendor/font-awesome

public:.
├───css
│       frontend.css
│
└───fonts
    └───vendor
        └───font-awesome
                fa-regular-400.eot
                fa-regular-400.svg
                fa-regular-400.ttf
                fa-regular-400.woff
                fa-regular-400.woff2

Какие изменения мне нужно изменить в файле webpack.mix.js.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
18
0
18 192
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Попробуйте скопировать их прямо вот так:

mix.copyDirectory('assets/font-awesome/webfonts', 'public/fonts');

Или вы можете копировать файлы по одному:

mix.copy('assets/font-awesome/webfonts/example.ttf', 'public/fonts/example.ttf');
Ответ принят как подходящий

1. Сначала создайте явную структуру папок:

как это в вашем проекте laravel.

public/fonts/vendor/font-awesome

Переместите все свои шрифты из пакета font-awesome в вышеупомянутый каталог.

2. Измените значение переменной $ fa-font-path:

В каталоге font-awesome есть файл с именем _variables.scss, внутри этого файла есть переменная с именем $fa-font-path, измените значение на что-то вроде этого.

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

Скомпилируйте свои активы, это сработает.

Если вы хотите использовать laravel-mix и попытаться изменить каталог public/fonts на public/assets/fonts, Вы можете использовать этот код в своем webpack.mix.js

let mix = require('laravel-mix');
mix.config.fileLoaderDirs.fonts = 'assets/fonts';

Не работает с текущей версией Laravel-mix 6.0.16. Получение этой ошибки: Cannot read property 'fileLoaderDirs' of undefined

João Hamerski 14.04.2021 00:53

Я только что понял, в последних версиях Laravel-mix (6.0) замените config на options, так что он будет работать как задумано: mix.options.fileLoaderDirs.fonts = 'assets/fonts'

João Hamerski 14.04.2021 01:11

В дополнение к ответу @ farid-hatami вы также можете добавить к сгенерированному URL-адресу с помощью.

mix.setResourceRoot('/public')

Это полезно, если вы используете бэкенды, такие как Django, где вам нужно явно указывать свой URL.

Вы также можете просто изменить способ, которым Laravel Mix генерирует структуру папок, перезаписав правило Webpack, которое управляет шрифтами.

Исходное правило можно найти в пакете Laravel Mix, в src/builder/webpack-rules.js, строка 50, где в комментарии написано // Add support for loading fonts.

В вашем файле Mix вы можете перезаписать правило с помощью метода webpackConfig, например:

mix.webpackConfig({
  module: {
    rules: [{
      test: /(\.(woff2?|ttf|eot|otf)$|font.*\.svg$)/,
      loaders: [{
        loader: 'file-loader',
        options: {
          name: (path) => {
            if (!/node_modules|bower_components/.test(path)) {
              return 'fonts/[name].[ext]?[hash]';
            }
            return (
              'fonts/vendor/' +
              path
              .replace(/\/g, '/')
              .replace(
                /((.*(node_modules|bower_components))|fonts|font|assets)//g,
                ''
              ) +
              '?[hash]'
            );
          },
        },
      }],
    }],
  },
})

Написанное мной правило почти идентично правилу в пакете Laravel Mix, поэтому, если вам нужно его изменить, вам придется обновить один из двух возвратов: в данном случае второй, потому что шрифты поступают из модуля npm. .

Так что вместо

path
  .replace(/\/g, '/')
  .replace(
    /((.*(node_modules|bower_components))|fonts|font|assets)//g,
  ''
)

вы можете написать жестко запрограммированную строку или изменить то, что вы хотите, из исходного пути: таким образом структура папок в исходном модуле узла (в данном случае Font Awesome) не повлияет на структуру папок вашей папки public.

Другие вопросы по теме