【宝藏】浏览器端的模块化问题(1)
接下来我们一起进入webpack的课程学习中,本课程的特点在于:
- 合适的深度:webpack 使用层面相对简单,但其原理层面非常复杂。
- 合适的广度:webpack 生态圈极其繁荣,有海量的第三方库可以融入到 webpack 中。
课程结构大致可以分为以下几个专题:
- webpack核心功能
- 常用扩展
- css工程化
- js兼容性
- 性能优化
接下来我们将讲解webpack的核心功能,我们将从浏览器模块化开始展开
浏览器端的模块化
在现代前端开发中,模块化是一个非常重要的概念。然而,浏览器端的模块化面临以下几个主要问题:
- 效率问题:精细的模块划分带来了更多的 JS 文件,更多的 JS 文件带来了更多的请求,降低了页面访问效率。
- 兼容性问题:浏览器目前仅支持 ES6 的模块化标准,并且还存在兼容性问题。
- 工具问题:浏览器不支持 npm 下载的第三方包。
这些问题不仅仅是前端工程化的一个缩影,当开发一个具有规模的程序时,还会遇到许多非业务问题,如执行效率、兼容性、代码的可维护性和可扩展性、团队协作、测试等。这些问题被称为工程问题,它们深刻影响开发进度,如果没有好的工具解决这些问题,开发进度会变得极其缓慢,开发者也会陷入技术的泥潭。
根本原因
为什么在 Node.js 端没有那么明显的问题,而在浏览器端却变得如此严重?
根本原因:在浏览器端,开发时态(devtime)和运行时态(runtime)的侧重点不同。
开发时态(devtime):
- 模块划分越细越好。
- 支持多种模块化标准。
- 支持 npm 或其他包管理器下载的模块。
- 能够解决其他工程化的问题。
运行时态(runtime):
- 文件越少越好。
- 文件体积越小越好。
- 代码内容越乱越好(即经过压缩和混淆)。
- 所有浏览器都要兼容。
- 能够解决其他运行时的问题,主要是执行效率问题。
这种差异在小项目中表现得并不明显,但随着项目规模的增大,问题会越来越突出。如果不解决这些问题,前端项目的规模化将难以实现。
解决办法
由于开发时态和运行时态面临的局面有巨大的差异,因此,我们需要一个工具,这个工具能够让开发者专心在开发时态写代码,然后利用这个工具将开发时态编写的代码转换为运行时态需要的东西。这样的工具称为构建工具。
构建工具的工作流程如下:
- 开发时态:开发者编写模块化、可维护的代码。
- 构建过程:构建工具将开发时态的代码进行处理,包括模块打包、代码压缩、资源优化等。
- 运行时态:生成的最终文件在浏览器中高效运行。
常见的构建工具
- webpack:目前最流行的前端构建工具之一,支持多种模块化标准,具有强大的插件生态系统。
- Grunt:早期的构建工具,基于任务配置,功能较为基础。
- Gulp:基于流的构建工具,配置相对简洁,适合中小型项目。
- Browserify:将 CommonJS 模块化标准的 Node.js 代码转换为浏览器可运行的代码。
- FIS:百度开源的前端构建工具,支持多种模块化标准和优化策略。
- 其他:如 Rollup、Parcel 等,各有特色,适用于不同的场景。
通过使用构建工具,如 webpack,我们可以有效地解决浏览器端模块化带来的效率、兼容性和工具问题。构建工具将开发时态的代码转换为运行时态所需的高效、兼容的代码,从而使前端项目的规模化成为可能。