模块化编程使得开发者可以将一个大型的程序拆分成多个小的模块,由每一个模块提供可靠的抽象和封装,确保每一个模块正常工作,再拼装起来,这一思想使得 多人协作参与的大型程序开发更可控,对 debug 和测试等更友好。
Node.js 自诞生就开始支持模块化的,但浏览器的世界里这个过程依然 处于缓慢的发展之中。Webpack 这类工具的诞生也是为了解决这个问题,使得我们可以不用顾虑全局变量之类的各种问题编写各种模块,最后再打包成一个文件。
我们可以自己尝试编写一个简单的打包工具来理解其中的原理。
首先从入口文件开始,分析其依赖,然后不断获取依赖的依赖,最后生成一个依赖树。当然为了简单,我们先不考虑循环依赖,各种模块类型,缓存模块等等。
我们直接使用 babel 提供的 babylon 等相关的编译工具来分析文件,可以编写一个函数来分析依赖:
利用上面这个函数我们可以抽取一个模块的依赖,接下来要做的,就是从入口文件开始,不断去获取依赖,依赖的依赖...最后搞清楚所有的依赖,以及谁依赖谁的关系,生成一个 dependency graph。
第三个函数,我们就利用上面的 dependency graph 来生成一个 bundle,相当于 webpack 最后打包出来的一个 bundle.js:
* 其中数组的第一个值为一个函数包裹的代码块,这样各自模块的作用域保持独立,不会影响其他的模块。
* 因为生成的代码使用了 CommonJS 的模块引入方式,因此我们之后需要手动实现一下 require 函数。