自定义模块指的是非核心模块,也不是路径形式的标识符。它是一种特殊的文件模块,可能是一个文件或者包的形式。这类模块的查找是最费时的,也是所有方式中最慢的一种。

模块路径是Node在定位文件模块的具体文件时制定的查找策略,具体表现为一个路径组成的数组。关于这个路径的生成规则,我们可以手动尝试一番。

创建test.js文件,其内容为 console.log(module.paths); 。将其放到任意一个目录中然后执行 node test.js 。

在Linux下,你可能得到的是这样一个数组输出:

[ '/home/jackson/research/node_modules',
'/home/jackson/node_modules',
'/home/node_modules',
'/node_modules' ]

而在Windows下,也许是这样:

[ 'c:\\nodejs\\node_modules', 'c:\\node_modules' ]

可以看出,模块路径的生成规则如下所示。

1.前文件目录下的node_modules目录。2.父目录下的node_modules目录。3.父目录的父目录下的node_modules目录。4.沿路径向上逐级递归,直到根目录下的node_modules目录。

它的生成方式与JavaScript的原型链或作用域链的查找方式十分类似。在加载的过程中,Node会逐个尝试模块路径中的路径,直到找到目标文件为止。可以看出,当前文件的路径越深,模块查找耗时会越多,这是自定义模块的加载速度是最慢的原因。

webpack可以配置模块的查找路径

  resolve: {  modules: [path.resolve(__dirname, 'node_modules')]    }

指定只在当前模块的node_modules查找模块

但在文件的定位过程中,还有一些细节需要注意,这主要包括文件扩展名的分析、目录和包的处理。

文件扩展名分析

require() 在分析标识符的过程中,会出现标识符中不包含文件扩展名的情况。CommonJS模块规范也允许在标识符中不包含文件扩展名,这种情况下,Node会按.js.json.node的次序补足扩展名,依次尝试。

webpack配置中可以指定匹配的顺序

// 按照指定的扩展名顺序匹配    resolve: {  extensions: ['.js', '.css', '.json', '.jsx']    }

在尝试的过程中,需要调用 fs 模块同步阻塞式地判断文件是否存在。因为Node是单线程的,所以这里是一个会引起性能问题的地方。小诀窍是:如果是.node.json文件,在传递给 require() 的标识符中带上扩展名,会加快一点速度。另一个诀窍是:同步配合缓存,可以大幅度缓解Node单线程中阻塞式调用的缺陷。

目录分析和包

目录分析和包在分析标识符的过程中, require() 通过分析文件扩展名之后,可能没有查找到对应文件,但却得到一个目录,这在引入自定义模块和逐个模块路径进行查找时经常会出现,此时Node会将目录当做一个包来处理。

在这个过程中,Node对CommonJS包规范进行了一定程度的支持。首先,Node在当前目录下查找package.json(CommonJS包规范定义的包描述文件),通过 JSON.parse()解析出包描述对象,从中取出 main 属性指定的文件名进行定位。如果文件名缺少扩展名,将会进入扩展名分析的步骤。

webpack中可以指定查找字段的顺序

// 先定位package.json的style字段,没有再定位main字段指定的文件    resolve: {  mainFields: ['style', 'main']   },

而如果 main 属性指定的文件名错误,或者压根没有package.json文件,Node会将 index当做默认文件名,然后依次查找index.jsindex.nodeindex.json

webpack可以指定查找的顺序

// 先找文件名是index文件,没有再找main的文件   resolve: {  mainFiles: ['index', 'main']    },

如果在目录分析的过程中没有定位成功任何文件,则自定义模块进入下一个模块路径进行查找。如果模块路径数组都被遍历完毕,依然没有查找到目标文件,则会抛出查找失败的异常。

webpack对模块查找的优化相关推荐

  1. webpack 5 模块联邦实现微前端疑难问题解决

    webpack 5 模块联邦实现微前端疑难问题解决 说明 webpack 5 新增 Module Federation(模块联邦)功能,他可以帮助将多个独立的构建组成一个应用程序,不同的构建可以独立的 ...

  2. Tair LDB基于Prefixkey的范围查找性能优化项目中期总结

    "Tair LDB基于Prefixkey的范围查找性能优化"这个项目刚好进行了一个月,这一个月主要是熟悉项目.掌握项目和提出设计方案的过程,下面从几个方面总结下个人在该项目上所做的 ...

  3. 数据结构与算法(8-1)顺序表查找及优化

    目录 一.顺序表查找 二.顺序表查找优化(重点) 总代码 一.顺序表查找 从头到尾或从尾到头查找. //顺序表查找(需要判断两次) int ListSearch(char ch) {for (int ...

  4. webpack组织模块的原理 - 基础篇

    现在前端用Webpack打包JS和其它文件已经是主流了,加上Node的流行,使得前端的工程方式和后端越来越像.所有的东西都模块化,最后统一编译.Webpack因为版本的不断更新以及各种各样纷繁复杂的配 ...

  5. 深入理解Webpack核心模块Tapable钩子[异步版]

    接上一篇文章 深入理解Webpack核心模块WTApable钩子(同步版) tapable中三个注册方法 1 tap(同步) 2 tapAsync(cb) 3 tapPromise(注册的是Promi ...

  6. Java实现二分查找及其优化

    在Java中常用的查找算法有四种: 1.顺序查找(不要求数组有序,挨个遍历进行比对): 2.二分查找(要求数组有序): 3.插值查找: 4.斐波那契查找 本文使用递归思想带来二分查找及其优化 二分查找 ...

  7. boost::math模块查找正态(高斯)尺度(标准差)的示例的测试程序

    boost::math模块查找正态(高斯)尺度(标准差)的示例的测试程序 实现功能 C++实现代码 实现功能 boost::math模块查找正态(高斯)尺度(标准差)的示例的测试程序 C++实现代码 ...

  8. boost::math模块查找正态分布的均值或标准差的示例

    boost::math模块查找正态分布的均值或标准差的示例 实现功能 C++实现代码 实现功能 boost::math模块查找正态分布的均值或标准差的示例 C++实现代码 #include <b ...

  9. python找图是什么模块-python中模块查找的原理与方法详解

    前言 本文主要给大家介绍了关于python模块查找的原理与方式,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍: 基础概念 module 模块, 一个 py 文件或以其他文件形式存在的可被 ...

最新文章

  1. ALSM_EXCEL_TO_INTERNAL_TABLE
  2. LeetCode之Sum of Two Integers
  3. $.post()提交了数据,return不给跳转
  4. 地牢房间迷宫走廊生成(二),Python实现洪水法、完美迷宫
  5. 计算机文字处理操作题33,2017年国家计算机等级考试试题【文字处理】.doc
  6. Python 用下划线作为变量前缀和后缀指定特殊变量
  7. 读写Word的组件DocX介绍与入门
  8. Python学习-第三天-面向对象编程基础
  9. 如何判断一个网页是否更新
  10. python blp模型 估计_随机系数Logit模型及Stata实现
  11. 多个excel工作簿合并_如何使用Excel VBA将多个工作簿的全部工作表合并到一个工作簿中...
  12. VGA显示器屏幕文字模糊(稍有重影)的解决方案
  13. mysqloffset什么意思_MySQL中OFFSET和FETCH的详解
  14. 计算机加法的运算规则,计算机眼中的加法运算
  15. 缺陷预防-我认为的质量改进正道之光
  16. 移植c语言算法到arm上,μCOS-II移植到ARM处理器上的几个要点
  17. 中国肥胖地图出炉,北方人腰更粗实锤了
  18. Oracle中to_char函数的速度问题
  19. 2021年安装deepin20.3和windows双系统
  20. [词根词缀]reg/rept/rid/rod/rot等衍生单词

热门文章

  1. 不缺流量却变现乏力?穿山甲重磅打造《App 如何变现创收》系列课程帮你找症结...
  2. 2020全球智博会于苏州盛大开幕
  3. 三步走!从头开始设计一款游戏
  4. 微软高管谈微软远程办公思考与实践,值得每个企业看看
  5. 动漫美少女生成神器、猫的门禁...2019 年十七大最佳机器学习项目 | 年度盘点...
  6. 苹果三星手机被诉辐射超标;淘集集启动破产清算;Drupal 8.8.0 发布 | 极客头条...
  7. 数据时代如何破局?看小企业里的“大计算”
  8. 实力分享,聚焦分布式高可用消息队列
  9. 程序员 520 表白:我写算法只为找到你!
  10. 日本乐天要求员工学编程,AI 进中小学课堂,全民编程时代来了!