Webpack历史
追本溯源
在学习 Webpack 之前,我们有必要来了解一下前端领域的开发历程,只有明白了这些开发历程,才能更加清楚 Webpack 是怎么应运而生,又能给我们解决什么样的问题。
面向过程开发
特征: 一锅乱炖
在早期 js
能力还非常有限的时候,我们通过面向过程的方式把代码写在同一个.js
文件中,一个面向过程的开发模式可能如下所示。
1 | <!-- index.html代码 --> |
1 | // index.js代码 |
面向对象开发
特征: 面向对象开发模式便于代码维护,深入人心。
随着 js
的不断发展,它所能解决的问题也越来越多,如果再像面向过程那样把所有代码写在同一个.js
文件中,那么代码将变得非常难以理解和维护,此时面向对象开发模式便出现了,一个面向对象开发模式可能如下所示。
在index.html
中引入不同的模块:
1 | <!-- index.html代码 --> |
header.js
代码:
1 | // header.js代码 |
sidebar.js
代码:
1 | // sidebar.js代码 |
content.js
代码:
1 | // content.js代码 |
index.js
代码:
1 | var root = document.getElementById('root'); |
不足: 以上的代码示例中,虽然使用面向对象开发模式解决了面向过程开发模式中的一些问题,但似乎又引入了一些新的问题。
- 每一个模块都需要引入一个
.js
文件,随着模块的增多,这会影响页面性能。 - 在
index.js
文件中,并不能直接看出模块的逻辑关系,必须去页面才能找到。 - 在
index.html
页面中,文件的引入顺序必须严格按顺序来引入,例如:index.js
必须放在最后引入,如果把header.js
文件放在index.js
文件后引入,那么代码会报错。
现代开发模式
特征: 模块化加载方案让前端开发进一步工程化。
根据面向对象开发模式中的一系列问题,随后各种模块化加载的方案如雨后春笋,例如:ES Module
、AMD
、CMD
以及CommonJS
等,一个ES Module
模块化加载方案可能如下所示。
index.html
代码:
1 | <!-- index.html代码 --> |
header.js
代码:
1 | // header.js |
sidebar.js
代码:
1 | // sidebar.js |
content.js
代码:
1 | // content.js代码 |
index.js
代码:
1 | // index.js代码 |
注意: 以上代码并不能直接在浏览器上执行,因为浏览器并不能直接识别ES Module
代码,需要借助其他工具来进行翻译,此时 Webpack 就“粉墨登场”了。
Webpack初体验
不建议跟随此小结一起安装,此次示例仅仅作为一个例子,详细学习步骤请直接阅读下一章节安装
生成package.json文件
::: tip 参数说明-y
参数表示直接生成默认配置项的package.json
文件,不加此参数需要一步步按需进行配置。
:::
1 | $ npm init -y |
生成的package.json
文件:
1 | { |
安装Webpack
::: tip 参数说明-D
参数代表在本项目下安装 Webpack ,它是--save-dev
的简写
:::
1 | $ npm install webpack webpack-cli -D |
修改代码
::: tip 配置说明webpack
默认打包路径到dist
文件夹,打包后的.js
文件名字叫main.js
:::
其他代码不动,将index.html
中的.js
文件改成如下引用方式(引用打包后的文件):
1 | <!-- index.html代码 --> |
Webpack打包
::: tip 参数说明
npx webpack
代表在本项目下寻找 Webpack 打包命令,它区别于npm
命令index.js
参数代表本次打包的入口是index.js
:::打包结果:1
$ npx webpack index.js
正如上面你所看到的那样,网页正确显示了我们期待的结果,这也是 Webpack 能为我们解决问题的一小部分能力,下面将正式开始介绍 Webpack 。