2022-09-29Webpack00

sourcemap

Source map 就是一个信息文件,里面储存着位置信息。也就是说,转换后的代码的每一个位置,所对应的转换前的位置。

源文件

function sayHello(name) {
  if (name.length > 2) {
    name = name.substr(0, 1) + "...";
  }
  console.log("hello,", name);
}

压缩后

function sayHello(name) {
  if (name.length > 2) {
    name = name.substr(0, 1) + "...";
  }
  console.log("hello,", name);
}
sayHello("世界");
sayHello("第三世界的人们");

map 文件

{"version":3,"sources":["log.js","main.js"],"names":["sayHello","name","length","substr","console","log"],"mappings":"AAAA,SAASA,SAASC,MACd,GAAIA,KAAKC,OAAS,EAAG,CACjBD,KAAOA,KAAKE,OAAO,EAAG,GAAK,MAE/BC,QAAQC,IAAI,SAAUJ,MCJ1BD,SAAS,MACTA,SAAS"}
2022-09-29其他00

二进制

通过 accept 限制上传文件类型

在日常工作中,文件上传是一个很常见的功能。在某些情况下,我们希望能限制文件上传的类型,比如限制只能上传 PNG 格式的图片。针对这个问题,我们会想到通过 input 元素的 accept 属性来限制上传的文件类型:

<input type="file" id="inputFile" accept="image/png" />

这种方案虽然可以满足大多数场景,但如果用户把 JPEG 格式的图片后缀名更改为 .png 的话,就可以成功突破这个限制。因为通过 文件后缀名或文件的 MIME 类型 并不能识别出正确的文件类型。我们可以通过读取文件的二进制数据来识别正确的文件类型。

如何通过二进制查看图片的类型

计算机并不是通过图片的后缀名来区分不同的图片类型,而是通过 Magic Number 来区分。 对于某一些类型的文件,起始的几个字节内容都是固定的,根据这几个字节的内容就可以判断文件的类型。

常见图片类型对应的 Magic Number 如下表所示:

文件类型文件后缀魔数
JPEGjpg/jpeg0xFF D8 FF
PNGpng0x89 50 4E 47 0D 0A 1A 0A
GIFgif0x47 49 46 38(GIF8)
BMPbmp0x42 4D
2022-09-29其他00

优雅代码

If 语句

bad

if (value === "duck" || value === "dog" || value === "cat") {
  // ...
}

good

const options = ["duck", "dog", "cat"];
if (options.includes(value)) {
  // ...
}

提前退出机制

function handleEvent(event) {
  if (event) {
    const target = event.target;
    if (target) {
      // ...
    }
  }
}

使用提前退出,减少嵌套

function handleEvent(event) {
  if (!event || !event.target) {
    return;
  }
  // ...
}
2022-09-29质量保障00

前端错误的分类

  • 资源加载错误
  • 代码运行错误

错误的捕获方式

即时运行错误的捕获方式

  • try - catch
  • window.onerror

资源加载错误

  • object.onerror
    • image 标签、script 标签上都可以加 onerror 事件
    • 资源加载错误不会冒泡,但会捕获
  • performance.getEntries()
    • 获取所有已经加载资源的获取时长
  • window 对象上通过事件捕获 Error 事件

注: addEventLitener('事件类型', function(e){ /回调函数/ },捕获 true 或冒泡 false )

一般情况下错误监控都是在捕获的阶段进行。

跨域的 JS 运行错误

因为了,只知道错误,但是无法定位错误信息 解决方法:

  1. 客户端,在 script 标签上增加 crossorigin 属性
  2. 服务端,设置 JS 资源响应头 Access-Control-Allow-Origin: *

上报错误信息

  1. 采用 Ajax 通信上报
  2. 利用 image 对象的 src 属性上报
2022-09-29质量保障00

前端监控

前端监控包括行为监控、异常监控、性能监控。

前端产生异常的原因主要分 5 类:

  • 逻辑错误
    • 业务逻辑判断条件错误
    • 事件绑定顺序错误
    • 调用栈时序错误
    • 错误的操作 js 对象
  • 数据类型错误
    • 将 null 视作对象读取 property
    • 将 undefined 视作数组进行遍历
    • 将字符串形式的数字直接用于加运算
    • 函数参数未传
  • 语法句法错误
  • 网络错误
    • 请求过慢
    • 服务端未返回数据但仍 200,前端按正常进行数据遍历
    • 提交数据时网络中断
    • 服务端 500 错误时前端未做任何错误处理
  • 系统错误
    • 内存不够用
    • 磁盘塞满
    • 壳不支持 API
    • 不兼容