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遍历筛选数组的几种方法和遍历解析json对象
Dec 13 Javascript
js中window.open打开一个新的页面
Aug 10 Javascript
jQuery实现按钮只点击一次后就取消点击事件绑定的方法
Jun 26 Javascript
jquery不常用方法汇总
Jul 26 Javascript
JS中JSON对象和String之间的互转及处理技巧
Apr 06 Javascript
AngularJS报错$apply already in progress的解决方法分析
Jan 30 Javascript
node.js利用redis数据库缓存数据的方法
Mar 01 Javascript
angularjs封装$http为factory的方法
May 18 Javascript
js实现导航跟随效果
Nov 17 Javascript
JavaScript继承的特性与实践应用深入详解
Dec 30 Javascript
浅探express路由和中间件的实现
Sep 30 Javascript
vue 项目中当访问路由不存在的时候默认访问404页面操作
Aug 31 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 Rename 更改文件、文件夹名称
2011/05/24 PHP
PHP MYSQL实现登陆和模糊查询两大功能
2016/02/05 PHP
php如何控制用户对图片的访问 PHP禁止图片盗链
2016/03/25 PHP
laravel框架关于搜索功能的实现
2018/03/15 PHP
Linux下 php7安装redis的方法
2018/11/01 PHP
在网页里看flash的trace数据的js类
2009/01/10 Javascript
JQuery入门——事件切换之hover()方法应用介绍
2013/02/05 Javascript
jQuery关键词说明插件cluetip使用指南
2015/04/21 Javascript
javascript html5轻松实现拖动功能
2017/03/01 Javascript
如何使用Bootstrap创建表单
2017/03/29 Javascript
Javascript实现的StopWatch功能示例
2017/06/13 Javascript
Vue.js表单标签中的单选按钮、复选按钮和下拉列表的取值问题
2017/11/22 Javascript
js提取中文拼音首字母的封装工具类
2018/03/12 Javascript
JavaScript中this函数使用实例解析
2020/02/21 Javascript
js实现简单贪吃蛇游戏
2020/05/15 Javascript
vuex刷新后数据丢失的解决方法
2020/10/18 Javascript
vue中使用echarts的示例
2021/01/03 Vue.js
[43:24]VG vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python 3.x 连接数据库示例(pymysql 方式)
2017/01/19 Python
利用rest framework搭建Django API过程解析
2019/08/31 Python
pytorch 批次遍历数据集打印数据的例子
2019/12/30 Python
使用Python来做一个屏幕录制工具的操作代码
2020/01/18 Python
flask框架自定义url转换器操作详解
2020/01/25 Python
Tensorflow不支持AVX2指令集的解决方法
2020/02/03 Python
Python实现检测文件的MD5值来查找重复文件案例
2020/03/12 Python
什么是python的列表推导式
2020/05/26 Python
HTML5单页面手势滑屏切换原理分析
2017/07/10 HTML / CSS
Parts Express:音频、视频和扬声器的第一来源
2017/04/25 全球购物
百度吧主申请感言
2014/01/12 职场文书
卫生安全检查制度
2014/02/04 职场文书
幼儿园毕业教师感言
2014/02/21 职场文书
客服部班长工作责任制
2014/02/25 职场文书
《李广射虎》教学反思
2014/04/27 职场文书
疾病防治方案
2014/05/31 职场文书
公司保洁员管理制度
2015/08/04 职场文书
导游词之唐山景点
2019/12/18 职场文书