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 相关文章推荐
脚本收藏iframe
Jul 21 Javascript
JavaScript OOP面向对象介绍
Dec 02 Javascript
JavaScript初学者应注意的七个细节小结
Jan 30 Javascript
js跨域访问示例(客户端/服务端)
May 19 Javascript
javascript事件模型实例分析
Jan 30 Javascript
JQuery使用$.ajax和checkbox实现下次不在通知功能
Apr 16 Javascript
JavaScript中数据结构与算法(五):经典KMP算法
Jun 19 Javascript
微信小程序 获取javascript 里的数据
Aug 17 Javascript
解读vue生成的文件目录结构及说明
Nov 27 Javascript
Thinkjs3新手入门之添加一个新的页面
Dec 06 Javascript
Vuex入门到上手教程
Jun 20 Javascript
微信小程序中weui用法解析
Oct 21 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转义输出HTML到JavaScript
2015/03/27 PHP
PHP获取网站中各文章的第一张图片的代码示例
2016/05/20 PHP
php array_key_exists() 与 isset() 的区别
2016/10/24 PHP
JQuery,Extjs,YUI,Prototype,Dojo 等JS框架的区别和应用场景简述
2010/04/15 Javascript
SlideView 图片滑动(扩展/收缩)展示效果
2010/08/01 Javascript
js字符串完全替换函数分享
2014/12/03 Javascript
JS onkeypress兼容性写法详解
2016/04/27 Javascript
js select下拉联动 更具级联性!
2020/04/17 Javascript
jQuery实现可兼容IE6的遮罩功能详解
2017/09/19 jQuery
vue树形结构获取键值的方法示例
2018/06/21 Javascript
微信小程序canvas.drawImage完全显示图片问题的解决
2018/11/30 Javascript
vue项目中在可编辑div光标位置插入内容的实现代码
2020/01/07 Javascript
微信小程序图片自适应实现解析
2020/01/21 Javascript
谈谈JavaScript中的垃圾回收机制
2020/09/17 Javascript
vue实现按钮切换图片
2021/01/20 Vue.js
[01:00]DOTA2 store: Collection of Artisan's Wonders
2015/08/12 DOTA
Python中操作mysql的pymysql模块详解
2016/09/13 Python
Python实现模拟分割大文件及多线程处理的方法
2017/10/10 Python
Python 列表理解及使用方法
2017/10/27 Python
Python+OpenCV目标跟踪实现基本的运动检测
2018/07/10 Python
详解用Python练习画个美队盾牌
2019/03/23 Python
Python3.5面向对象编程图文与实例详解
2019/04/24 Python
NumPy 数组使用大全
2019/04/25 Python
python pandas写入excel文件的方法示例
2019/06/25 Python
Python3之字节串bytes与字节数组bytearray的使用详解
2019/08/27 Python
python实现图片素描效果
2020/09/26 Python
CSS3对背景图片的裁剪及尺寸和位置的设定方法
2016/03/07 HTML / CSS
美国时尚女装在线:Missguided
2016/12/03 全球购物
屈臣氏马来西亚官网:Watsons马来西亚
2019/06/15 全球购物
个人合作协议书范本
2014/04/18 职场文书
工厂搬迁方案
2014/05/11 职场文书
家庭贫困证明范本(经典版)
2014/09/22 职场文书
标准离婚协议书(2014版)
2014/10/05 职场文书
团队会宣传标语
2014/10/09 职场文书
2014年人力资源部工作总结
2014/11/19 职场文书
工程技术负责人岗位职责
2015/04/13 职场文书