【问题标题】:Use font-awesome in a Vue app created with vue-cli webpack在使用 vue-cli webpack 创建的 Vue 应用程序中使用 font-awesome
【发布时间】:2017-05-23 01:49:49
【问题描述】:

我正在尝试在使用 webpack-simple 模板通过 vue-cli 创建的简单 Vue 应用程序中使用 font-awesome,但这很棘手。

我使用 npm install font-awesome --save 安装了 font-awesome,并将其导入到我的条目 js (main.js) 中

import Vue from 'vue'
import App from './App.vue'
import VueRouter from 'vue-router';
import Home from "./components/Home.vue"

Vue.use(VueRouter);

import 'font-awesome/css/font-awesome.css';

const routes = [
    { path: '/', component: Home }
];

const router = new VueRouter({
    routes,
    mode: 'history'
});

new Vue({
  el: '#app',
  router,
  render: h => h(App)
})

这是我当前的 webpack.config.js 文件:

var path = require('path')
var webpack = require('webpack')

module.exports = {
  entry: './src/main.js',
  output: {
    path: path.resolve(__dirname, './dist'),
    publicPath: '/dist/',
    filename: 'build.js'
  },
  module: {
    rules: [
      {
        test: /\.vue$/,
        loader: 'vue-loader',
        options: {
          loaders: {
            // Since sass-loader (weirdly) has SCSS as its default parse mode, we map
            // the "scss" and "sass" values for the lang attribute to the right configs here.
            // other preprocessors should work out of the box, no loader config like this nessessary.
            'scss': 'vue-style-loader!css-loader!sass-loader',
            'sass': 'vue-style-loader!css-loader!sass-loader?indentedSyntax'
          }
          // other vue-loader options go here
        }
      },
      {
        test: /\.js$/,
        loader: 'babel-loader',
        exclude: /node_modules/
      },
      {
        test: /\.(png|jpg|gif|svg)$/, 
        loader: 'file-loader',
        options: {
          name: '[name].[ext]?[hash]'
        }
      },
      {
        test: /\.woff(\?v=\d+\.\d+\.\d+)?$/,
        loader: "url?limit=10000&mimetype=application/font-woff"
      }, {
        test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/,
        loader: "url?limit=10000&mimetype=application/font-woff"
      }, {
        test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/,
        loader: "url?limit=10000&mimetype=application/octet-stream"
      }, {
        test: /\.eot(\?v=\d+\.\d+\.\d+)?$/,
        loader: "file"
      }, {
        test: /\.svg(\?v=\d+\.\d+\.\d+)?$/,
        loader: "url?limit=10000&mimetype=image/svg+xml"
      }
    ]
  },
  resolve: {
    alias: {
      'vue$': 'vue/dist/vue.common.js'
    }
  },
  devServer: {
    historyApiFallback: true,
    noInfo: true
  },
  performance: {
    hints: false
  },
  devtool: '#eval-source-map'
}

if (process.env.NODE_ENV === 'production') {
  module.exports.devtool = '#source-map'
  // http://vue-loader.vuejs.org/en/workflow/production.html
  module.exports.plugins = (module.exports.plugins || []).concat([
    new webpack.DefinePlugin({
      'process.env': {
        NODE_ENV: '"production"'
      }
    }),
    new webpack.optimize.UglifyJsPlugin({
      sourceMap: true,
      compress: {
        warnings: false
      }
    }),
    new webpack.LoaderOptionsPlugin({
      minimize: true
    })
  ])
}

我已经尝试将字体加载器更改为以下内容:

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

但是两种配置都会抛出同样的错误:

ERROR in ./~/font-awesome/css/font-awesome.css
Module parse failed: /home/james/projects/app/node_modules/font-awesome/css/font-awesome.css Unexpected character '@' (7:0)
You may need an appropriate loader to handle this file type.
| /* FONT PATH
|  * -------------------------- */
| @font-face {
|   font-family: 'FontAwesome';
|   src: url('../fonts/fontawesome-webfont.eot?v=4.7.0');
 @ ./src/main.js 11:0-43
 @ multi main

经过一番谷歌,我找到了一些链接(例如hereherehere),但它们中的任何一个都对我有用,错误总是一样的。

什么是推荐的加载器来处理字体很棒的文件?我认为问题出在加载程序上,因为所有正则表达式对我来说都很好。

有关信息,以下是package.json中的版本:

"dependencies": {
    "bulma": "^0.3.0",
    "font-awesome": "^4.7.0",
    "vue": "^2.1.0",
    "vue-resource": "^1.0.3",
    "vue-router": "^2.1.1"
  },
  "devDependencies": {
    "babel-core": "^6.0.0",
    "babel-loader": "^6.0.0",
    "babel-preset-es2015": "^6.0.0",
    "cross-env": "^3.0.0",
    "css-loader": "^0.25.0",
    "file-loader": "^0.9.0",
    "style-loader": "^0.13.1",
    "vue-loader": "^10.0.0",
    "vue-template-compiler": "^2.1.0",
    "webpack": "^2.1.0-beta.25",
    "url-loader": "^0.5.5",
    "webpack-dev-server": "^2.1.0-beta.9"
  }

【问题讨论】:

    标签: webpack font-awesome vuejs2


    【解决方案1】:

    看来你需要在你的 webpack 配置中包含一个 .css 的加载器:

      {
        test: /\.css$/,
        loader: 'css-loader'
      },
    

    【讨论】:

    • 也许只有“css-loader”是不够的。您可以尝试loader: 'style-loader!css-loader'loader: 'style-loader!css-loader?sourceMap'(带有源映射)。
    • 感谢您的回答。我现在试过了,但它不起作用。我 intaled npm install css-loader --save-dev 并包含您的建议配置,但现在我收到错误 /home/james/Projects/app/node_modules/loader-runner/lib/loadLoader.js:35 throw new Error("Module '" + loader.path + "' is not a loader (must have normal or pitch function)"); ^ Error: Module '/home/james/Projects/app/node_modules/url/url.js' is not a loader (must have normal or pitch function)。有什么建议吗?
    • 在您的loader: 配置中,使用url-loader 而不是url。 (例如,将loader: "url?limit=10000 更改为loader: "url-loader?limit=10000。您还有一个loader: 'file',应该是loader: 'file-loader'。根据您的package.json,您已经安装了所有加载程序。无需安装其他任何东西。最后提示:在 Webpack 2 仍处于测试阶段时使用 Webpack 1(除非您已经对 Webpack 1 有足够的了解,或者您有充分的理由使用 Webpack 2)。
    • 警告和错误现在都消失了,但我的图标仍然没有出现在页面中:/。我将您的回复标记为正确,因为它解决了最初的问题,但请在答案中输入您的 cmets 以帮助其他人。我会继续尝试在我的项目中使用 font-awesome。
    • 旁注:vue-cli 模板“webpack-simple”已经使用 webpack 2 启动项目。我将尝试将其更改为版本 1。
    【解决方案2】:

    随着 FontAwesome-5 的发布,FontAwesome 团队为 vue 和其他库完成了一些独家工作:

    有点过时的解决方案但仍然有效,请查看以下更新的解决方案:

    • 检查 fontawesome 高级选项here
    • 对于 npm 包和文档检查 here

    无论如何,这是我为整合它所做的,首先 安装了这些包:

    npm i --save @fortawesome/fontawesome
    npm i --save @fortawesome/vue-fontawesome
    npm i --save @fortawesome/fontawesome-free-solid
    

    创建一个名为 fa.config.js 的文件并包含以下代码:

    import Vue from 'vue';
    import fontawesome from '@fortawesome/fontawesome';
    import FontAwesomeIcon from '@fortawesome/vue-fontawesome';
    import {
      faSpinner,
      faAngleLeft,
      faAngleRight,
    } from '@fortawesome/fontawesome-free-solid';
    
    fontawesome.library.add(
      faSpinner,
      faAngleLeft,
      faAngleRight,
    );
    
    Vue.component('font-awesome-icon', FontAwesomeIcon); // registered globally
    

    并将其导入main.js

    import './path/to/fa.config';
    

    在我的组件中,我是这样使用它的:

    <template>
      <div>
        <font-awesome-icon icon="angle-left"></font-awesome-icon> Hey! FA Works
      </div>
    </template>
    

    现在你们可能已经明白了像我上面那样做的好处是什么?

    使用显式图标提供了仅捆绑图标的优势 您在最终捆绑文件中使用的。这允许我们对字体进行子集化 Awesome 的数以千计的图标只是少数 正常使用。

    希望这会有所帮助!


    更新 - 2018 年 6 月 22 日星期五
    上述解决方案仍然有效,但现在事情以不同的方式完成,首先安装这些包:

    npm i --save @fortawesome/fontawesome-svg-core
    npm i --save @fortawesome/free-solid-svg-icons
    npm i --save @fortawesome/free-regular-svg-icons // if "regular" icon package needed
    npm i --save @fortawesome/vue-fontawesome
    

    然后创建一个名为 fa.config.js 的文件并包含以下代码:

    import Vue from 'vue';
    import { library } from '@fortawesome/fontawesome-svg-core'
    import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'
    
    import { faUser, faBuilding } from '@fortawesome/free-solid-svg-icons'
    import { faUserCircle, faCheckCircle } from '@fortawesome/free-regular-svg-icons'
    
    library.add(
      faUser,
      faBuilding,
      faUserCircle,
      faCheckCircle,
    );
    
    Vue.component('font-awesome-icon', FontAwesomeIcon); // registered globally
    

    假设您喜欢使用regularsolid 类型的faUser 图标,然后进行此更改:

    import { faUser as fasUser, faBuilding } from '@fortawesome/free-solid-svg-icons'
    import { faUser as farUser, faCheckCircle } from '@fortawesome/free-regular-svg-icons'
    
    library.add(
      fasUser,
      farUser,
      faBuilding,
      faCheckCircle,
    );
    

    并在 main.js 中导入

    import './path/to/fa.config';
    

    在我的组件中,我是这样使用它的:

    <template>
      <div>
        <font-awesome-icon icon="user"></font-awesome-icon>
    
        // If you like to use Font Awesome Regular, then:
        <font-awesome-icon :icon="['far', 'user']"></font-awesome-icon>
        <font-awesome-icon :icon="['far', 'check-circle']"></font-awesome-icon>
    
      </div>
    </template>
    

    【讨论】:

    • 非常感谢。如何导入和呈现常见的图标类型,如向上箭头等?我没有看到它以 free-solid-svg-icons 导出。
    • @Raja 没有什么比常见或不常见的了,就像我在上面所做的那样,每件事都必须手动导入,就像你的情况一样 import { faArrowUp, faUser, faBuilding } from '@fortawesome/free-solid-svg-icons' 然后像这样添加到库中:library.add(faUser, faArrowUp) 和你可以这样使用它:&lt;font-awesome-icon icon="arrow-up"&gt;&lt;/font-awesome-icon&gt;
    【解决方案3】:

    我使用简单的解决方案 webpack:

    webpack.config.js:

    const path = require('path')
    
    module.exports = {
        resolve: {
            alias: {
                '@': path.resolve('resources/js')
            }
        }
    }
    

    webpack.mix.js

    mix.js('resources/js/app.js', 'public/js').vue()
        .sass('resources/sass/app.scss', 'public/css')
        .webpackConfig(require('./webpack.config'))
    
    if (mix.inProduction()) {
        mix.version()
    }
    

    在 app.scss 中使用 sass

    @import '~@fortawesome/fontawesome-free/scss/brands.scss';
    @import '~@fortawesome/fontawesome-free/scss/fontawesome.scss';
    @import '~@fortawesome/fontawesome-free/scss/regular.scss';
    @import '~@fortawesome/fontawesome-free/scss/solid.scss';
    

    安装所有依赖 我在 package.json 中使用:

    "@fortawesome/fontawesome-free": "^5.15.4",
    "@fortawesome/free-brands-svg-icons": "^5.15.4",
    "@fortawesome/free-regular-svg-icons": "^5.15.4",
    "@fortawesome/free-solid-svg-icons": "^5.15.4",
    

    不要破坏你的 main 并调用它

    <i class="fa fa-icon> </i>
    <i class="fas fa-icon> </i> // for solid
    <i class="far fa-icon> </i> // for Regular
    

    想象一下品牌是怎样的。!

    【讨论】:

      猜你喜欢
      • 2018-12-15
      • 2018-05-10
      • 2020-10-31
      • 2021-05-29
      • 2023-01-23
      • 2018-05-30
      • 2017-08-01
      • 2018-01-26
      • 2020-08-23
      相关资源
      最近更新 更多