demo12源码地址
    项目目录为:
    image.png
    package.json 中使用的依赖如下:

    1. {
    2. "scripts": {
    3. "dev": "webpack --mode development",
    4. "build": "webpack --mode production"
    5. },
    6. "devDependencies": {
    7. "@babel/core": "^7.4.5",
    8. "@babel/plugin-transform-runtime": "^7.4.4",
    9. "@babel/preset-env": "^7.4.5",
    10. "autoprefixer": "^9.5.1",
    11. "babel-loader": "^8.0.6",
    12. "clean-webpack-plugin": "^2.0.2",
    13. "css-loader": "^2.1.1",
    14. "html-loader": "^0.5.5",
    15. "html-webpack-plugin": "^3.2.0",
    16. "image-webpack-loader": "^5.0.0",
    17. "lodash": "^4.17.11",
    18. "mini-css-extract-plugin": "^0.7.0",
    19. "node-sass": "^4.12.0",
    20. "optimize-css-assets-webpack-plugin": "^5.0.1",
    21. "postcss-loader": "^3.0.0",
    22. "postcss-sprites": "^4.2.1",
    23. "sass-loader": "^7.1.0",
    24. "style-loader": "^0.23.1",
    25. "url-loader": "^1.1.2",
    26. "webpack": "^4.29.6",
    27. "webpack-cli": "^3.3.2"
    28. }
    29. }

    app.js中引入字体文件

    import ‘./assets/fonts/iconfont.css’

    配置webpack.config.js文件来处理字体
    借助url-loader,可以识别并且处理eot,woff等结尾的字体文件同时,根据字体大小,可以灵活配置是否进行base64编码。
    下面的demo就是当文件大小小于5000B的时候,进行base64编码。

    1. const path = require('path')
    2. const CleanWebpackPlugin = require('clean-webpack-plugin')
    3. const HtmlWebpackPlugin = require('html-webpack-plugin')
    4. const MiniCssExtractPlugin = require('mini-css-extract-plugin') // 将 css 单独打包成文件
    5. module.exports = {
    6. entry: {
    7. app: './src/app.js'
    8. },
    9. output: {
    10. publicPath: './', // js 引用的路径或者 CDN 地址
    11. path: path.resolve(__dirname, 'dist'), // 打包文件的输出目录
    12. filename: '[name].bundle.js', // 代码打包后的文件名
    13. chunkFilename: '[name].js' // 代码拆分后的文件名
    14. },
    15. module: {
    16. rules: [
    17. {
    18. test: /\.(scss|css)$/, // 针对.css后缀文件设置loader
    19. // use: ["style-loader", "css-loader"]
    20. use: [
    21. {
    22. loader: MiniCssExtractPlugin.loader
    23. },
    24. "css-loader",
    25. //"postcss-loader", // 使用 postcss 为 css 加上浏览器前缀
    26. {
    27. loader: "postcss-loader",
    28. options: {
    29. ident: "postcss",
    30. plugins: [require("postcss-sprites")(spritesConfig)]
    31. }
    32. },
    33. "sass-loader" // 使用 sass-loader 将 scss 转为 css
    34. ]
    35. },
    36. {
    37. test: /\.(eot|woff2?|ttf|svg)$/,
    38. use: [
    39. {
    40. loader: 'url-loader',
    41. options: {
    42. name: '[name]-[hash:5].min.[ext]',
    43. limit: 5000, // fonts file size <= 5KB, use 'base64'; else, output svg file
    44. publicPath: 'fonts/',
    45. outputPath: 'fonts/'
    46. }
    47. }
    48. ]
    49. },
    50. {
    51. test: /\.(png|jpg|jpeg|gif)$/,
    52. use: [
    53. {
    54. loader: "url-loader",
    55. options: {
    56. name: "[name]-[hash:5].min.[ext]",
    57. outputPath: "images/", //输出到 images 文件夹
    58. limit: 10000 //把小于 20kb 的文件转成 Base64 的格式
    59. }
    60. },
    61. {
    62. loader: "image-webpack-loader",
    63. options: {
    64. // 压缩 jpg/jpeg 图片
    65. mozjpeg: {
    66. progressive: true,
    67. quality: 65 // 压缩率
    68. },
    69. // 压缩 png 图片
    70. pngquant: {
    71. quality: "65-90",
    72. speed: 4
    73. }
    74. }
    75. }
    76. ]
    77. }
    78. ]
    79. },
    80. plugins: [
    81. new CleanWebpackPlugin(),
    82. new HtmlWebpackPlugin({
    83. // 打包输出HTML
    84. title: '自动生成 HTML',
    85. minify: {
    86. // 压缩 HTML 文件
    87. removeComments: true, // 移除 HTML 中的注释
    88. collapseWhitespace: true, // 删除空白符与换行符
    89. minifyCSS: true // 压缩内联 css
    90. },
    91. filename: 'index.html', // 生成后的文件名
    92. template: 'index.html', // 根据此模版生成 HTML 文件
    93. chunks: ['app'] // entry中的 app 入口才会被打包
    94. }),
    95. new MiniCssExtractPlugin({
    96. filename: '[name].css',
    97. chunkFilename: '[id].css'
    98. })
    99. ]
    100. }

    在index.html中使用字体

    1. <html lang="en">
    2. <head>
    3. <meta charset="UTF-8" />
    4. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    5. <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    6. <title>处理字体文件</title>
    7. </head>
    8. <body>
    9. <div id="app">
    10. <div class="box">
    11. <i class="iconfont icon-yanjing"></i>
    12. <i class="iconfont icon-yanjing1"></i>
    13. <i class="iconfont icon-yanjing2"></i>
    14. <i class="iconfont icon-yanjing3"></i>
    15. </div>
    16. </div>
    17. </body>
    18. </html>

    打包后查看index.html文件,打包成功。
    image.png