首页 > 建站教程 > 前端框架 >  webpack5学习笔记:mode、模块化原理、source-map正文

webpack5学习笔记:mode、模块化原理、source-map

# mode

## 文档:https://webpack.docschina.org/configuration/mode/#usage


## 配置

module.exports = {

    mode: 'production',  // 不设置,默认是 production, 可选值:none、production、development

}



# webpack 模块化的原理

## webpack 打包代码,允许使用各种模块化,如CommonJs、ES Module

    CommonJs如 module.exports导出、require()导入

    ES Module 如 export、export default导出、import导入等


## webpack 模块化的四个原理:

1. CommonJs模块化原理

2. ES Module实现原理

3. CommonJs加载 ES Module 原理

4. ES Module加载CommonJS 原理

    注:为了便于阅读打包的源码,分析上面的原理,需要对webpack进行配置:

```

mode: 'development',  // 设置为:development

devtool: 'source-map', // 当mode设置为`development`,devtool的默认值就是`eval`,打包后不便于阅读,设置为`source-map`,但同时,会和生成的js同一目录生成一个.map文件

```



# devtool.source-map


## 介绍

1. 打包后代码和编写代码差异大,ES6会被转成ES5、行号列号编译后和编译前不一致、丑化压缩,将编码名称改变等、typescript也会转成JavaScript。但是,一旦报错,很难调试

2. source-map是已转换代码的映射的原始文件,使浏览器可以重构原始源,并在调试工具显示重建的原始源

3. 内容解释:

{

    version 当前source-map版本

    sources 源文件

    names 转换之前变量和属性名称,如果 model 是 development,则 names 为空,因为开发模式下,变量和属性名不会被转换丑化

    mappings base64 VLQ编码后的值,无法阅读,是source-map转码前,源文件的内容

    files 最终打包后文件

    sourcesContent 就是源代码

    sourceRoot 相对根目录

}


## source-map值介绍

1. devtool 一共有26个值,见 https://webpack.docschina.org/configuration/devtool/#devtool

    Ⅰ、不写 devtool,即 none,建议生产模式下,即 mode=production下使用

    Ⅱ、false 不生成eval也不生成source-map,不利于调试,可以生产环境下使用

    Ⅲ、eval:development模式下,不生成source-map,但是生成的代码还是能还原报错的文件,因为eval执行的代码块里注释有当前文件路径

    Ⅳ、source-map:生成 map 文件,方便错误提示,但是如果代码被loader处理过,建议用 cheap-module-source-map

    Ⅴ、cheap-source-map:打包比source-map快点,其他和 source-map差不多

    Ⅵ※※、cheap-module-source-map:仍会生成map文件,类似于cheap-source-map,但是对源自loader的source-map处理会更好,当源代码被loader处理过,如babel、ts-loader,用这个,会还原成处理之前的代码进行错误提示,更加直观,建议测试环境下用。

    Ⅶ、hidden-source-map:用处不大,和source-map几乎一样,知识把生成的最后一行的注释去了,浏览器会找不到生成的source-map,适合于生产环境的调试

    ⅤⅢ、nosources-source-map:生成和 source-map 几乎一样,但是报错时,点进错误里面也无法加载源文件

    其他的值,都是上面的组合。


    devtool的最佳设置方式:

        开发环境建议使用:source-map(vue使用的方式)或 cheap-module-source-map(react使用的方式)

        测试环境同开发环境

        正式环境为false或直接不写 devtool(即none)



## 使用

1. 根据源文件生成source-map文件,在webpack配置,打包生成source-map

```

devtool: 'source-map'

```

2. 在转换后的代码,最后添加一个注释,指向 source-map ,webpack自动加,如://# sourceMappingURL=bundle.js.map

3. 浏览器运行时,会自动根据上面的注释,找到对应的source-map,从而还原代码,方便找到错误

4. chrome浏览器默认支持source-map,如果要禁用,选择 调试窗口右上角设置按钮->Preference->Source->Enable Javascript sorce maps、Enable CSS source maps 取消勾选