前端工程化-Webpack 基础-打包字体、资源模块、开发服务器

以下皆为拉勾教育课件内笔记

打包字体

下载字体文件

https://www.iconfont.cn/

file-loader

module.exports = { 
  // .... 
  // 模块配置 
  module: { 
    rules: [ 
      // 匹配字体⽂件 
      { 
        test: /\.(eot|svg|ttf|woff|woff2)$/i, 
        use: { 
          loader: 'file-loader', 
          options: { 
            name: 'fonts/[name].[ext]' 
          } 
        } 
      } 
    ] 
  } 
}

copy-webpack-plugin

不需要处理的其他文件,可以直接复制到输出目录
详情查看:https://www.npmjs.com/package/copy-webpack-plugin

clean-webpack-plugin

每次打包之前,先删除输出目录中的历史文件(抱住输出目录中的打包文件是最新的)
详情查看:https://www.npmjs.com/package/clean-webpack-plugin

资源模块(asset modules)

Webpack 5 提供了一个新的特性 - 资源模块。资源模块是一种模块类型,它允许使用资源文件,即通过资源模块也可以加载图片或字体,而无需使用 loader 。

module.exports = { 
  // .... 
  // 模块配置 
  module: {
    rules: [
      // 处理图⽚
      {
        test: /\.(png|gif|jpe?g)$/i, 
        // use: { 
          // loader: "url-loader", 
          // options: { 
          // // 指定图⽚⼤⼩,⼩于该数值的图⽚,会被转成 base64 
          // limit: 8 * 1024, // 8 kb 
          // // [name] 是图⽚原来的名称 
          // // [ext] 是图⽚原来的后缀名 
          // name: "image/[name].[ext]", 
          // // url-loader 默认采⽤ ES Modules 规范进⾏解析,但是 html-loader 引⼊图⽚使⽤的是 CommonJS 规范 
          // // 解决:关闭 url-loader 默认的 ES Modules 规范,强制 url-loader 使⽤ CommonJS 规范进⾏打包 
          // esModule: false
          // } 
        // } 

        // 使⽤资源模块
        type: 'asset', 
        parser: { 
          dataUrlCondition: { 
            maxSize: 8 * 1024
          } 
        }, 
        generator: { 
          filename: "image/[name][ext]"
        }
      }, 
      // 匹配字体⽂件 
      {
        test: /\.(eot|svg|ttf|woff|woff2)$/i, 
        // use: { 
          // loader: 'file-loader',
          // options: { 
          // name: 'fonts/[name].[ext]'
          // } 
        // }

        // 使⽤资源模块处理字体⽂件
        // asset 可以在 asset/resource 和 asset/inline 之间进⾏选择
        // 如果⽂件⼩于 8kb,则使⽤ asset/inline 类型
        // 如果⽂件⼤于 8kb,则使⽤ asset/resource 类型
        type: 'asset',
        parser: { 
          dataUrlCondition: { 
            maxSize: 8 * 1024
          }
        }, 
        generator: { 
          filename: "fonts/[name][ext]" 
        } 
      }, 
    ] 
  } 
}

资源模块

资源模块(asset module)是⼀种模块类型,它允许使用资源文件(字体,图标等)而无需配置额外 loader。详情查看:https://webpack.docschina.org/guides/asset-modules/

在 Webpack 5 之前,通常使用

资源模块类型(asset module type),通过添加 4 种新的模块类型,来替换所有这些 loader:

  • asset/resource 发送⼀个单独的文件并导出 URL。之前通过使用 file-loader 实现。
  • asset/inline 导出⼀个资源的 data URI。之前通过使用 url-loader 实现。
  • asset/source 导出资源的源代码。之前通过使用 raw-loader 实现。
  • asset 在导出⼀个 data URI 和发送⼀个单独的文件之间自动选择。之前通过使用 url- loader,并且配置资源体积限制实现。

即:不需要上述 loader,我们在 Webpack 5 中,也可以处理图片字体等资源文件

例如:

module.exports = { 
  // ...... 
  // 模块配置 
  module: { 
    rules: [ 
      // 处理图⽚
      // {
        // test: /\.(png|gif|jpe?g)$/i, 
        // use: { 
          // loader: "url-loader", 
          // options: { 
            // // 指定图⽚⼤⼩,⼩于该数值的图⽚,会被转成 base64
            // limit: 8 * 1024, // 8 kb 
            // // [name] 是图⽚原来的名称 
            // // [ext] 是图⽚原来的后缀名
            // name: "image/[name].[ext]", 
            // // url-loader 默认采⽤ ES Modules 规范进⾏解析,但是 ht ml-loader 引⼊图⽚使⽤的是 CommonJS 规范 
            // // 解决:关闭 url-loader 默认的 ES Modules 规范,强制 url-loader 使⽤ CommonJS 规范进⾏打包 
            // esModule: false 
          // } 
        // } 
      // }, 
    
      // 通过资源模块来处理图⽚
      { 
        test: /\.(png|gif|jpe?g)$/i, 
        type: 'asset',
        // 现在,webpack 将按照默认条件,⾃动地在 resource 和 inline 之 间进⾏选择:
        // ⼩于 8kb 的⽂件,将会视为 inline 模块类型,否则会被视为 resource 模块类型。
        // ⾃定义设置
        parser: {
          dataUrlCondition: {
            maxSize: 8 * 1024
          }
        },
        generator: { 
          filename: "image/[name][ext]" // 单独指定名字
        }
      },
      // 通过资源模块来处理字体
      {
        test: /\.(eot|svg|ttf|woff|woff2)$/i,
        // use: {
          // loader: 'file-loader', 
          // options: { 
            // name: 'fonts/[name].[ext]' 
          // } 
        // } 
        type: 'asset', 
        parser: {
          dataUrlCondition: { 
            maxSize: 8 * 1024
          }
        }, 
        generator: {
          filename: "fonts/[name][ext]" // 单独指定名字
        }
      }, 
      // ......
    ]
  }
}

开发服务器(Dev Server)

Webpack Dev Server(Webpack 开发服务器),详情查看:https://www.npmjs.com/package/webpack-dev-server
https://webpack.docschina.org/configuration/dev-server

安装

npm i webpack-dev-server -D 

# 或者 
npm i webpack-dev-server -g

运行

# webpack 4 
webpack-dev-server ... 

# webpack 5 
webpack server ...

Webpack Dev Server 将打包内容放到内存中(而非磁盘),内存的读写性能远⼤于磁盘,因此 Webpack Dev Server 的热更新效率⼤于 browser-sync

运行 并 自动打开浏览器:webpack server --open

为 Webpack Dev Server 指定配置

更多配置详情:https://webpack.docschina.org/configuration/dev-server

// webpack.config.js
devServer: {
  // 项⽬构建后路径
  contentBase:resolve(__dirname,'output'),
  
  // 启动 gzip 压缩 
  compress:true, 

  // 端⼝号
  port:8080, 

  // ⾃动打开浏览器 
  open: true, 

  // 开启热更新 
  // Webpack 4
  // hot: true,  
  // Webpack 5 
  liveReload: true, // 热更新(需要禁用 hot)
  target: "web", // 热更新只适用于 web 相关的 targets

  // 开启接⼝代理(解决接口跨域问题)
  proxy: {
    // http://localhost:8080/api
    '/api': { 
      // http://localhost:8080/api/users -> https://api.github.com/api/users
      target: 'https://api.github.com', 
      // http://localhost:8080/api/users -> https://api.github.com/users
      pathRewrite: {
        '^/api': ''
      },
      // 不能使⽤ localhost:8080 作为请求 GitHub 的主机名 
      changeOrigin: true 
    } 
  } 
},
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容