Я успешно настроил webpack для js и sass. Он работает хорошо, пока я не импортирую шрифт в файл scss. Я постараюсь показать это в коде ниже.
Моя конфигурация вебпака
const path = require('path');
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
const MinifyPlugin = require('babel-minify-webpack-plugin');
module.exports = {
optimization: {
minimizer: [new OptimizeCSSAssetsPlugin({})],
},
entry: path.resolve(__dirname + '/public/src/js/adminMain.js'),
output: {
path: path.resolve(__dirname + '/public/dist/'),
filename: 'adminBundle.js'
},
module: {
rules: [{
test: /\.js$/,
exclude: /(node_modules)/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env']
}
},
test: /\.(sa|sc|c)ss$/,
use: [{
loader: MiniCssExtractPlugin.loader
}, {
loader: "css-loader",
},
{
loader: "postcss-loader"
},
{
loader: "sass-loader",
options: {
implementation: require("sass")
}
}
]
}]
},
plugins: [
new MiniCssExtractPlugin({
filename: "adminBundle.css"
}),
new MinifyPlugin()
]
};
Админ.scss
// Variables
@import "./variables/admin.scss";
@import "./fontawesome.min.css";
@import "./solid.scss";
ALL OTHER NORMAL CSS.....
А это solid.scss
/*!
* Font Awesome Free 5.9.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
*/
@font-face {
font-family: 'Font Awesome 5 Free';
font-style: normal;
font-weight: 900;
font-display: auto;
src: url("../webfonts/fa-solid-900.eot");
src: url("../webfonts/fa-solid-900.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.woff") format("woff"), url("../webfonts/fa-solid-900.ttf") format("truetype"), url("../webfonts/fa-solid-900.svg#fontawesome") format("svg"); }
.fa,
.fas {
font-family: 'Font Awesome 5 Free';
font-weight: 900; }
Что ж, плагин кода визуальной студии watch-sass может решить эту проблему без проблем. Но теперь я использую вместо этого webpack. Когда я не импортировал solid.scss, он работает хорошо, но когда я импортирую solid.scss, я начинаю получать ошибки, вероятно, он не работает с файлами шрифтов. Но я не знаю, как это исправить. Буду благодарен за любой совет.
это пример ошибки
ERROR in ./public/src/css/admin.scss (./node_modules/css-loader/dist/cjs.js!./node_modules/postcss-loader/src!./node_modules/sass-loader/lib/loader.js??ref--4-3!./public/src/css/admin.scss)
Module not found: Error: Can't resolve '../webfonts/fa-solid-900.eot' in 'C:\Users\XXXXXXXXXX\Praca\Webové aplikácie\nodeCMS/public\src\css'
@ ./public/src/css/admin.scss (./node_modules/css-loader/dist/cjs.js!./node_modules/postcss-loader/src!./node_modules/sass-loader/lib/loader.js??ref--4-3!./public/src/css/admin.scss) 5:38-77 6:38-77





Оно работает !!!
webpack.config.js
const path = require('path');
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
const BabelMinifyPlugin = require('babel-minify-webpack-plugin');
module.exports = {
optimization: {
minimizer: [new OptimizeCSSAssetsPlugin({})],
},
entry: path.resolve(__dirname + '/public/src/js/adminMain.js'),
output: {
path: path.resolve(__dirname + '/public/dist/'),
filename: 'adminBundle.js'
},
devtool: 'source-map',
module: {
rules: [{
test: /\.js$/,
exclude: /(node_modules)/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env']
}
}
},
{
test: /\.(sa|sc|c)ss$/,
use: [{
loader: MiniCssExtractPlugin.loader
}, {
loader: "css-loader",
},
{
loader: "postcss-loader",
options: {
sourceMap: true
},
},
{
loader: "sass-loader",
options: {
sourceMap: true
},
options: {
implementation: require("sass")
}
}
]
},
{
test: /\.(ttf|eot|svg|gif|woff|woff2)(\?v=[0-9]\.[0-9]\.[0-9])?$/,
use: [{
loader: 'file-loader',
}]
},
]
},
plugins: [
new MiniCssExtractPlugin({
filename: "adminBundle.css"
}),
]
};
переменные.scss
$fa-font-path: "../../webfonts" !default;
...
твердый.scss
/*!
* Font Awesome Free 5.9.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
*/
@font-face {
font-family: 'Font Awesome 5 Free';
font-style: normal;
font-weight: 900;
src: url('#{$fa-font-path}/fa-solid-900.eot');
src: url('#{$fa-font-path}/fa-solid-900.eot?#iefix') format('embedded-opentype'),
url('#{$fa-font-path}/fa-solid-900.woff2') format('woff2'),
url('#{$fa-font-path}/fa-solid-900.woff') format('woff'),
url('#{$fa-font-path}/fa-solid-900.ttf') format('truetype'),
url('#{$fa-font-path}/fa-solid-900.svg#fontawesome') format('svg');
}
.fa,
.fas {
font-family: 'Font Awesome 5 Free';
font-weight: 900;
}
admin.scss
// Variables
@import "./variables/admin.scss";
@import "./fontawesome.min.css";
@import "./solid.scss";
.....
Просто нужно было внести некоторые изменения в файлы scss, и теперь это работает. {$fa-font-path} это ключ. Почему просто не может быть ничего в веб-разработке легко.
Я столкнулся с той же проблемой, и, как вы указываете, $fa-font-path здесь главная проблема. Я решил эту проблему с помощью оператора @using, который переопределяет значение по умолчанию, не касаясь файла node_modules, например: <pre><code> use "@fortawesome/fontawesome-free/scss/solid" с ($fa-font-path: ". ./node_modules/@fortawesome/fontawesome-free/webfonts"); </code></pre> Надеюсь, это кому-нибудь поможет
В моем случае ошибка была:
Error: Can't resolve '@fortawesome/fontawesome-free/webfonts/fa-solid-900.svg#fontawesome
И я это исправил, добавив это в свой index.scss
$fa-font-path: '~@fortawesome/fontawesome-free/webfonts';
@import '@fortawesome/fontawesome-free/scss/fontawesome';
@import '@fortawesome/fontawesome-free/scss/solid';
@import '@fortawesome/fontawesome-free/scss/regular';
@import '@fortawesome/fontawesome-free/scss/brands';
@import '@fortawesome/fontawesome-free/scss/v4-shims';
note the "~" in $fa-font-path
и это для моего webpack.config
{
test: /\.(ico|jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2)(\?.*)?$/,
use: {
loader: 'file-loader',
options: {
name: '[path][name].[ext]',
},
},
},
Эта проблема устраняется путем изменения пути из исходного файла scss или css.
Если ваше дерево каталогов выглядит как пример ниже:
src
fontawesome/
scss/
fontawesome.scss
style.scss
Вам нужно импортировать эти файлы следующим образом:
@import "./fontawesome/scss/fontawesome.scss";
как ваш путь, начинающийся с вашего файла style.scss, и вам не нужно будет изменять путь в файле variable.scss
Для управления всеми этими файлами (.eot, .ttf, .png, .jpg...) я использую загрузчик файлов webpack.js.org/loaders/файл-загрузчик. Попробуйте использовать и этот загрузчик.