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 相关文章推荐
基于JQuery的访问WebService的代码(可访问Java[Xfire])
Nov 19 Javascript
jquery 回车事件实现代码
Aug 23 Javascript
使用indexOf等在JavaScript的数组中进行元素查找和替换
Sep 18 Javascript
使用CSS3的scale实现网页整体缩放
Mar 18 Javascript
深入了解Node.js中的一些特性
Sep 25 Javascript
浅析AngularJS中的指令
Mar 20 Javascript
jquery使用on绑定a标签无效 只能用live解决
Jun 02 Javascript
vue.js+boostrap项目实践(案例详解)
Sep 21 Javascript
jQuery使用eraser.js插件实现擦除、刮刮卡效果的方法【附eraser.js下载】
Apr 28 jQuery
详解vue-cli3 中跨域解决方案
Apr 10 Javascript
vue history 模式打包部署在域名的二级目录的配置指南
Jul 02 Javascript
Vue解决移动端弹窗滚动穿透问题
Dec 15 Vue.js
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中魔术变量__METHOD__与__FUNCTION__的区别
2014/09/29 PHP
PHP读取文件内容的五种方式
2015/12/28 PHP
php实现微信支付之退款功能
2018/05/30 PHP
Laravel框架实现定时Task Scheduling例子
2019/10/22 PHP
extjs 为某个事件设置拦截器
2010/01/15 Javascript
ExtJs扩展之GroupPropertyGrid代码
2010/03/05 Javascript
浅谈tudou土豆网首页图片延迟加载的效果
2010/06/23 Javascript
不使用中间变量,交换int型的 a, b两个变量的值。
2010/10/29 Javascript
基于Jquery的文字自动截取(提供源代码)
2011/08/09 Javascript
JavaScript中的包装对象介绍
2015/01/27 Javascript
JavaScript实现快速排序的方法
2015/07/31 Javascript
JavaScript中var关键字的使用详解
2015/08/14 Javascript
网页从弹窗页面单选框传值至父页面代码分享
2015/09/29 Javascript
JavaScript实现复制内容到粘贴板代码
2016/03/31 Javascript
hammer.js实现图片手势放大效果
2017/08/29 Javascript
vue2.0 根据状态值进行样式的改变展示方法
2018/03/13 Javascript
vue 引用自定义ttf、otf、在线字体的方法
2019/05/09 Javascript
JS实现简易计算器
2020/02/14 Javascript
Cython 三分钟入门教程
2009/09/17 Python
Python常用内置函数总结
2015/02/08 Python
python 实时遍历日志文件
2016/04/12 Python
tensorflow: 查看 tensor详细数值方法
2018/06/13 Python
对python list 遍历删除的正确方法详解
2018/06/29 Python
用python实现将数组元素按从小到大的顺序排列方法
2018/07/02 Python
python2.7使用plotly绘制本地散点图和折线图
2019/04/02 Python
django settings.py 配置文件及介绍
2019/07/15 Python
弄懂这56个Python使用技巧(轻松掌握Python高效开发)
2019/09/18 Python
python em算法的实现
2020/10/03 Python
中国网上药店领导者:1药网
2017/02/16 全球购物
Europcar葡萄牙:葡萄牙汽车和货车租赁
2017/10/13 全球购物
音乐系毕业生自荐信
2013/10/27 职场文书
乡领导班子四风问题对照检查材料
2014/09/25 职场文书
2014年党建工作总结
2014/11/11 职场文书
2015年上半年物业工作总结
2015/03/30 职场文书
高一英语教学反思
2016/03/03 职场文书
基于docker安装zabbix的详细教程
2022/06/05 Servers