Я использую 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.






Попробуйте скопировать их прямо вот так:
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) замените config на options, так что он будет работать как задумано: mix.options.fileLoaderDirs.fonts = 'assets/fonts'
В дополнение к ответу @ 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.
Не работает с текущей версией Laravel-mix 6.0.16. Получение этой ошибки:
Cannot read property 'fileLoaderDirs' of undefined