Загрузка FontAwesome через Webpack: шрифты не загружаются - PullRequest
0 голосов
/ 08 октября 2018

Я пытаюсь понять, как загрузить шрифты через fontawsome при загрузке их через файл scss:

это мой конфиг веб-пакета:

const path                      = require('path');
const webpack                   = require('webpack');
const UrlLoader                 = require('url-loader');
const BrowserSyncPlugin         = require('browser-sync-webpack-plugin');
const VueLoaderPlugin           = require('vue-loader/lib/plugin');
const MiniCssExtractPlugin      = require('mini-css-extract-plugin');
const OptimizeCSSAssetsPlugin   = require('optimize-css-assets-webpack-plugin');

publicFolder                    = path.resolve(__dirname, 'public');
// appFolder                        = path.resolve(__dirname, 'app');

module.exports = {

    entry: { 
                // Selects main js file
                main:   './public/es6/index.js'
    },

    output: {
                // Main path for the js folder
                path:       path.resolve(__dirname, 'public/js/'),
                // Select teh name the main js file (after compression)
                filename:   'bundle.js',
                // Public path 
                // publicPath: 'http://localhost:8080', 
                publicPath: '/public/js/',
                // Name the chunkFile (in case of external scripts)
                chunkFilename: '[name].[contenthash].js'
    },

    module: {
                rules: [    // Vue Files 
                            {
                                test: /\.vue$/,
                                exclude: /node_modules/, 
                                loader: 'vue-loader', 
                                options: {
                                            loader: {
                                                scss: 'vue-style-loader!css-loader!sass-loader', 
                                                css: 'vue-style-loader!css-loader'
                                            }
                                }
                            },
                            // JS files 
                            {
                                test:       /\.js$/,
                                exclude:    /node_modules/,
                                use: {
                                        loader: "babel-loader"
                                }
                            },
                            // CSS / SASS files 
                            {
                                test: /\.(sa|sc|c)ss$/,
                                // test: /\.scss$/,
                                use: [
                                        {
                                            loader: MiniCssExtractPlugin.loader,
                                        },
                                        {
                                            loader: 'css-loader',
                                            options: {
                                                        url: false,
                                                        minimize: true,
                                                        sourceMap: true
                                            }
                                        },
                                        {
                                            loader: 'postcss-loader'
                                        },
                                        {
                                            loader: 'sass-loader',
                                            options: {
                                                        sourceMap: true, 
                                                        minimize: true
                                            }
                                        }
                                ]
                            },
                            // Forgot why I need this... 
                            {
                                test: /\.(png|gif|jpe|jpg|woff|woff2|eot|ttf|svg)(\?.*$|$)/,
                                use: [{
                                    loader: 'url-loader',
                                    options: {
                                      limit: 100000
                                    }
                                }]
                            }
                ]
    },
    plugins: [  
                // Load jQuery globally 
                new webpack.ProvidePlugin({
                    $: 'jquery',
                    jQuery: 'jquery',
                    'window.jQuery': 'jquery'
                }),

                // Hot module
                // new webpack.HotModuleReplacementPlugin(),

                // BrowserSync: Load page automatically on change
                new BrowserSyncPlugin({
                    proxy: 'https://potato.mywebsite.com/', 
                    port: 3000, 
                    files: [
                        '**/*.php'
                    ], 
                    ghostMode: {
                        clicks: false, 
                        location: false, 
                        forms: false, 
                        scroll: false
                    }, 
                    minify: false,
                    injectChanges: true, 
                    logFileChanges: true, 
                    logLevel: 'debug', 
                    logPrefix: 'webpack', 
                    notify: true, 
                    reloadDelay: 0
                }),

                // Provides a way to customize how progress is reported during a compilation
                new webpack.ProgressPlugin(),

                // Loads Vue
                new VueLoaderPlugin(), 

                // For webpack-dev-server (currently not in use)
                // new webpack.HotModuleReplacementPlugin(), 

                // Handle css in different files (scss file in login.js for example to a hashed login.css file)
                new MiniCssExtractPlugin({ filename: '../css/[name].css' }), 

                // CSS assets during the Webpack build and will optimize \ minimize the CSS
                new OptimizeCSSAssetsPlugin({}),

                // Not sure if needed yet
                new webpack.NamedModulesPlugin()

    ],
    devServer: {
                    // https:       true,
                    headers:        { 'Access-Controll-Allow-Origin': '*' },
                    compress:       true, 
                    quiet:          true, 
                    hot:            true,
                    inline:         true
    }

};

И это мой файл SCSSгде я загружаю FontAwesome (и другие) ..

@import 'variable';

// Colors
@import 'colors/default';
@import 'colors/green';
@import 'colors/megna';
@import 'colors/purple';
@import 'colors/red';
@import 'colors/blue';
@import 'colors/blue-dark';
@import 'colors/default-dark';
@import 'colors/green-dark';
@import 'colors/red-dark';
@import 'colors/megna-dark';
@import 'colors/purple-dark';  


// Import Bootstrap source files
@import "../../node_modules/bootstrap/scss/bootstrap";


// This is for the icons
@import '../assets/icons/font-awesome/css/fontawesome-all.css';
@import '../assets/icons/simple-line-icons/css/simple-line-icons.css';
@import '../assets/icons/weather-icons/css/weather-icons.min.css';
@import '../assets/icons/themify-icons/themify-icons.css'; 
@import '../assets/icons/flag-icon-css/flag-icon.min.css';
@import "../assets/icons/material-design-iconic-font/css/material-design-iconic-font.min.css";


// This is the core files
@import 'core/core';
@import 'widgets/widgets';
@import 'responsive';


// In This scss you can write your scss
@import 'custom'; 

При работе npm run dev (или других) я не получаю сообщение об ошибке с упоминанием шрифтов.

1011 * При загрузке моего сайта я получаю эти URLS refrences в «сети» панеле:
https://mywebsite.potato.com/public/webfonts/fa-regular-400.woff
https://mywebsite.potato.com/public/fonts/Simple-Line-Icons.ttf?-i3a2kk

указывает на файлы шрифтов, которые даже не существуют в моем каталоге (или, по крайней мере, сделать»t создается ...)

enter image description here

Как правильно загрузить шрифты?

1023 * EDIT:

Добавление этого для @ FabioCosta

{
    test: /\.(png|gif|jpe|jpg|woff|woff2|eot|ttf|svg)(\?.*$|$)/,
    use: [
            {
                loader: 'file-loader',
                options: {
                    name:       '[name].[ext]',
                    // name:        '[path][name].[ext]',
                    outputPath: '/public/fonts/',
                    publicPath: '/public/fonts/'
                }
             }
    ]
}

Добавление полного модуля часть:

module: {
            rules: [    // Vue Files 
                        {
                            test: /\.vue$/,
                            exclude: /node_modules/, 
                            loader: 'vue-loader', 
                            options: {
                                        loader: {
                                            scss: 'vue-style-loader!css-loader!sass-loader', 
                                            css: 'vue-style-loader!css-loader'
                                        }
                            }
                        },
                        // JS files 
                        {
                            test:       /\.js$/,
                            exclude:    /node_modules/,
                            use: {
                                    loader: "babel-loader"
                            }
                        },
                        // CSS / SASS files 
                        {
                            test: /\.(sa|sc|c)ss$/,
                            // test: /\.scss$/,
                            use: [
                                    {
                                        loader: MiniCssExtractPlugin.loader,
                                    },
                                    {
                                        loader: 'css-loader',
                                        options: {
                                                    url: false,
                                                    minimize: true,
                                                    sourceMap: true
                                        }
                                    },
                                    {
                                        loader: 'postcss-loader'
                                    },
                                    {
                                        loader: 'sass-loader',
                                        options: {
                                                    sourceMap: true, 
                                                    minimize: true
                                        }
                                    }
                            ]
                        },
                        {
                            test: /\.(png|gif|jpe|jpg|woff|woff2|eot|ttf|svg)(\?.*$|$)/,
                            use: [
                                    {
                                        loader: 'file-loader',
                                        options: {
                                            // name:        '[path][name].[ext]',
                                            name:       '[name].[ext]',
                                            outputPath: '/public/fonts/',
                                            publicPath: '/public/fonts/'
                                        }
                                     }
                            ]
                        }

Пробовалследующее: https://chriscourses.com/blog/loading-fonts-webpack и, похоже, не работает.

Добавление снимка экрана CSS

enter image description here

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Я только что опубликовал подробный ответ на другой похожий вопрос вот так.Это может помочь вам, а также включает другое возможное решение с новым способом использования FontAwesome5 с SVG + JS.При этом вам не нужны файлы шрифтов, загрузчики Webpack и т. Д. Всего несколько дополнительных строк в вашем JavaScript коде.

(надеюсь опубликовать ответ, как этот, не противоречит правиламЭто другое длинное письмо, я не хочу копировать и вставлять его. Должен ли я? Я не думаю, что здесь можно использовать дублирующий флаг ...)

0 голосов
/ 08 октября 2018

ОБНОВЛЕНИЕ

Имея базу на файлах github, вы нацеливаетесь на неизмененный css в файле php.Это не будет проанализировано веб-пакетом, удалите его.

<link rel="stylesheet" type="text/css" href="css/main.css">

Если вы запустите npm run build, ваша точка входа - это файл JS, это будет проанализированный файл JS, хотя веб-пакет будет генерировать все ваши файлы инеобходимо будет включить.

Затем вы используете плагин mini css extract , чтобы скопировать ваш css куда-то, вам нужно загрузить этот файл.В вашей текущей конфигурации он сохраняет один уровень вверх в папке css:

new MiniCssExtractPlugin({ filename: '../css/[name].css' }), 

Независимо от того, что выводит этот файл, вы должны загружать , а не исходный файл main.css , поэтому вашв текущей структуре папок этот файл будет находиться на одном уровне пути UP.Не в public / css, который вы, вероятно, ожидаете, если я не ошибаюсь, если вы используете ./css/[name].css, он должен вывести туда, куда вы ожидаете.

В качестве примечания здесь,кажется, вы используете одну и ту же папку для источника и вывода.Попробуйте переместиться в отдельные папки, чтобы ничего не перезаписывать.

Наконец, шрифты: тест загрузчика должен соответствовать вашему шрифту

src: url("../webfonts/fa-brands-400.eot");

не соответствует тесту:

test: /\.(png|gif|jpe|jpg|woff|woff2|eot|ttf|svg)(\?.*$|$)/,

Вы, вероятно, хотите сделать эту последнюю часть необязательной

test: /\.(png|gif|jpe|jpg|woff|woff2|eot|ttf|svg)(\?.*$|$)?/,

также ваш css-загрузчик имеет url = false , поэтомураспознаватель шрифтов никогда не будет вызываться .Удалите url: false из вашего загрузчика.Тогда это просто случай игры с опциями загрузчика файлов, вы можете изменить public-path , чтобы перейти к тому, что вы храните ваши файлы, и они будут заменены на сгенерированную css и выходной путь , чтобы скопировать их в нужное место.

Подводя итог:

  • Проверьте, импортируете ли вы правильный файл CSS, переименуйтефайл и посмотрите, где он находится, если вам нужна уверенность
  • Если вы хотите заменить url и загрузчик, удалите url: false из css-loader и убедитесь, что регулярное выражение файлов шрифтов соответствует им.
  • Чтобы избежать путаницы, сохраните все выходные данные в отдельной папке и проверьте, что и где лежит.

Первый ответ:

Если вы уже используете font-awesome и webpack Я бы посоветовал вам использовать font-awesome-loader .

Это был бы самый простой способ загрузить их, но более глубокое объяснение состоит в том, что в основном для каждого расширения файла webpack требуетсяпогрузчиксправиться с этим.Он будет обрабатывать файл надлежащим образом и помещать его содержимое куда-нибудь.

Итак, шаги, чтобы заставить веб-пакет загрузить самые замечательные шрифты:

  • Установите пакет font awesome в вашем проекте (или располагайте ресурсы в каком-то фиксированном месте).
  • Загрузите файлы шрифтов, используя какой-нибудь загрузчик, как показано ниже

    module.exports = {
        module: {
            loaders: [
            // the file-loader will copy the file and fix the appropriate url
            {
                test: /\.(ttf|eot|svg|woff(2)?)(\?v=[0-9]\.[0-9]\.[0-9])?$/,
                loader: "file-loader",
                options: {
                name: "[name].[ext]",
                outputPath: "fonts/", 
                publicPath: "../fonts/"
                }
            }
            ]
        }
    };
    
  • Загрузите соответствующийCSS / SCSS / LESS от font-awesome на вашем CSS.

Итак, анализируя ваш код в этой части:

        // Forgot why I need this... 
        {
            test: /\.(png|gif|jpe|jpg|woff|woff2|eot|ttf|svg)(\?.*$|$)/,
            use: [{
                loader: 'url-loader',
                options: {
                    limit: 100000
                }
            }]
        }

Вы решили загрузить все эти расширения через url-loader , чтобы они стали base64 URI.

Вы загрузили здесь весь шрифт.

@import '../assets/icons/font-awesome/css/fontawesome-all.css';

Если вы проверяете CSS, он ссылается на файлы с помощьюуказан путь, и вы выбираете url-загрузчик, поэтому путь не будет совпадать.Если вы перейдете на file-loader и зададите параметры, соответствующие пути, он скопирует туда файлы, и вы должны быть готовы к работе.

...