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 相关文章推荐
写入cookie的JavaScript代码库 cookieLibrary.js
Oct 24 Javascript
jquery构造器的实现代码小结
May 16 Javascript
EXTJS记事本 当CompositeField遇上RowEditor
Jul 31 Javascript
JS 加入收藏夹的代码(主流浏览器通用)
May 13 Javascript
JS下拉缓冲菜单示例代码
Aug 30 Javascript
javascript中定义私有方法说明(private method)
Jan 27 Javascript
快速学习jQuery插件 Form表单插件使用方法
Dec 01 Javascript
解决OneThink中无法异步提交kindeditor文本框中修改后的内容方法
May 05 Javascript
老生常谈Bootstrap媒体对象
Jul 06 Javascript
详解ajax的data参数错误导致页面崩溃
Apr 30 Javascript
Vuex 模块化使用详解
Jul 31 Javascript
jQuery实现图片随机切换、抽奖功能(实例代码)
Oct 23 jQuery
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 INI配置文件的解析实现分析
2011/01/04 PHP
PHP session有效期session.gc_maxlifetime
2011/04/20 PHP
ThinkPHP应用模式扩展详解
2014/07/16 PHP
php中使用session_set_save_handler()函数把session保存到MySQL数据库实例
2014/11/06 PHP
php实现的用户查询类实例
2015/06/18 PHP
PHP+MySQL实现模糊查询员工信息功能示例
2018/06/01 PHP
javascript语句中的CDATA标签的意义
2007/05/09 Javascript
比较全的JS checkbox全选、取消全选、删除功能代码
2008/12/19 Javascript
javascript开发技术大全-第3章 js数据类型
2011/07/03 Javascript
javascript dom追加内容实现示例
2013/09/21 Javascript
jquery复选框checkbox实现删除前判断
2014/04/20 Javascript
$(document).ready(function() {})不执行初始化脚本
2014/06/19 Javascript
Google官方支持的NodeJS访问API,提供后台登录授权
2014/07/29 NodeJs
JQuery中extend的用法实例分析
2015/02/08 Javascript
jquery实现翻动fadeIn显示的方法
2015/03/05 Javascript
使用递归遍历对象获得value值的实现方法
2016/06/14 Javascript
微信小程序 简单教程实例详解
2017/01/13 Javascript
父组件中vuex方法更新state子组件不能及时更新并渲染的完美解决方法
2018/04/25 Javascript
vue-cli与webpack处理静态资源的方法及webpack打包的坑
2018/05/15 Javascript
JavaScript实现创建自定义对象的常用方式总结
2018/07/09 Javascript
详解Vue源码学习之callHook钩子函数
2018/07/25 Javascript
jQuery操作事件完整实例分析
2020/01/10 jQuery
JavaScript将数组转换为链表的方法
2020/02/16 Javascript
[01:42]TI4西雅图DOTA2前线报道 第一顿早饭哦
2014/07/08 DOTA
python写的一个squid访问日志分析的小程序
2014/09/17 Python
Python使用装饰器进行django开发实例代码
2018/02/06 Python
在mac下查找python包存放路径site-packages的实现方法
2018/11/06 Python
Python3.0中普通方法、类方法和静态方法的比较
2019/05/03 Python
python函数参数(必须参数、可变参数、关键字参数)
2019/08/16 Python
PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译
2020/04/15 Python
翻转数列python实现,求前n项和,并能输出整个数列的案例
2020/05/03 Python
python接口自动化框架实战
2020/12/23 Python
岗位说明书标准范本
2014/07/30 职场文书
争先创优演讲稿
2014/09/15 职场文书
倡议书格式及范文
2015/04/29 职场文书
java固定大小队列的几种实现方式详解
2021/07/15 Java/Android