【Webpack】关于sourcemap那些事

一、sourcemap是什么

source map:保存源代码映射关系的文件

1、作用

由于我们使用webpack去打包文件会生成bundle.js文件,都是混淆在一起,代码可能是一个或者多个文件组成,当报错的时候无法去定位到错误信息。

因此source-map记录了映射关系,可以帮助我们快速去定位问题

二、Webpack当中的source-map

Webpack官网链接

1、如何配置?

devtool:‘source-map’

2、配置项可选的值

在webpack官网中有很多的配置,但也是基于以下五个去组合而成。

  • source-map:产生.map文件
  • eval:使用eval包裹模块
  • cheap:不生成列信息
  • inline:将.map作为datauUrl嵌入,不单独生成一个.map文件
  • module:包含loader的map文件
  • hidden:会正常生成map文件,但是不会有sourceMappingURL=main.js.map去关联文件

三、实践

1、前端监控

一个完成的前端监控系统的流程:

  • 前端错误收集
  • 前端上报错误信息堆栈到服务器
  • 前端代码打包上线后将source-map文件上传到服务器
  • 服务器接受错误并记录到日志当中
  • 服务器根据日志和上传的source-map进行错误分析

这里实现一个简单的前端监控系统:

  • 前端上报错误到服务器
  • 服务器根据source-map去分析错误信息定位到问题

前端收集上传错误

import axios from 'axios'

// 上报错误
const fetchError = (error)=>{
    axios.get('http://127.0.0.1:3000/error',{
        params:{
            error
        }
    }).then(res=>{
        console.log(res)
    })
}

// 收集错误
window.addEventListener('error',(e)=>{
    fetchError(e.error.stack)
})

// 模拟错误代码
console.log(b)

利用Express搭建服务器

const express = require('express')
const {ananlyze} = require('./analysis')

const app = express()

// 跨域请求配置
app.use((req,res,next)=>{
    res.header('Access-Control-Allow-Origin', "*");
    res.header('Access-Control-Allow-Headers', 'Content-Type,Content-Length,Authorization,Accept,X-Requested-With');
    res.header('Access-Control-Allow-Methods','PUT,POST,GET,DELETE,OPTIONS');
    res.header('X-Powered-By', '3.2.1')
    if(req.method === 'OPTIONS') {
      res.send(200);
    } else {
      next();
    }
})

app.get('/error',async (req,res)=>{
    console.log('开始解析错误信息')
    let errorStack = req.query.error
    const data = await ananlyze(errorStack)
    console.log(data)
    res.send(data)
})

app.listen(3000,()=>{
    console.log('run at http://127.0.0.1:3000')
})

服务器根据错误和source-map去分析定位

// 引入堆栈分析工具
const StcakTracey = require('stacktracey')
// 引入source-map解析工具
const SourceMap = require('source-map')

const fs = require('fs')
const path  = require('path')

const readFile = (fielPath)=>{
    return new Promise((resolve,reject)=>{
        fs.readFile(fielPath,{flag:'r'},(error,data)=>{
            if(error) reject(error)
            else resolve(data)
        })
    })
}

const ananlyze = async (errorSatck)=>{
    // 解析错误栈信息
    const traceyInfo =  new StcakTracey(errorSatck)
    // 获取错误信息位置
    const {line,column} = traceyInfo.items[0]

    // 读取sourcemap文件
    const sourceMapFileContent = await readFile(path.resolve(__dirname,'../dist/main.js.map'))
    // 生成SourceMapConsumer实例
    const consumer = new SourceMap.SourceMapConsumer(JSON.parse(sourceMapFileContent))
    // 源代码错误信息位置
    const originalPosition = (await consumer).originalPositionFor({
        line,
        column
    })
    // 获取源代码内容
    const sourceContent = (await consumer).sourceContentFor(originalPosition.source)

    return {
        sourceContent,
        ...originalPosition
    }
}

module.exports = {
    ananlyze
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Triumph-light

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值