webpack 原理

webpack 是什么

webpack 是一个打包工具,将浏览器无法识别的 Commonjs 等模块化语法( module.exports、require 等)转化成能在浏览器运行。

实现的方式:

实现了一个 __webpack_require__ 方法,该方法根据 modulesId (模块路径及名称组合成),从 modules 对象 ( key 是 moduleId ,value 是 源文件内容经过转化成的函数) 中取模块并执行,并将结果存在installModules中。

通过递归从modules中获取执行结果,实现require的效果。

打包的过程

根据 webpack.config.js 找到 entry 入口文件

实现 compiler 类,该类做了以下事情:

  1. 从入口开始解析、修改文件,得到 modules(依赖关系)
  2. 生成目标 js 文件。

解析文件得到 modules

  1. 解析当前文件,转化当前文件得到转化后的源码(webpack中为转化了模块引入方法的可执行函数),并得到当前文件的依赖项 dependencies
  2. 保存转化后的源码和由文件名及文件路径合成的文件ID
  3. 根据 dependencies 递归执行过程 1

过程 1 中,用到了babel:

  1. 使用 babylon 解析源码得到 AST
  2. 通过 @babel/traverse 遍历并访问 AST ,修改 AST 对象( require -> __webpack_require__ ),require 路径改成相对于根目录的路径 moduleName, 保存引入的 modulenamedependencies
  3. 使用 @babel/generator 将修改后的 AST 对象逆生成源码
  4. 返回源码和dependencies
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • webpack 核心 核心概述 entry 入口文件:js 代码文件,可执行的 node 模块或打包的入口文件。 ...
    coolheadedY阅读 3,504评论 1 6
  • 写在前面:本文是webpack的一个学习笔记,涉及webpack打包流程、plugin、loader的编写、以及实...
    Bbang呀_阅读 436评论 0 2
  • Ba la la la ~ 读者朋友们,你们好啊,又到了冷锋时间,话不多说,发车! webpack是什么...
    王饱饱阅读 586评论 0 9
  • 工作原理概括 基本概念 在了解Webpack原理前,需要掌握以下几个核心概念,以方便后面的理解: Entry:入口...
    温柔了十方春冬阅读 354评论 0 0
  • 引言 前一段时间我把webpack源码大概读了一遍,webpack 到4.x版本后,其源码已经比较庞大,对各种开发...
    涅槃快乐是金阅读 777评论 0 1