在模块化编程中,开发者将程序分解成离散功能块(discrete chunks of functionality),并称之为模块

每个模块具有比完整程序更小的接触面,使得校验、调试、测试轻而易举。 精心编写的模块提供了可靠的抽象和封装界限,使得应用程序中每个模块都具有条理清楚的设计和明确的目的。

什么是 webpack 模块

对比 Node.js 模块,webpack 模块能够以各种方式表达它们的依赖关系,几个例子如下:

  • ES2015 import 语句;
  • CommonJSrequire() 语句;
  • AMDdefine 和 require 语句;
  • css/sass/less 文件中的 @import 语句;
  • 样式(url(...))或 HTML 文件(<img src=...>)中的图片链接(image url)

支持的模块类型

webpack 通过 loader 可以支持各种语言和预处理器编写模块。loader 描述了 webpack 如何处理 非 JavaScript(non-JavaScript) 模块,并且在bundle中引入这些依赖。 webpack 社区已经为各种流行语言和语言处理器构建了 loader,包括:

总的来说,webpack 提供了可定制的、强大和丰富的 API,允许任何技术栈使用 webpack,保持了在你的开发、测试和生成流程中无侵入性(non-opinionated)。

模块解析(Module Resolution)

resolver 是一个库(library),用于帮助找到模块的绝对路径。一个模块可以作为另一个模块的依赖模块,然后被后者引用,如下:

所依赖的模块可以是来自应用程序代码或第三方的库(a third party library)。resolver 帮助 webpack 找到 bundle 中需要引入的模块代码,这些代码在包含在每个 require/import 语句中。 当打包模块时,webpack 使用 enhanced-resolve 来解析文件路径

webpack 中的解析规则

使用 enhanced-resolve,webpack 能够解析三种文件路径:

绝对路径

由于我们已经取得文件的绝对路径,因此不需要进一步再做解析。

相对路径

在这种情况下,使用 import 或 require 的资源文件(resource file)所在的目录被认为是上下文目录(context directory)。在 import/require 中给定的相对路径,会添加此上下文路径(context path),以产生模块的绝对路径(absolute path)。

模块路径

模块将在 resolve.modules 中指定的所有目录内搜索。 你可以替换初始模块路径,此替换路径通过使用 resolve.alias 配置选项来创建一个别名。

一旦根据上述规则解析路径后,解析器(resolver)将检查路径是否指向文件或目录。如果路径指向一个文件:

  • 如果路径具有文件扩展名,则被直接将文件打包。
  • 否则,将使用 [resolve.extensions] 选项作为文件扩展名来解析,此选项告诉解析器在解析中能够接受哪些扩展名(例如 .js.jsx)。

如果路径指向一个文件夹,则采取以下步骤找到具有正确扩展名的正确文件:

  • 如果文件夹中包含 package.json 文件,则按照顺序查找 resolve.mainFields 配置选项中指定的字段。并且 package.json 中的第一个这样的字段确定文件路径。
  • 如果 package.json 文件不存在或者 package.json 文件中的 main 字段没有返回一个有效路径,则按照顺序查找 resolve.mainFiles 配置选项中指定的文件名,看是否能在 import/require 目录下匹配到一个存在的文件名。
  • 文件扩展名通过 resolve.extensions 选项采用类似的方法进行解析。

webpack 根据构建目标(build target)为这些选项提供了合理的默认配置。

缓存

每个文件系统访问都被缓存,以便更快触发对同一文件的多个并行或串行请求。在观察模式下,只有修改过的文件会从缓存中摘出。如果关闭观察模式,在每次编译前清理缓存。

最新文章

  1. javaweb回顾第九篇EL表达式
  2. JSP和servlet有什么区别?
  3. objective-C常量与变量
  4. forward:hello 与 redirect:hello的区别
  5. Solr4.8.0源码分析(14)之SolrCloud索引深入(1)
  6. python3 爬去QQ音乐
  7. linux-centerOs6.8安装nginx与配置
  8. Python基础知识点小结
  9. Confluence 6 诊断
  10. Flask CBV
  11. 基于c#的windows基础设计(学习日记1)【关于异或运算】
  12. 错误/异常:java.io.FileNotFoundException: .\src\db.properties (系统找不到指定的路径。);的解决方法
  13. yum下载rpm包
  14. DevExpress04、LayoutControl、GalleryControl
  15. redis sentinel无法启动问题
  16. Blueprint 编译概述
  17. i.mx6 Android5.1.1 System server
  18. centos ntfs-3g 安装和使用
  19. 关于selenium获取token sessionid
  20. 数据库--sql文件

热门文章

  1. 由VMnet引起的browser-sync故障解决方案
  2. LocalSessionFactoryBean有几个属性查找hibernate映射文件
  3. webGL动画
  4. 黑裙晖安装后修改mac和sn
  5. HDU--2602(0-1背包)
  6. 在Linux中使用selenium(环境部署)
  7. MFC安装与部署(程序打包)
  8. GitHub的使用问题记录
  9. Python读写文件学习笔记
  10. React 组件&amp;Props