zoukankan      html  css  js  c++  java
  • 【webpack】初始化、构建、生成

    初始化阶段

    1. 参数处理 合并默认参数和配置参数 校验配置 合并最终配置
    2. 创建compiler对象
    3. 处理用户定义的plugins 调用plugin的apply
    4. 调用new WebpackOptionsApply().apply 处理webpack内置插件
      1. 注入EntryOptionPlugin插件,处理entry配置
      2. 根据devtool的值,判断后续用哪个插件处理sourcemap
      3. 注入runtimePlugin,用于根据代码内容动态注入webpack运行时
    5. compiler实例创建成功
    6. compiler.compile()

    构建阶段

    1. handleModuleCreate 根据文件类型构建module
    2. 通过loader-runnerrunloaders将各类文件资源转换为js
    3. 通过acornjs解析为AST
    4. 遍历AST,在 HarmonyExportDependencyParserPlugin 插件监听 exportImportSpecifier 钩子,解读 JS 文本对应的资源依赖
    5. 使用module对象的addDependency将依赖对象加入到module依赖列表
    6. AST遍历结束,调用module.handleParseResult处理依赖列表
    7. 对于新增的依赖 再通过第一步的handleModuleCreate 创建module
    8. 重复前面的操作。等所有的依赖处理完成,构建结束

    生成阶段

    在构建阶段生成的modules,在此阶段会生成chunks输出

    1. 构建本次编译的chunkGraph对象
    2. 遍历compilation.modules集合,将module按照entry/动态引入,分配给不同的chunk对象
    3. 遍历完成后,得到完整的chunks集合对象,调用creatXxxAssets方法
    4. creatXxxAssets方法遍历module/chunk,调用compilation.emitAssetsassets信息记录到compilation.assets
    5. 触发seal回调,控制流回到compiler对象

    创建chunk的过程示例:

    const path = require("path");
    
    module.exports = {
      mode: "development",
      context: path.join(__dirname),
      entry: {
        a: "./src/index-a.js",
        b: "./src/index-b.js",
      },
      output: {
        filename: "[name].js",
        path: path.join(__dirname, "./dist"),
      },
      devtool: false,
      target: "web",
      plugins: [],
    };
    

    此时index-a中依赖c,动态引入d

    index-b中依赖c,e

    两个entry文件分别生成各自的chunk,动态导入的d也生成一个chunkchunk a中包含index-a.jscchunk b 中包含index-b.js、c、ec同时包含在两个chunk中,无疑增大了项目体积。因此,webpack提供了一些插件如SplitChunksPlugin,在之前的基础上进一步优化chunk结构

  • 相关阅读:
    深入浅出AQS之组件概览
    深入浅出AQS之条件队列
    深入浅出AQS之共享锁模式
    深入浅出AQS之独占锁模式
    Android中RecyclerView用法,一步一步教你如何使用RecyclerView以及带你走过编码中可能会出现的坑~
    检测jquery是否正确引入
    对于使用JDBC连接mysql数据时The server time zone value '¤¤°ê¼Ð·Ç®É¶¡'...的异常问题解决。
    MYSQL8.0以上版本ROOT密码报错及修改
    MYSQL安装教程
    linux centos安装nginx1.7.4
  • 原文地址:https://www.cnblogs.com/ashen1999/p/14866770.html
Copyright © 2011-2022 走看看