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 相关文章推荐
JavaScript中的isXX系列是否继续使用的分析
Apr 16 Javascript
浅析hasOwnProperty方法的应用
Nov 20 Javascript
JS+CSS实现下拉列表框美化效果(3款)
Aug 15 Javascript
JavaScript中windows.open()、windows.close()方法详解
Jul 28 Javascript
手机Web APP如何实现分享多平台功能
Aug 19 Javascript
表单input项使用label同时引用Bootstrap库导致input点击效果区增大问题
Oct 11 Javascript
js继承实现方法详解
Dec 16 Javascript
jQuery使用正则验证15/18身份证的方法示例
Apr 27 jQuery
Angular 组件之间的交互的示例代码
Mar 24 Javascript
浅谈微信小程序之官方UI框架we-ui使用教程
Aug 20 Javascript
详解小程序开发经验:多页面数据同步
May 18 Javascript
Vue如何提升首屏加载速度实例解析
Jun 25 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运行出现Call to undefined function curl_init()的解决方法
2010/11/02 PHP
php+mysql实现的二级联动菜单效果详解
2016/05/10 PHP
php array 转json及java 转换 json数据格式操作示例
2019/11/13 PHP
JavaScript脚本性能的优化方法
2007/02/02 Javascript
推荐一些非常不错的javascript学习资源站点
2007/08/29 Javascript
jquery常用特效方法使用示例
2014/04/25 Javascript
jQuery filter函数使用方法
2014/05/19 Javascript
javascript中对变量类型的判断方法
2015/08/09 Javascript
jQuery给div,Span, a ,button, radio 赋值与取值
2016/06/24 Javascript
IntersectionObserver API 详解篇
2016/12/11 Javascript
nodejs+express实现文件上传下载管理网站
2017/03/15 NodeJs
巧用weui.topTips验证数据的实例
2017/04/17 Javascript
简单谈谈js的数据类型
2017/09/25 Javascript
Three.js加载外部模型的教程详解
2017/11/10 Javascript
微信小程序实现获取用户信息并存入数据库操作示例
2019/05/07 Javascript
js 实现ajax发送步骤过程详解
2019/07/25 Javascript
基于JS判断对象是否是数组
2020/01/10 Javascript
小程序自定义导航栏兼容适配所有机型(附完整案例)
2020/04/26 Javascript
[57:22]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第五场
2018/04/10 DOTA
python3.5 + PyQt5 +Eric6 实现的一个计算器代码
2017/03/11 Python
Python实现爬虫抓取与读写、追加到excel文件操作示例
2018/06/27 Python
10 行 Python 代码教你自动发送短信(不想回复工作邮件妙招)
2018/10/11 Python
Python 隐藏输入密码时屏幕回显的实例
2019/02/19 Python
python 计算数据偏差和峰度的方法
2019/06/29 Python
详解python实现小波变换的一个简单例子
2019/07/18 Python
python集成开发环境配置(pycharm)
2020/02/14 Python
HTML5+JS实现俄罗斯方块原理及具体步骤
2013/11/29 HTML / CSS
Under Armour澳大利亚官网:美国知名的高端功能性运动品牌
2018/02/22 全球购物
高中美术教学反思
2014/01/19 职场文书
药品业务员岗位职责
2014/04/17 职场文书
建材投资建议书
2014/05/16 职场文书
优秀员工评优方案
2014/06/13 职场文书
班级读书活动总结
2014/06/30 职场文书
2015大学生实训报告
2014/11/05 职场文书
2019年图书室自查报告范本
2019/10/12 职场文书
mysql主从复制的实现步骤
2021/10/24 MySQL