webpack总结(下)

118 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第24天,点击查看活动详情

webpack 中处理图片 - url-loader

在上篇文章中,我们试了一下,在css中用到一下背景图片,结果就报错了,难道webpack连图片也认不出来吗?

没有错,的确认不出来, 此时需要转换图片的 loader, 来处理图片的问题, 主要用到 url-loaderfile-loader

注意: url-loader 中的部分功能要用到 file-loader, 要下载两个模块

  1. 下载依赖包

     yarn add url-loader file-loader -D
    
  2. 配置loader

    图片转成 base64 字符串,

    • 好处就是浏览器不用发请求了,直接可以读取
    • 坏处就是如果图片太大,再转base64就会让图片的体积增大 30% 左右, 得不偿失

    所以需要通过 options 配置选项进行配置 limit, 可以设置一个临界值, 大于这个值会整个文件直接打包到目录中, 得到是路径,

    如果小于这个值, 就会转成 base64, 节约请求的次数。

{
  test: /\.(png|jpg|gif|jpeg)$/i,
  use: [
    {
      loader: 'url-loader',
      // 配置了limit, 超过8k, 不转, 
      // 不到8k, 转base64字符串
      options: {
        limit: 8 * 1024,
      },
    },
  ],
}

webpack 配置字体图标 - url-loader

字体图标和图片的配置一致。

// 处理字体图标的解析
{
  test: /\.(eot|svg|ttf|woff|woff2)$/,
  use: [
    {
      loader: 'url-loader',
      options: {
        limit: 8 * 1024,
        // 配置输出的文件名
        name: '[name].[ext]',
        // 配置静态资源的引用路径
        publicPath: "../fonts/",
        // 配置输出的文件目录
        outputPath: "fonts/"
      }
    }
  ]
}

webpack 使用 babel 处理高版本的 js 语法

webpack 默认仅内置了 模块化的 兼容性处理 import export

babel 的介绍 => 用于处理高版本 js语法 的兼容性

  1. 安装包
yarn add -D babel-loader @babel/core @babel/preset-env
  1. 配置规则
module: {
  rules: [
    {
      test: /\.js$/,
      exclude: /(node_modules|bower_components)/,
      use: {
        loader: 'babel-loader',
        options: {
          presets: ['@babel/preset-env']
        }
      }
    }
  ]
}

webpack 开发服务器

每次修改代码, 都需要重新 yarn build 打包, 才能看到最新的效果, 且实际工作中, 打包 yarn build 非常费时 (30s - 60s) 之间。为什么费时?

  1. 构建依赖
  2. 读取对应的文件, 才能加载
  3. 用对应的 loader 进行处理
  4. 将处理完的内容, 写入到 dist 目录

可以起一个开发服务器, 在电脑内存中打包, 缓存一些已经打包过的内容, 只重新打包修改的文件, 最终运行加载在内存中。

webpack-dev-server自动刷新

  1. 下载
 yarn add webpack-dev-server -D
  1. 配置scripts
 scripts: {
     "build": "webpack --config webpack.config.js",
     "dev": "webpack serve --config webpack.config.js"
 }

webpack-dev-server 的配置

devServer: {
  port: 3000, // 端口号
  open: true // 自动打开浏览器
}

source map 的说明

source map => 用于在浏览器中调错使用

生产环境遇到的问题

前端项目在投入生产(上线)环境之前,都需要对 JavaScript 源代码进行压缩混淆,从而减小文件的体积,

提高文件的加载效率。此时就不可避免的产生了另一个问题:

对压缩混淆之后的代码除错(debug)是一件极其困难的事情

  • 变量被替换成没有任何语义的名称
  • 空行和注释被剔除

source map 介绍

Source Map 就是一个信息文件,里面储存着 位置信息

也就是说: Source Map 文件中 存储着 压缩混淆后代码 对应的 转换前的位置。有了它,出错的时候,除错工具将直接显示原始代码,而不是转换后的代码,能够极大的方便后期的调试。

开发环境的 source map

mode: development开发环境下,webpack 默认启用了 Source Map 功能。

当程序运行出错时,可以直接在控制台提示错误行的位置,并定位到具体的源代码。但是, 默认的行数不对应, 加上如下配置即可解决行数不对应的问题。

module.exports = {
  ...,
  
  mode: 'development',
  // eval-source-map 开发模式下使用, 保证运行时的行数 和 源代码行数 一致
  devtool: 'eval-source-map',
  
  ...
}

生产环境的 source map

在生产环境下,如果省略了 devtool 选项,则最终生成的文件中不包含 Source Map。

这能够防止原始代码通过 Source Map 的形式暴露给别有所图之人。 在生产环境下,如果只想定位报错的具体行数,且不想暴露源码。 此时可以将devtool 的值设置为 nosources-source-map。

devtool: 'nosources-source-map'