webpack 如何解析代码模块路径的实现


Posted in Javascript onSeptember 04, 2019

前言

webpack是如何解析代码模块路径

webpack 中有一个很关键的模块 enhanced-resolve 就是处理依赖模块路径的解析的,这个模块可以说是 Node.js 那一套模块路径解析的增强版本,有很多可以自定义的解析配置。

模块解析规则

解析相对路径

  1. 查找相对当前模块的路径下是否有对应文件或文件夹
  2. 是文件则直接加载
  3. 是文件夹则继续查找文件夹下的 package.json 文件
  4. 有 package.json 文件则按照文件中 main 字段的文件名来查找文件
  5. 无 package.json 或者无 main 字段则查找 index.js 文件.

解析模块名

查找当前文件目录下,父级目录及以上目录下的 node_modules 文件夹,看是否有对应名称的模块

解析绝对路径(不建议使用)

直接查找对应路径的文件

在 webpack 配置中,和模块路径解析相关的配置都在 resolve 字段下:

module.exports = {
 resolve: {
 // ...
 }
}

resolve.alias

假设我们有个 utils 模块极其常用,经常编写相对路径很麻烦,希望可以直接 import 'utils' 来引用,那么我们可以配置某个模块的别名,如:

alias: {
 utils: path.resolve(__dirname, 'src/utils')
 // 这里使用 path.resolve 和 __dirname 来获取绝对路径 
}

上述的配置是模糊匹配,意味着只要模块路径中携带了 utils 就可以被替换掉,如:

import 'utils/query.js' 
// 等同于 import '[项目绝对路径]/src/utils/query.js'

如果需要进行精确匹配可以使用:

alias: { 
utils$: path.resolve(__dirname, 'src/utils')
 // 只会匹配 import 'utils' 
}

更多匹配相关的写法可以参考官方文档 Resolve Alias,这里不一一举例说明。

resolve.extensions

extensions: ['.wasm', '.mjs', '.js', '.json', '.jsx'],
// 这里的顺序代表匹配后缀的优先级,例如对于 index.js 和 index.jsx,会优先选择 index.js

看到数组中配置的字符串大概就可以猜到,这个配置的作用是和文件后缀名有关的。是的,这个配置可以定义在进行模块路径解析时,webpack 会尝试帮你补全那些后缀名来进行查找,例如有了上述的配置,当你在 src/utils/ 目录下有一个 common.js 文件时,就可以这样来引用.

import * as common from './src/utils/common'

webpack 会尝试给你依赖的路径添加上 extensions 字段所配置的后缀,然后进行依赖路径查找,所以可以命中 src/utils/common.js 文件。

resolve.modules

前面的内容有提到,对于直接声明依赖名的模块(如 react ),webpack 会类似 Node.js 一样进行路径搜索,搜索 node_modules 目录,这个目录就是使用 resolve.modules 字段进行配置的,默认就是:

resolve: {
 modules: ['node_modules'],
},

如果可以确定项目内所有的第三方依赖模块都是在项目根目录下的 node_modules 中的话,那么可以在 node_modules 之前配置一个确定的绝对路径:

resolve: {
 modules: [
 path.resolve(__dirname, 'node_modules'), // 指定当前目录下的 node_modules 优先查找
 'node_modules', // 如果有一些类库是放在一些奇怪的地方的,你可以添加自定义的路径或者目录
 ],
}

这样配置在某种程度上可以简化模块的查找,提升构建速度。

后言

resolve 还有一些其他的配置,还有其他的伙伴那就去官网看看,以上都是实际项目中使用到的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
xml和web特殊字符
Apr 28 Javascript
基于JQuery实现相同内容合并单元格的代码
Jan 12 Javascript
自定义一个jquery插件[鼠标悬浮时候 出现说明label]
Jun 27 Javascript
JavaScript事件处理器中的event参数使用介绍
May 24 Javascript
js遍历、动态的添加数据的小例子
Jun 22 Javascript
js返回前一页刷新本页重载页面
Jul 29 Javascript
给easyui的datebox控件添加清空按钮的实现方法
Nov 09 Javascript
原生js获取left值和top值的三种方法
Aug 02 Javascript
javascript函数的节流[throttle]与防抖[debounce]
Nov 15 Javascript
vue checkbox 全选 数据的绑定及获取和计算方法
Feb 09 Javascript
微信小程序分享功能之按钮button 边框隐藏和点击隐藏
Jun 14 Javascript
video.js 实现视频只能后退不能快进的思路详解
Aug 09 Javascript
layui使用button按钮 点击出现弹层 弹层中加载表单的实例
Sep 04 #Javascript
微信小程序 自定义复选框实现代码实例
Sep 04 #Javascript
layui弹出框Tab选项卡的示例代码
Sep 04 #Javascript
在layui tab控件中载入外部html页面的方法
Sep 04 #Javascript
微信自定义分享链接信息(标题,图片和内容)实现过程详解
Sep 04 #Javascript
微信小程序按钮点击动画效果的实现
Sep 04 #Javascript
微信小程序实现点击卡片 翻转效果
Sep 04 #Javascript
You might like
西德产收音机
2021/03/01 无线电
一个数据采集类
2007/02/14 PHP
Windows PHP5和Apache的安装与配置
2009/06/08 PHP
PHP生成网页快照 不用COM不用扩展.
2010/02/11 PHP
ubuntu 编译安装php 5.3.3+memcache的方法
2010/08/05 PHP
PHP函数篇详解十进制、二进制、八进制和十六进制转换函数说明
2011/12/05 PHP
PHP get_html_translation_table()函数用法讲解
2019/02/16 PHP
JavaScript类库D
2010/10/24 Javascript
js解析json读取List中的实体对象示例
2014/03/11 Javascript
JavaScript模拟重力状态下抛物运动的方法
2015/03/03 Javascript
浅谈Javascript数组(推荐)
2016/05/17 Javascript
AngularJS基础 ng-click 指令示例代码
2016/08/01 Javascript
jQuery插件EasyUI设置datagrid的checkbox为禁用状态的方法
2016/08/05 Javascript
详解基于vue-router的动态权限控制实现方案
2017/09/28 Javascript
js点击时关闭该范围下拉菜单之外的菜单方法
2018/01/11 Javascript
微信小程序 确认框的实现(附代码)
2019/07/23 Javascript
在Echarts图中给坐标轴加一个标识线markLine
2020/07/20 Javascript
[01:03:50]DOTA2-DPC中国联赛 正赛 CDEC vs DLG BO3 第二场 2月7日
2021/03/11 DOTA
在Python中使用swapCase()方法转换大小写的教程
2015/05/20 Python
对numpy的array和python中自带的list之间相互转化详解
2018/04/13 Python
Flask和Django框架中自定义模型类的表名、父类相关问题分析
2018/07/19 Python
python实现自动登录后台管理系统
2018/10/18 Python
详解python3安装pillow后报错没有pillow模块以及没有PIL模块问题解决
2019/04/17 Python
python变量命名的7条建议
2019/07/04 Python
python日志模块logbook使用方法
2019/09/19 Python
python定间隔取点(np.linspace)的实现
2019/11/27 Python
Python调用jar包方法实现过程解析
2020/08/11 Python
英国领先的餐饮折扣俱乐部:Gourmet Society
2020/07/26 全球购物
《会变的花树叶》教学反思
2014/02/10 职场文书
党校学习心得体会范文
2014/09/09 职场文书
公司委托书格式范文
2014/10/09 职场文书
抗洪救灾感谢信
2015/01/22 职场文书
质检员工作总结2015
2015/04/25 职场文书
SQL SERVER中常用日期函数的具体使用
2021/04/08 SQL Server
pytorch 梯度NAN异常值的解决方案
2021/06/05 Python
Django rest framework如何自定义用户表
2021/06/09 Python