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 相关文章推荐
js自带函数备忘 数组
Dec 29 Javascript
JavaScript高级程序设计 扩展--关于动态原型
Nov 09 Javascript
jQuery动画效果-slideUp slideDown上下滑动示例代码
Aug 28 Javascript
9行javascript代码获取QQ群成员具体实现
Oct 16 Javascript
JavaScript 闭包机制详解及实例代码
Oct 10 Javascript
详解Vue单元测试case写法
May 24 Javascript
VUE中使用MUI方法
Feb 12 Javascript
详解TypeScript+Vue 插件 vue-class-component的使用总结
Feb 18 Javascript
node.js实现上传文件功能
Jul 15 Javascript
使用webpack将ES6转化ES5的实现方法
Oct 13 Javascript
JS实现横向轮播图(初级版)
Jun 24 Javascript
Vue axios与Go Frame后端框架的Options请求跨域问题详解
Mar 03 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获取mysql数据表的字段名称和详细信息的方法
2014/09/27 PHP
PHP实现linux命令tail -f
2016/02/22 PHP
为Yahoo! UI Extensions Grid增加内置的可编辑器
2007/03/10 Javascript
javascript实现TreeView 无刷新展开的实例代码
2013/07/13 Javascript
json数据的列循环示例
2013/09/06 Javascript
jQuery使用height()获取高度需要注意的地方
2014/12/13 Javascript
JavaScript获得页面base标签中url的方法
2015/04/03 Javascript
详解javascript中的事件处理
2015/11/06 Javascript
javascript特殊日历控件分享
2016/03/07 Javascript
BootStrap Fileinput的使用教程
2016/12/30 Javascript
Vue.js系列之项目结构说明(2)
2017/01/03 Javascript
jQuery插件FusionCharts实现的3D柱状图效果实例【附demo源码下载】
2017/03/03 Javascript
Kindeditor单独调用单图上传增加预览功能的实例
2017/07/31 Javascript
JS简单实现数组去重的方法分析
2017/10/14 Javascript
vue实现登录后页面跳转到之前页面
2018/01/07 Javascript
解决Angular.js中使用Swiper插件不能滑动的问题
2018/02/26 Javascript
详解如何在vue项目中使用layui框架及采坑
2019/05/05 Javascript
Element-ui DatePicker显示周数的方法示例
2019/07/19 Javascript
微信小程序 bindtap 传参的实例代码
2020/02/21 Javascript
angula中使用iframe点击后不执行变更检测的问题
2020/05/10 Javascript
python字符串替换的2种方法
2014/11/30 Python
python套接字流重定向实例汇总
2016/03/03 Python
python实现机械分词之逆向最大匹配算法代码示例
2017/12/13 Python
Python中的二维数组实例(list与numpy.array)
2018/04/13 Python
基于Python列表解析(列表推导式)
2018/06/23 Python
python中的decorator的作用详解
2018/07/26 Python
使用python对excle和json互相转换的示例
2018/10/23 Python
Python 利用切片从列表中取出一部分使用的方法
2019/02/01 Python
英国知名奢侈品包包品牌:Milli Millu
2016/12/22 全球购物
公司董事长职责
2013/12/12 职场文书
毕业自荐信
2013/12/16 职场文书
怎么写自荐书范文
2014/02/12 职场文书
单位委托函范文
2015/01/29 职场文书
学校财务管理制度
2015/08/04 职场文书
Python实现DBSCAN聚类算法并样例测试
2021/06/22 Python
Python语法学习之进程的创建与常用方法详解
2022/04/08 Python