【问题标题】:Loading FontAwesome via Webpack: Fonts do not load通过 Webpack 加载 FontAwesome:字体不加载
【发布时间】:2018-10-15 19:49:15
【问题描述】:

我试图了解如何在通过 scss 文件加载字体时通过 fontawsome 加载字体:

这是我的 webpack 配置:

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
    }

};

这是我加载 FontAwesome(和其他)的 SCSS 文件。

@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(或其他)时,我没有收到任何提及字体的错误。

加载我的网站时,我会在“网络”面板中获得这些 URL 引用:

https://mywebsite.potato.com/public/webfonts/fa-regular-400.woff
https://mywebsite.potato.com/public/fonts/Simple-Line-Icons.ttf?-i3a2kk

指向我的目录中甚至不存在的字体文件(或至少不被创建..)

如何正确加载字体?

编辑:

为@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 截图

【问题讨论】:

    标签: javascript webpack font-awesome urlloader angular-fontawesome


    【解决方案1】:

    更新

    基于 github 文件,您的目标是 php 文件上未更改的 css。 webpack不会解析的,去掉吧。

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

    如果您运行 npm run build 您的入口点是 JS 文件,这将是通过 webpack 解析的 JS 文件,它将生成您的所有文件并且需要包含在内。

    然后您使用mini css extract plugin 将您的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-loader 也有 url=false 所以字体解析器永远不会被调用。从加载程序中删除 url: false 。然后只是使用文件加载器选项的情况,您可以更改public-path 以转到您存储文件的任何位置,它们将在生成的css和@987654324上被替换@ 将它们复制到所需的位置。

    总结一下:

    • 检查您是否正在导入正确的 css 文件,重命名该文件,如果需要保证,请查看它所在的位置
    • 如果要替换 url 和加载器,请从 css-loader 中删除 url:false 并确保字体文件正则表达式匹配它们。
    • 为避免混淆,请将所有输出存储在单独的文件夹中,并检查其中的内容。

    第一个答案:

    如果你已经在使用 font-awesome 和 webpack,我建议你使用 font-awesome-loader

    这将是加载它们的最简单方法,但更深入的解释是,基本上对于每个文件扩展名,webpack 都需要一个加载器来处理它。它将适当地处理文件并将其内容放在某处。

    所以让 webpack 加载 fontawesome 字体的步骤是:

    • 在您的项目中安装font awesome package(或将资产放在某个固定位置)。
    • 使用如下加载器加载字体文件

      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 上的 font-awesome 加载适当的 CSS/SCSS/LESS。

    所以在这部分分析你的代码:

            // 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。

    你在这里加载了所有字体很棒的 css

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

    如果您检查 CSS,它会通过给定路径引用文件,并且您选择 url-loader,因此路径将不匹配。如果您更改为 file-loader 并使选项与适当的路径匹配,它将在那里复制文件,您应该准备就绪。

    【讨论】:

    • 我研究了一下,决定改用文件加载器(主要是因为缓存)。我确实想通过 CSS (@import '../assets/icons/font-awesome/css/fontawesome-all.css';) 加载字体,因为我确实有其他 css 文件依赖于在 CSS 文件中加载此类内容,并且不能冒险不设置它。我正在用我目前通过 webpack.conf.js 设置的内容编辑我的帖子。它不会将字体的任何新文件副本生成到设置目录 - 并且在加载页面时不会通过 URL 引用它们。我错过了什么?
    • 也许使用这个加载器的正确方法是将它添加到一个css“测试”中,而不是作为一个整体来添加它本身? ?(因为它通过 css 加载字体...?)
    • 如果你直接使用 CSS(请记住 font awesome 也有 SCSS、less 和其他文件)并且它期望文件位于特定 URL 上,诀窍是让 webpack 输出字体预期文件夹中的文件,检查文件加载器的输出路径和公共路径选项。另一个简单的胜利是只使用字体 Awesome CDN。无论如何检查文件加载器是否正在查找文件,在预期的路径上输出并且应该这样做。
    • 我可以在明天晚上检查一下,看看是什么。到那里
    • @FabioCosta 为什么你没有更多的支持?这明明就是答案!什么冠军。我错过了publicPath,这真的弄乱了我的相对路径。像魅力一样工作!
    【解决方案2】:

    我刚刚发布了这样的detailed answer on another similar question。这可以帮助您,还包括另一种可能的解决方案,即使用 FontAwesome5 和 SVG+JS 的新方法。这样就不需要字体文件、Webpack 加载器等......只需在您的 JavaScript 代码中增加几行即可。

    (我希望发布这样的答案不违反规则。另一个是长文,我不想复制粘贴它。应该吗?我认为重复的标志不能在这里使用...)

    【讨论】:

      猜你喜欢
      • 2017-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-22
      • 2020-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多