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 面向对象编程(2) 定义类
May 18 Javascript
Javascript绝句欣赏 一些经典的js代码
Feb 22 Javascript
JQuery操作表格(隔行着色,高亮显示,筛选数据)
Feb 23 Javascript
基于jquery实现的文字向上跑动类似跑马灯的效果
Jun 17 Javascript
js实现获取焦点后光标在字符串后
Sep 17 Javascript
JavaScript编写简单的计算器
Nov 25 Javascript
JavaScript必知必会(九)function 说起 闭包问题
Jun 08 Javascript
元素全屏的设置与监听实例
Nov 28 Javascript
django js 实现表格动态标序号的实例代码
Jul 12 Javascript
基于Taro的微信小程序模板消息-获取formId功能模块封装实践
Jul 15 Javascript
vue.js 2.0实现简单分页效果
Jul 29 Javascript
Layui之table中的radio在切换分页时无法记住选中状态的解决方法
Sep 02 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
SONY ICF-SW55的电路分析
2021/03/02 无线电
PHP整数取余返回负数的相关解决方法
2014/05/15 PHP
win7 wamp 64位 php环境开启curl服务遇到的问题及解决方法
2018/09/16 PHP
Yii框架组件的事件机制原理与用法分析
2020/04/07 PHP
jquery text,radio,checkbox,select操作实现代码
2009/07/09 Javascript
select、radio表单回显功能实现避免使用jquery载入赋值
2013/06/08 Javascript
解析prototype,JQuery中跳出each循环的方法
2013/12/12 Javascript
JavaScript模拟可展开、拖动与关闭的聊天窗口实例
2015/05/12 Javascript
JavaScript获取当前运行脚本文件所在目录的方法
2016/02/03 Javascript
JS实现的自定义显示加载等待图片插件(loading.gif)
2016/06/17 Javascript
使用jQuery Ajax 请求webservice来实现更简练的Ajax
2016/08/04 Javascript
jQuery密码强度验证控件使用详解
2017/01/05 Javascript
详解Vue中过度动画效果应用
2017/05/25 Javascript
使用nodeJs来安装less及编译less文件为css文件的方法
2017/11/20 NodeJs
js获取html页面代码中图片地址的实现代码
2018/03/05 Javascript
从源码角度来回答keep-alive组件的缓存原理
2021/01/18 Javascript
Python中类的定义、继承及使用对象实例详解
2015/04/30 Python
利用python爬取软考试题之ip自动代理
2017/03/28 Python
python pandas 组内排序、单组排序、标号的实例
2018/04/12 Python
Python正则表达式和re库知识点总结
2019/02/11 Python
搞定这套Python爬虫面试题(面试会so easy)
2019/04/03 Python
浅析Python语言自带的数据结构有哪些
2019/08/27 Python
Django模板语言 Tags使用详解
2019/09/09 Python
Python django框架输入汉字,数字,字符生成二维码实现详解
2019/09/24 Python
Pycharm内置终端及远程SSH工具的使用教程图文详解
2020/03/19 Python
python MultipartEncoder传输zip文件实例
2020/04/07 Python
django使用JWT保存用户登录信息
2020/04/22 Python
Python 实现将某一列设置为str类型
2020/07/14 Python
纯CSS3实现的阴影效果
2014/12/24 HTML / CSS
CSS3+JavaScript实现炫酷呼吸效果的示例代码
2020/06/15 HTML / CSS
英国知名化妆品网站:Revolution Beauty(原TAM Beauty)
2018/02/28 全球购物
办公室岗位职责
2014/02/12 职场文书
竞选大学学委演讲稿
2014/09/13 职场文书
2014年个人售房协议书
2014/10/30 职场文书
房贷工资证明范本
2015/06/12 职场文书
我的兄弟姐妹观后感
2015/06/15 职场文书