webpack4.x CommonJS模块化浅析
先看下webpack官方文档中对模块的描述:
在模块化编程中,开发者将程序分解成离散功能块(discretechunksoffunctionality),并称之为模块。
每个模块具有比完整程序更小的接触面,使得校验、调试、测试轻而易举。精心编写的模块提供了可靠的抽象和封装界限,使得应用程序中每个模块都具有条理清楚的设计和明确的目的。
webpack的核心概念之一就是一切皆模块,webpack在项目中的作用就是,分析项目的结构,找到JavaScript模块以及其他一些浏览器不能直接运行的拓展语言(less,scss,typescript),并将其打包为合适的格式以供浏览器使用,它从一个项目的主文件开始,根据引用路径,找到所有其所依赖的文件,同时将这些文件进行处理(各种loader来解析,编译处理浏览器不能直接使用的文件),然后打包为一个或者多个浏览器可识别的JavaScript文件。
本文不会详细描述webpack的构建流程,毕竟官网已经说得比较详细了,这里主要是分析下webpack打包后的文件,将文件打包成什么样子,又是如何使用模块的。webpack最早支持的代码模块化方式是CommonJS,后面慢慢支持了ES6、AMD等,不论使用的是哪种方式,webpack都可以对其进行解析和打包,本文例子中使用的是CommonJS规范,更多规范介绍可查看官方文档。
例子
为方便后面的说明,首先创建一个项目,也就是先建立一个文件夹webpack-test(名字自拟),然后在里面新建一个package.json文件,用来做npm的说明,在webpack-test文件夹中使用命令:
npminit
执行命令后会询问一些问题,一路回车即可。然后安装下webpack的依赖包,如下命令:
npminstall--save-devwebpack
再新建几个文件:
1、在项目根目录下新建文件夹app用来存放业务代码、文件夹public存放打包后的文件;
2、在app中新建入口文件main.js;
3、在app中新建功能模块hello.js,bye.js,to.js;
4、在项目根目录下,建立index.html文件;
然后依次来给这几个文件分别填写以下内容:
//webpack-test/app/hello.js constto=require('./to.js'); module.exports=function(){ varhello=document.createElement('div'); hello.textContent="SayHelloto"+to.name; returnhello; };
//webpack-test/app/bye.js constto=require('./to.js'); module.exports=function(){ varbye=document.createElement('div'); bye.textContent="SayByeto"+to.name; returnbye; };
//webpack-test/app/to.js module.exports={name:"小明"};
//webpack-test/app/main.js consthello=require('./hello.js'); constbye=require('./bye.js'); document.querySelector("#root").appendChild(hello()).appendChild(bye());;
//webpack-test/index.htmlWebpackTestProject