笔记标题 | 青训营笔记

145 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 14 天

## Webpack | 青训营笔记

模块

模块化编程中,开发人员将程序分解为称为模块的离散功能块。

每个模块的表面积都比完整程序小,这使得验证、调试和测试变得微不足道。 编写良好的模块提供了坚实的抽象和封装边界,因此每个模块在整个应用程序中都具有连贯的设计和明确的目的。

Node.js几乎自成立以来就支持模块化编程。 然而,在网络上,对模块的支持来得很慢。 存在多种支持Web模块化JavaScript的工具,具有各种优点和局限性。 Webpack 建立在从这些系统中吸取的经验教训之上,并将模块的概念应用于项目中的任何文件。

什么是网络包模块

Node.js 模块相比,webpack 模块可以通过多种方式表达它们的依赖关系。一些例子是:

支持的模块类型

Webpack 原生支持以下模块类型:

除此之外,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 配置选项为加载程序制定单独的解析规则。

缓存

每个文件系统访问都会被缓存,以便更快地发生对同一文件的多个并行或串行请求。在监视模式下,仅从缓存中逐出修改的文件。如果监视模式处于关闭状态,则在每次编译之前都会清除缓存。