font-awesome、bootstrap を使用している場合、一部しか使っていない場合でも、Web アイコンフォントの読み込みが行われます。
未使用のフォントを削除するライブラリがないか探したところ、fontmin-webpack - npm見つけました。

インストール、設定まで実施みたので、結果を記載します。


fontmin 自体の使い方

fontmin 自体の使い方は以下が参考になりました。
フォントファイルから使いたい文字を抜き出してコマンドラインでWebフォント化するfontminが便利だった - Qiita

fontmin には font 含めたい文字列と フォントファイルのファイルパスを指定して使用します。
CSS ファイルを指定して フォントを生成するオプションはなく、fontmin-webpack は CSS内のアイコンのユニコードの文字列を抽出してそれをfontmin の引数に設定して実行しています。


fontmin-webpack を使用する前段階で実施すること

fontmin-webpack CSS 定義を軸に使用していないフォントファイルを削除します。
事前に未使用のCSS定義を最適化する UnCSS 等で使用している CSS のみを抽出する必要があります。
UnCSS の使い方は以前まとめていますので、よろしければ以下ご確認ください。


インストール、設定

インストール、設定を行います。

  • インストール

    npm i -D fontmin-webpack
    

  • webpack.config.js の修正
    survivejs/webpack-merge: Merge designed for Webpack (MIT)使用している状況で、production の ビルドのみ適用しました。

    const FontminPlugin = require('fontmin-webpack')
    
    module.exports = Merge(BaseConfig, {
        plugins: [
          new FontminPlugin({
            autodetect: true // automatically pull unicode characters from CSS
          }),
        ],        
    

  • エントリーポイント index.js の実装
    bootstrap.optimized.cssfont-awesome.optimized.css事前に UnCSS で未使用のCSS ファイルを削除したファイルです。
    これで、実際に使用しているフォントのみが抽出されます。

    import '../css/normalize.css';
    import '../css/bootstrap.optimized.css';
    import '../css/clean-blog.css';
    import '../css/codehilite.css';
    import '../css/font-awesome.optimized.css';
    import '../css/fonts.css';
    import './jquery.js';
    import './bootstrap.js';
    import './clean-blog.js';
    
    import registerServiceWorker from './registerServiceWorker.js';
    
    registerServiceWorker();
    
    import pageConfigurator from './pageConfigurator.js';
    
    pageConfigurator();
    


未使用アイコン削除後の font ファイルのサイズ

合計 911.8 KiB が、合計 26.17 KiB になり、 97 % 削減できました。

  • 削除前

                                                    Asset      Size  Chunks                    Chunk Names
                     1dc35d25e61d819a9c357074014867ab.ttf   149 KiB          [emitted]         
                     25a32416abee198dd821b0b17a198a8f.eot  74.7 KiB          [emitted]         
                   448c34a56d699c29117adc64c43affeb.woff2  17.4 KiB          [emitted]         
                     5e173a86206ff17b10b9d500a0a5a64c.svg   335 KiB          [emitted]  [big]  
                     7e2cf4cef159859a7dd1794e5173dd54.svg  91.7 KiB          [emitted]         
                    c8ddf1e5e5bf3682bc7bebf30f394148.woff  88.3 KiB          [emitted]         
                     e18bbf611f2a2e43afc071aa2f4e1512.ttf  43.1 KiB          [emitted]         
                   e6cf7c6ec7c2d6f670ae9d762604cb0b.woff2    70 KiB          [emitted]         
                     f4769f9bdb7466be65088239c12046d1.eot  19.7 KiB          [emitted]         
                    fa2772327f55d8198301fdb8bcfc8158.woff  22.9 KiB          [emitted]         
    

  • 削除後

                                                    Asset      Size  Chunks             Chunk Names
                     1dc35d25e61d819a9c357074014867ab.ttf  2.85 KiB          [emitted]  
                     25a32416abee198dd821b0b17a198a8f.eot  3.04 KiB          [emitted]  
                   448c34a56d699c29117adc64c43affeb.woff2  1.11 KiB          [emitted]  
                     5e173a86206ff17b10b9d500a0a5a64c.svg  3.85 KiB          [emitted]  
                     7e2cf4cef159859a7dd1794e5173dd54.svg  2.69 KiB          [emitted]  
                    c8ddf1e5e5bf3682bc7bebf30f394148.woff  2.92 KiB          [emitted]  
                     e18bbf611f2a2e43afc071aa2f4e1512.ttf  2.65 KiB          [emitted]  
                   e6cf7c6ec7c2d6f670ae9d762604cb0b.woff2  1.37 KiB          [emitted]  
                     f4769f9bdb7466be65088239c12046d1.eot  2.96 KiB          [emitted]  
                    fa2772327f55d8198301fdb8bcfc8158.woff  2.73 KiB          [emitted]  
    


参考

以下、参考にした記事になります。

以上です。

コメント