我们先要从 Webpack 中 resolver 这个概念说起。Webpack 带来的一大理念是:一切皆模块。在项目中我们可以使用 ESM 的方式 import './xxx/xxx' 或者 import 'some pkgin_nodemodules',甚至使用 alias:import '@/xxx' 来实现模块化。Webpack 在处理这些引用时,是通过 resolve 过程,找到正确的目标文件。

其实不光是项目代码中的引入声明,在 Webpack 的整体处理流程,包括 loaders 的寻找等,只要涉及到文件路径的,都离不开 resolve 过程。因此 resolve 可以简单地理解为“文件路径查找”。

Webpack 对使用者也暴露了 resolve 的配置,我们可以对文件路径查找过程进行适当的配置,比如设置文件扩展名,查找搜索的目录等。因此,resolve 过程也会涉及到很多耗时的操作。

resolve: {// 设置查找搜索的目录modules: [path.resolve(__dirname, 'node_modules')],// 设置文件扩展名extensions: ['.js', '.mpx'],// 设置别名alias: { 'src': path.resolve('src'), }
}

webpack 依赖 enhanced-resolve 来解析代码模块的路径,webpack 配置文件中和 resolve 相关的选项都会传递给 enhanced-resolve 使用,我们介绍了这些选项的作用。

Webpack 源码中对于 resolver 的实现主要依赖 enhanced-resolve 的 ResolverFactory,它一共创建了三种类型的 resolver:

1、normalResolver:提供文件路径解析功能,用于普通文件导入。

2、contextResolver:提供目录路径解析功能,用于动态文件导入。

3、loaderResolver:提供文件路径解析功能,用于 loader 文件导入。

在 Webpack 构建运行时,对于每一种类型模块,都会使用 Resolver 预先判断路径是否存在,并获取路径的完整地址供后续加载文件使用。当然对于这三种类型 resolver,也设置了缓存:Webpack 本身通过 UnsafeCachePlugin 对 resolve 结果进行缓存,对于相同引用,返回缓存路径结果。

UnsafeCachePlugin 插件原理很简单:它通过 UnsafeCachePlugin.prototype.apply 方法,覆盖原有 Resolver 实例的 resolve 方法,新的方法上会包装一层路径结果 cache,以及包装了在完成原有方法后进行 cache 更新的逻辑。

听上去也很简单,但是这个设计和实现过程关联到「是否需要重新构建」的决断,这就值得深究一下了。我们来具体分析:

在通过 UnsafeCachePlugin 插件完成了必备文件路径查找之后,如果编辑过程没有出错,且当前 loader 调用了 this.cacheable,且存在上一次构建的结果集合,那么即将进入「是否需要重新构建」的决断(needRebuild),决断策略根据当前模块的 this.fileDependencies 和 this.contextDependencies 这两个关键因素来确定。this.fileDependencies 表示当前模块所关联的文件依赖;this.contextDependencies 表示模块关联的文件夹依赖。我们先获取这两类依赖的最后变更时间(contextTimestamps、fileTimestamps)的最大值 timestamp,再和上一次构建时间 buildTimestamp 进行比对,如果 timestamp >= buildTimestamp,则表示需要重新编译。如果不需要重新编译,直接读取 compilation 对象中的 cache 属性相关值。

Webpack 中 resolve 路径解析相关推荐

  1. Webpack中resolve配置

    背景: (1)开发中为什么引入模块时,不写具体的文件后缀,也能正确加载到文件呢? (2)甚至直接引入的是一个文件夹的路径时,也能正确使用文件下的index.js文件呢? import Child fr ...

  2. js相对路径相关(比如:js中的路径依赖导入该js文件的路径)

    问题描述: 前几天调用同事的js接口文件,在他自己的html测试页面ok,在我这边调用时出现问题. debug过程中,将该测试html移到其他位置都不行,放到原html测试页面同层次路径下是OK的. ...

  3. webpack如何设置html中img路径和css中背景图片路径区别开

    在使用webpack过程中,打包后发现html中img路径是: <img src="img/01.jpg" alt="标题图片" /> 但是在mai ...

  4. Cadence Allegro PCB设计88问解析(十四) 之 Allegro中库路径设置方法

    一个学习信号完整性的layout工程师 大家在进行Layout设计时,最重要就是导入网表,放入元器件,然后进行走线.那其中的元器件就是今天和大家分享的一点,不管是阻容感,还是各种IC.连接器都是有封装 ...

  5. static图片编译了 vue_详解vue-cil和webpack中本地静态图片的路径问题解决方案

    本文介绍了vue-cil和webpack中本地静态图片的路径问题解决方案,分享给大家,具体如下: 1 本地图片动态绑定img的src属性 一般我们在html中或者vue组件文件中引用图片是这样,这是不 ...

  6. webpack把源代码里面的console和debugger全部去掉_在webpack中,module、chunk和bundle到底是什么样的存在?...

    What are module, chunk and bundle in webpack?(在webpack中,module.chunk和bundle到底是什么样的存在呢?)相信很多人在使用webpa ...

  7. vue mianjs 引用css_vue 学习记录八——webpack中常见的配置项

    在web开发中,我们得使用到js(es6).css.html等技术,需要对资源文件管理,例如图片,同时还需要对性能.热加载等进行处理:这些功能都是可以在webpack中进行配置管理的,下面具体介绍说明 ...

  8. 六、Webpack详解学习笔记——webpack的安装、起步、配置、loader的使用、webpack中配置Vue、plugin的使用、搭建本地服务器、webpack配置的分离

    一.认识webpack 什么是webpack? 这个webpack还真不是一两句话可以说清楚的. 我们先看看官方的解释: At its core, webpack is a static module ...

  9. webpack中如何使用vue

    1.安装 vue包:npm i vue -S 2.由于在webpack中,推荐使用.vue这个组件模版文件来定义组件,不然会出现vue.js移动和一些高级语法的不支持,因此需要安装能解析这种文件的lo ...

最新文章

  1. Python必备基本技能——命令行参数args详解
  2. 站在历史的长河中做农活
  3. 模板 - 无向图的连通性
  4. MATLAB学习笔记(一)——入门与操作
  5. HTTPS加密越来越流行,为何要加密?
  6. 如何模拟鼠标的拖拽行为.
  7. 用java程序实现记单词_java实现背单词程序
  8. cordova监听事件中调用其他方法_Laravel模型事件的实现原理详解
  9. 51Nod 1003 阶乘后面0的数量 | 思维
  10. 2019全球编程语言高薪排行榜登场;余承东正式宣布华为IFA2019 或发布麒麟990;OPPO、vivo和小米成立互传联盟…...
  11. 更新macOS Monterey后遇到的各种Bug问题及解决方法
  12. java函数参数 省略号_[转] java使用省略号代替多参数.pdf
  13. pythondd_python学习笔记(五)之字典2-阿里云开发者社区
  14. html 网站右侧导航,页面右侧固定导航.html
  15. 09-解决服务器被黑上不了网的问题
  16. 在存储过程中动态创建临时表
  17. 财务分析报表APP的功能优势
  18. JQuery视频总结
  19. r语言 svycoxph_生存分析的Cox回归模型(比例风险模型)R语言实现及结果解读
  20. 流 (输入流、输出流)理解。

热门文章

  1. 按照这个步骤来刷题,迷茫的你两个月亦能成为王者
  2. 腾讯回应发布虚假广告被罚20万;苹果客服回应iPhone 12屏幕发绿;Chrome 87 正式版发布|极客头条...
  3. AI 与 5G 时代,实时互联网的下一个风口是什么?
  4. 2020已过大半,量子计算机发展如何了?
  5. 如何利用GitHub Pages快速构建免费网站?
  6. 你的 AI 程序无人问津?不是不够好,而是缺一个展示的舞台
  7. 搜狗发布全球首位 3D AI 主播,背后分身技术有玄机
  8. 连登 GitHub TOP 榜,中国开发者在行动!
  9. 强化学习是人工智能的未来?
  10. 收下这份说明书,原来迈进智能计算的大门如此简单