作用
首先来说一下他的作用。
我们在webpack进行打包的时候,如果打包的文件有报错,
我们是没办法得知具体报错在我们哪个文件上,因为他会定位到打包后的文件main.js里面
默认配置
:::info
但实际sourceMap的默认配置已经帮我们做了这样的功能,
所以就算不设置sourceMap也可以定位到具体的正确文件
:::

什么配置都没加,还是能正确定位到index.js
const path = require('path')const HtmlWebpackPlugin = require('html-webpack-plugin')const { CleanWebpackPlugin } = require("clean-webpack-plugin");module.exports = {mode: 'development',entry: {// 在entry对象中,创建两个入口文件main: './src/index.js'},module: {rules:[{test: /\.(jpg|png|gif)$/,use:{loader: 'url-loader',options: {name:'[name]_[hash].[ext]',outputPath: 'images/',limit: 2048 // 2kb}}},{test: /\.scss$/,use:['style-loader',{loader:'css-loader',options: {importLoaders: 2}},'sass-loader','postcss-loader']}]},plugins:[new HtmlWebpackPlugin({template: 'src/index.html'}), new CleanWebpackPlugin()],output: {filename: '[name].js',path: path.resolve(__dirname, 'dist')}}

不设置sourceMap
假设我们把sourceMap设置为none看一下。 :::info devtool 此选项控制是否生成,以及如何生成 source map :::
在我配置devtool: ‘none’时发现报错:.devtool should match pattern “^(inline-|hidden-|eval-)?(nosources-)?(cheap-(module-)?)?source-map$”. 从 Webpack 4 迁移到 Webpack 5 时,使用devtool空值时出现错误(仅在生产模式下)。 具体参考 但是经过测试虽然可以使用,但是问题依旧存在, 例如devtool:process.env.NODE_ENV === ‘development’?’source-map’:false, 但并没有执行source-map,而是执行false
:::info 所以,可以直接使用devtool:false :::
devtool为false
const path = require('path')const HtmlWebpackPlugin = require('html-webpack-plugin')const { CleanWebpackPlugin } = require("clean-webpack-plugin");// 获取环境配置// const isDev = process.env.NODE_ENV === 'development'module.exports = {mode: 'development',devtool: false,entry: {// 在entry对象中,创建两个入口文件main: './src/index.js'},module: {rules:[{test: /\.(jpg|png|gif)$/,use:{loader: 'url-loader',options: {name:'[name]_[hash].[ext]',outputPath: 'images/',limit: 2048 // 2kb}}},{test: /\.scss$/,use:['style-loader',{loader:'css-loader',options: {importLoaders: 2}},'sass-loader','postcss-loader']}]},plugins:[new HtmlWebpackPlugin({template: 'src/index.html'}), new CleanWebpackPlugin()],output: {filename: '[name].js',path: path.resolve(__dirname, 'dist')}}
这个时候我们就能发现,如果没有配置source map,是没办法定位到我们的index.js文件的。
sourceMap的理解
:::info
现在我们讲一下sourceMap是什么:
他是一个映射关系,他知道dist目录下的main.js文件的代码行对应scr中index.js中的第几行。
所以我们配置他可以直接映射出index.js中哪一行报错。
:::
const path = require('path')const HtmlWebpackPlugin = require('html-webpack-plugin')const { CleanWebpackPlugin } = require("clean-webpack-plugin");module.exports = {mode: 'development',// source-map会帮我们找到报错的具体位置devtool: 'source-map',entry: {main: './src/index.js'},module: {rules:[{test: /\.(jpg|png|gif)$/,use:{loader: 'url-loader',options: {name:'[name]_[hash].[ext]',outputPath: 'images/',limit: 2048 // 2kb}}},{test: /\.scss$/,use:['style-loader',{loader:'css-loader',options: {importLoaders: 2}},'sass-loader','postcss-loader']}]},plugins:[new HtmlWebpackPlugin({template: 'src/index.html'}), new CleanWebpackPlugin()],output: {filename: '[name].js',path: path.resolve(__dirname, 'dist')}}


这里面的main.js.map就是webpack帮我们在源代码和打包的代码做的映射文件。
source map的一些配置项
:::info
使用source map的一些配置项,会导致页面的打包速度变慢。
:::
:::info
我们讲一下: eval 、 cheap、 module、inline的作用
:::
inline
:::info
我们可以看到设置inline后,main.js.map文件消失了。
原因是使用inline打包,我们的map文件会通过data:url的方式直接写在main.js里面进行映射。
:::

cheap
:::info 他打包出来和我们刚刚使用inline表面上没有任何区别,映射文件还是放在main.js的内部。 ::: 具体作用:
- 但我们项目的代码量很大的时候,如果我们的代码出了错误,而且我们又没有使用cheap,那么sourceMap会告诉我们,我们的代码在第几行的第几个字符的地方报错,他会更加精确的告诉你位置。 但是,这样子精确的映射会比较耗费性能,一般报错我们只需要知道第几行报错就可以了,我们基本就可以排查到问题。加上cheap的意思就是让soureMap告诉我们报错的时候只返回报错的行数就可以了。
- 他只会映射我们应用代码,也就是说不会去映射一些第三方模块 如果使用了cheap的同时又希望他能映射一些第三方模块就要使用module

module
:::info
module的作用就是处理第三方插件的报错
:::
eval
:::info
eval是打包速度最快的一种方式,他也可以帮我们定位到具体的文件。
他是根据eval这种js执行形式来生成sourceMap的对应关系的。
但是针对于比较复杂的代码的情况下,如果用eval他提示出来的内容可能并不全面。
:::


最佳方案
开发环境使用 cheap-module-eval-source-map,他提示出来的错误比较全,而且它的打包速度又比较快
生产环境,一般来讲生产环境是不需要的。但有时侯希望快速定位线上环境的问题,
可以使用cheap-module-source-map,这样就可以更加准确。
