• webpack(4)编译过程分析


    
    

    一:  webpack编译过程分为初始化, 编译和输出三个阶段.

    二:  初始化: 整理配置, 形成最终配置对象

    1.命令行中的配置参数的权重最高, 因为最晚确定的. 命令中配置参数用: --xx=yy表示

    比如 npx webpack --mode=development --devtool=eval-source-map,

    2. 读取配置文件中的配置: 默认是webpack.config.js, 也可以通过命令行去指定 --config=myconfig.js

    3, 默认配置

    将三项合并, 最终形成配置对象, 按照配置对象打包;

    三. 编译过程

          1. 生成chunk. 每一入口文件到他所有的依赖文件,都会生成的一个代码块.这就是chunk

            每个chunk都有name 和id

            name: 默认是main所以我们打包后的代码,如果没配置output的filename属性, 都是main.js

            id: 开发环境中与name相同, 生成环境中是一个数字, 从0开始;

           过程: 

            (一) 生成模块记录

            如下所示:  目的是记录所有模块

    {
    
    ./src/js/argset.js": `
    const GENERATE_TIME = 100; 
    const WAITTIME = 100;
    const DISPEAR_TIME = 100; 
    `,
    ...//还有很多模块, 1.记录了所有模块(路径作为属性, 模块内容字符串化后作为值), 2 模块的导入函数做了特殊处理.
    }

                    1. chunk中会创建一个模块记录: 属性值是模块id, 即模块路径;  值是转换后的代码内容, 初始化时该记录内容为空;

            2. 从入口模块开始, 分析依赖, 看在模块记录中是否有属性,有则结束,  没有则读取文件内容,

            3.对文件内容进行AST抽象语法树分析:

               目的是找出依赖: 对于其中的es6引入和commonjs规范的引入, 进行语法分析,找出路径. 这webpack需要用到第三方模块来专门的分析.

               这也是为什么会支持es6和commonjs导入的原因;通过ast在线分析可以看到他们的结构

           4. 将依赖保存到的dependencies数组里

           5. 将读取文件字符串, 替换依赖函数, 比如import xx  from "xx"换成 __webpack_require("xx"); require("xx")改成require("./src/xx")

           6, 保存转换后的字符串到模块记录中.

           7, 按照dependencies数组分析下一个依赖.

          8. 递归按照depedencies数组依赖, 分析模块依赖, 并把未记录的模块记录到模块记录中.

    最终形成 模块列表,来记录所有模块: 模块id: 模块代码 ,模块id: 模块代码 .....

           

     (二) 生成资源列表: 每个chunk生成一个资源列表, 即chunk access; 

     根据资源列表生成hash文件

    (三) 合成资源列表:将各个chunk生成的资源合成, 形成总的资源列表, 比如./dist/main.js.map和./dist/main.js ;

               

     三. 输出(emit): 根据合成资源列表, nodejs会生成输出文件.

     

    ------------恢复内容结束------------

  • 相关阅读:
    FBI网络欺诈投诉中心:经济萧条期网络犯罪更汹涌 狼人:
    阿根廷黑客盯上中国网银用户 警惕“IK网银盗号器” 狼人:
    参数定义sql 递归查询子目录
    输入字符ASCII码排序
    程序池程序Win7(64位)中IIS配置Access数据库的asp.net程序中出现“未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序”(解决了)
    乱码中文javaEE 中文乱码问题
    地方浏览器document.getElementById('resForm1_bookTimeStart').value = "${bookTimeStartId}"; var hzfpZldm=$("#hz
    打印下标iOS 6字面量
    函数集成redis与Spring集成
    安装内容[Python]第三方库Scrapy入门使用
  • 原文地址:https://www.cnblogs.com/dangdanghepingping/p/14493863.html
Copyright © 2020-2023  润新知