这是我参与「第五届青训营 」伴学笔记创作活动的第 14 天
## Webpack | 青训营笔记
模块
在模块化编程中,开发人员将程序分解为称为模块的离散功能块。
每个模块的表面积都比完整程序小,这使得验证、调试和测试变得微不足道。 编写良好的模块提供了坚实的抽象和封装边界,因此每个模块在整个应用程序中都具有连贯的设计和明确的目的。
Node.js几乎自成立以来就支持模块化编程。 然而,在网络上,对模块的支持来得很慢。 存在多种支持Web模块化JavaScript的工具,具有各种优点和局限性。 Webpack 建立在从这些系统中吸取的经验教训之上,并将模块的概念应用于项目中的任何文件。
什么是网络包模块
与 Node.js 模块相比,webpack 模块可以通过多种方式表达它们的依赖关系。一些例子是:
- ES2015
导入声明 - 一个 CommonJS 语句
require() - 一个 AMD 和声明
define``require - css/sass/less 文件中的
@import语句。 - 样式表或 HTML 文件中的图像 URL。
url(...)``<img src=...>
支持的模块类型
Webpack 原生支持以下模块类型:
- ECMAScript 模块
- 通用JS模块
- AMD模块
- 资产
- 网络组装模块
除此之外,webpack 还支持用多种语言编写的模块和通过加载器的预处理器。加载器向 webpack 描述了如何处理非本机模块并将这些依赖项包含在您的捆绑包中。 webpack 社区已经为各种流行语言和语言处理器构建了加载器,包括:
模块分辨率
解析器是一个库,它有助于通过绝对路径定位模块。 一个模块可以作为另一个模块的依赖项,如下所示:
import foo from 'path/to/module';
// or
require('path/to/module');
依赖项模块可以来自应用程序代码或第三方库。旋转变压器帮助 webpack 查找每个此类模块需要包含在捆绑包中的模块代码require/import陈述。 网络包用途增强的决心在捆绑模块时解析文件路径。
解析 webpack 中的规则
用enhanced-resolve,webpack 可以解析三种文件路径:
绝对路径
import '/home/me/file';
import 'C:\Users\me\file';
由于我们已经拥有文件的绝对路径,因此不需要进一步的分辨率。
相对路径
import '../src/file1';
import './file2';
在这种情况下,发生 or 的源文件的目录被视为上下文目录。中指定的相对路径将联接到此上下文路径,以生成模块的绝对路径。import``require``import/require
模块路径
import 'module';
import 'module/lib/file';
在 resolve.modules 中指定的所有目录中搜索模块。 您可以使用 resolve.alias 配置选项为其创建别名,从而将原始模块路径替换为备用路径。
- 如果包包含文件,则按顺序查找
resolve.exportsFields配置选项中指定的字段,并且 中的第一个此类字段根据包导出指南确定包的可用导出。package.json``package.json
根据上述规则解析路径后,解析程序将检查路径是否指向文件或目录。如果路径指向文件:
- 如果路径具有文件扩展名,则文件将立即捆绑。
- 否则,将使用
resolve.extensions选项解析文件扩展名,该选项告诉解析器哪些扩展名可以进行解析,例如 。.js``.jsx
如果路径指向文件夹,则执行以下步骤以查找具有正确扩展名的正确文件:
- 如果文件夹包含文件,则按顺序查找
resolve.mainFields配置选项中指定的字段,并且 中的第一个此类字段确定文件路径。package.json``package.json - 如果没有或
resolve.mainFields未返回有效路径,则按顺序查找在resolve.mainFiles配置选项中指定的文件名,以查看导入/必需目录中是否存在匹配的文件名。package.json - 然后使用
resolve.extensions选项以类似的方式解析文件扩展名。
Webpack 为您的构建目标提供了这些选项的合理默认值。
解析加载程序
这遵循与为文件解析指定的规则相同的规则。但是,可以使用 resolveLoader 配置选项为加载程序制定单独的解析规则。
缓存
每个文件系统访问都会被缓存,以便更快地发生对同一文件的多个并行或串行请求。在监视模式下,仅从缓存中逐出修改的文件。如果监视模式处于关闭状态,则在每次编译之前都会清除缓存。