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 相关文章推荐
js 禁用浏览器的后退功能的简单方法
Dec 10 Javascript
JQuery困惑—包装集 DOM节点
Oct 16 Javascript
使用jQuery实现dropdownlist的联动效果(sharepoint 2007)
Mar 30 Javascript
javascript自动改变文字大小和颜色的效果的小例子
Aug 02 Javascript
JS控制图片等比例缩放的示例代码
Dec 24 Javascript
深入理解Javascript中this的作用域
Aug 12 Javascript
一句jQuery代码实现返回顶部效果(简单实用)
Dec 28 Javascript
js与jQuery实现获取table中的数据并拼成json字符串操作示例
Jul 12 jQuery
小程序实现展开/收起的效果示例
Sep 22 Javascript
Vue.js 时间转换代码及时间戳转时间字符串
Oct 16 Javascript
vue项目设置scrollTop不起作用(总结)
Dec 21 Javascript
Vue.js原理分析之nextTick实现详解
Sep 07 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
强制PHP命令行脚本单进程运行的方法
2014/04/15 PHP
php遍历数组的4种方法总结
2014/07/05 PHP
thinkPHP5框架闭包函数与子查询传参用法示例
2018/08/02 PHP
DOM 脚本编程中的兄弟节点
2009/10/31 Javascript
一些常用的JavaScript函数(json)附详细说明
2011/05/25 Javascript
Jquery 监视按键,按下回车键触发某方法的实现代码
2014/05/11 Javascript
javascript学习笔记(二)数组和对象部分
2014/09/30 Javascript
JavaScript监听和禁用浏览器回车事件实例
2015/01/31 Javascript
jQuery使用元素属性attr赋值详解
2015/02/27 Javascript
jQuery遮罩层实现方法实例详解(附遮罩层插件)
2015/12/08 Javascript
浅谈js的异步执行
2016/10/18 Javascript
JS与HTML结合实现流程进度展示条思路详解
2017/09/03 Javascript
微信小程序chooseImage的用法(从本地相册选择图片或使用相机拍照)
2018/08/22 Javascript
JavaScript中七种流行的开源机器学习框架
2018/10/11 Javascript
记录一次开发微信网页分享的步骤
2019/05/07 Javascript
微信小程序简单的canvas裁剪图片功能详解
2019/07/12 Javascript
Bootstrap实现省市区三级联动(亲测可用)
2019/07/26 Javascript
微信小程序实现时间进度条功能
2020/11/17 Javascript
vue移动端使用canvas签名的实现
2020/01/15 Javascript
Vue.js中使用Vuex实现组件数据共享案例
2020/07/31 Javascript
[34:47]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第一场 11.18
2020/11/18 DOTA
python pandas 时间日期的处理实现
2019/07/30 Python
解决Django后台ManyToManyField显示成Object的问题
2019/08/09 Python
Python底层封装实现方法详解
2020/01/22 Python
pytorch数据预处理错误的解决
2020/02/20 Python
浅谈Django中的QueryDict元素为数组的坑
2020/03/31 Python
给keras层命名,并提取中间层输出值,保存到文档的实例
2020/05/23 Python
python 写函数在一定条件下需要调用自身时的写法说明
2020/06/01 Python
雪花秀美国官方网站:韩国著名草本护肤化妆品品牌
2016/10/19 全球购物
英国健身超市:Fitness Superstore
2019/06/17 全球购物
大学生简单自荐信
2013/11/10 职场文书
家长给孩子的评语
2014/01/30 职场文书
软环境建设心得体会
2014/09/09 职场文书
vue3获取当前路由地址
2022/02/18 Vue.js
Java 超详细讲解ThreadLocal类的使用
2022/04/07 Java/Android
Vue router配置与使用分析讲解
2022/12/24 Vue.js