什么是source-map?

source-map:一种提供源代码构建后代码映射的技术(如果构建后代码出错了,通过映射可以追踪源代码错误)
[inline-|hidden-|eval-][nosources-][cheap-[module-]]source-map

各种source-map的区别

source-map(外部)
- 错误代码准确信息
- 源代码错误位置
inline-source-map(内联) 只生成一个内联source-map
- 错误代码准确信息
- 源代码错误位置
hidden-source-map(外部) 不能追踪源代码错误,只能提示到构建后代码的错误位置
- 错误代码准确信息
- 没有源代码错误位置
eval-source-map(内联) 每一个文件都生成对应的source-map
- 错误代码准确信息
- 源代码错误位置
nosources-source-map(外部)
- 错误代码准确信息
- 没有任何源代码信息
cheap-source-map(外部)
- 错误代码准确信息
- 源代码错误位置(只能精确到行)
cheap-modules-source-map(外部) module会将loader的source map加入
- 错误代码准确信息
- 源代码错误位置

内联和 外部的区别:1. 外部生成了文件,内联没有 2. 内联构建速度更快

开发环境和生产环境的选择

开发环境:速度快,调试更友好

  • 速度快(eval>inline>cheap>…)
    • eval-cheap-souce-map
    • eval-source-map
  • 调试更友好
    • souce-map
    • cheap-module-souce-map
    • cheap-souce-map

—> eval-source-map / eval-cheap-module-souce-map(推荐使用这两种,vue、react默认使用前一种,生产环境也是)

生产环境:

源代码要不要隐藏? 调试要不要更友好?
内联会让代码体积变大,所以在生产环境不用内联
nosources-source-map 全部隐藏
hidden-source-map 只隐藏源代码,会提示构建后代码错误信息

—> source-map / cheap-module-souce-map

案例

  1. const { resolve } = require('path');
  2. const HtmlWebpackPlugin = require('html-webpack-plugin');
  3. module.exports = {
  4. entry: ['./src/js/index.js', './src/index.html'],
  5. output: {
  6. filename: 'js/built.js',
  7. path: resolve(__dirname, 'build')
  8. },
  9. module: {
  10. rules: [
  11. // loader的配置
  12. {
  13. // 处理less资源
  14. test: /\.less$/,
  15. use: ['style-loader', 'css-loader', 'less-loader']
  16. },
  17. {
  18. // 处理css资源
  19. test: /\.css$/,
  20. use: ['style-loader', 'css-loader']
  21. },
  22. {
  23. // 处理图片资源
  24. test: /\.(jpg|png|gif)$/,
  25. loader: 'url-loader',
  26. options: {
  27. limit: 8 * 1024,
  28. name: '[hash:10].[ext]',
  29. // 关闭es6模块化
  30. esModule: false,
  31. outputPath: 'imgs'
  32. }
  33. },
  34. {
  35. // 处理html中img资源
  36. test: /\.html$/,
  37. loader: 'html-loader'
  38. },
  39. {
  40. // 处理其他资源
  41. exclude: /\.(html|js|css|less|jpg|png|gif)/,
  42. loader: 'file-loader',
  43. options: {
  44. name: '[hash:10].[ext]',
  45. outputPath: 'media'
  46. }
  47. }
  48. ]
  49. },
  50. plugins: [
  51. // plugins的配置
  52. new HtmlWebpackPlugin({
  53. template: './src/index.html'
  54. })
  55. ],
  56. mode: 'development',
  57. devServer: {
  58. contentBase: resolve(__dirname, 'build'),
  59. compress: true,
  60. port: 3000,
  61. open: true,
  62. hot: true
  63. },
  64. devtool: 'eval-source-map'
  65. };
  • 运行命令:webpack