首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第1章 Webpack简介
1.1 何为Webpack
1.2 为什么需要Webpack
1.2.1 何为模块
1.2.2 JavaScript中的模块
1.2.3 模块打包工具
1.2.4 为什么选择Webpack
1.3 安装
1.4 打包个应用
1.4.1 Hello World
1.4.2 使用npm scripts
1.4.3 使用默认目录配置
1.4.4 使用配置文件
1.4.5 webpack-dev-server
第2章 模块打包
2.1 CommonJS
2.1.1 模块
2.1.2 导出
2.1.3 导入
2.2 ES6 Module
2.2.1 模块
2.2.2 导出
2.2.3 导入
2.2.4 复合写法
2.3 CommonJS与ES6 Module的区别
2.3.1 动态与静态
2.3.2 值复制与动态映射
2.3.3 循环依赖
2.4 加载其他类型的模块
2.4.1 非模块化文件
2.4.2 AMD
2.4.3 UMD
2.4.4 加载npm模块
2.5 模块打包原理
第3章 资源的输入和输出
3.1 资源处理流程
3.2 配置资源入口
3.2.1 context
3.2.2 entry
3.2.3 实例
3.3 配置资源出口
3.3.1 filename
3.3.2 path
3.3.3 publicPath
3.3.4 实例
第4章 预处理器
4.1 一切皆模块
4.2 loader概述
4.3 loader的配置
4.3.1 loader的引入
4.3.2 链式loader
4.3.3 loader options
4.3.4 更多配置
4.4 常用loader介绍
4.4.1 babel-loader
4.4.2 ts-loader
4.4.3 html-loader
4.4.4 handlebars-loader
4.4.5 file-loader
4.4.6 url-loader
4.5 自定义loader
当前位置:
首页>>
技术小册>>
Webpack实战:入门、进阶与调优(上)
小册名称:Webpack实战:入门、进阶与调优(上)
### 2.1 CommonJS:模块化的基石 在深入探讨Webpack这一现代JavaScript模块打包工具之前,理解JavaScript模块化的历史与现状是至关重要的。其中,CommonJS规范作为JavaScript模块化早期的重要里程碑,不仅为后续的模块化标准奠定了基础,也直接影响了Webpack等现代构建工具的设计思路。本章节将详细介绍CommonJS的概念、原理、使用方式以及它在现代前端开发中的角色与局限性。 #### 2.1.1 CommonJS概述 CommonJS是一个旨在实现JavaScript模块化标准的提案,它最初由Node.js的开发者提出并广泛采用于服务器端JavaScript开发中。与浏览器环境不同,Node.js需要一种方式来组织和管理项目中众多的JavaScript文件,以便它们能够相互引用和执行。CommonJS通过定义一套模块化的规范,解决了这一需求。 #### 2.1.2 CommonJS的核心概念 **模块(Module)**:在CommonJS中,一个模块就是一个单独的文件,该文件内部定义的变量、函数、类等成员默认是私有的,即外部无法直接访问。如果希望某个成员能够被其他模块访问,需要使用`module.exports`对象进行导出。 **导出(Exports)**:使用`module.exports`或简写形式`exports`(实际上是`module.exports`的一个引用,但有使用时需要注意的陷阱)来导出模块中的成员。导出可以是任何JavaScript值,包括对象、函数、基本数据类型等。 **导入(Require)**:通过`require`函数来导入其他模块。`require`函数接受一个模块标识符(通常是模块文件的路径),并返回该模块导出的内容。这使得模块之间的依赖关系变得清晰且易于管理。 #### 2.1.3 使用CommonJS **导出模块** 假设我们有一个名为`math.js`的文件,该文件定义了一些数学相关的函数,我们希望这些函数能够被其他模块使用。 ```javascript // math.js function add(a, b) { return a + b; } function subtract(a, b) { return a - b; } // 使用module.exports导出函数 module.exports = { add: add, subtract: subtract }; // 或者使用exports的简写形式(但需注意exports本身只是module.exports的引用) // exports.add = add; // exports.subtract = subtract; ``` **导入模块** 在另一个文件中,我们可以使用`require`函数来导入`math.js`模块,并使用其导出的函数。 ```javascript // app.js const math = require('./math'); console.log(math.add(2, 3)); // 输出: 5 console.log(math.subtract(5, 2)); // 输出: 3 ``` #### 2.1.4 CommonJS的局限性 尽管CommonJS在Node.js环境中得到了广泛应用,但它也存在一些局限性,特别是在前端开发中: 1. **同步加载**:CommonJS的`require`是同步执行的,这意味着在模块被加载和执行之前,JavaScript引擎会阻塞后续代码的执行。这种设计在Node.js的服务器端环境中是可行的,因为文件通常存储在本地磁盘上,加载速度较快。但在浏览器中,由于模块可能需要从远程服务器加载,同步加载会导致页面响应缓慢甚至卡顿。 2. **不适用于浏览器**:原始的CommonJS规范并没有为浏览器环境设计,因为浏览器不支持`require`和`module.exports`这样的全局对象。虽然可以通过一些工具(如Browserify)将使用CommonJS规范的代码转换为浏览器可执行的代码,但这增加了开发复杂度。 3. **循环依赖问题**:虽然CommonJS能够处理大多数循环依赖的情况,但在某些复杂的依赖关系中,它可能会导致难以预测的行为,如模块导出的是不完全初始化的对象。 #### 2.1.5 CommonJS与现代前端开发的融合 尽管CommonJS存在上述局限性,但它仍然是JavaScript模块化历史中不可或缺的一部分。随着前端开发的日益复杂,出现了多种模块规范(如ES Modules)和构建工具(如Webpack),它们在一定程度上克服了CommonJS的局限性,并提供了更加灵活和强大的模块化支持。 Webpack等现代构建工具通过模拟CommonJS的`require`机制(称为CommonJS兼容性模式),使得在前端项目中也可以使用CommonJS规范的模块。同时,Webpack还支持ES Modules等其他模块规范,以及CSS、图片等非JavaScript资源的模块化处理,从而实现了更加全面的项目构建能力。 #### 2.1.6 小结 CommonJS作为JavaScript模块化早期的标准之一,为Node.js的快速发展提供了重要支持。尽管它在前端开发中存在一定的局限性,但其对模块化的理解和实践为后续的ES Modules等标准奠定了基础。在Webpack等现代构建工具的推动下,CommonJS与多种模块规范共同构成了JavaScript模块化生态的多样性,为开发者提供了更加灵活和强大的工具集。通过了解CommonJS的原理和使用方式,我们可以更好地理解JavaScript模块化的历史与现状,进而更好地利用Webpack等构建工具来优化我们的前端项目。
上一篇:
第2章 模块打包
下一篇:
2.1.1 模块
该分类下的相关小册推荐:
webpack指南
Webpack实战:入门、进阶与调优(中)
Webpack零基础入门
Webpack实战:入门、进阶与调优(下)
全解webpack前端开发环境定制