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 相关文章推荐
原型方法的不同写法居然会影响调试的解决方法
Mar 08 Javascript
JavaScript 在各个浏览器中执行的耐性
Apr 06 Javascript
jquery.jstree 增加节点的双击事件代码
Jul 27 Javascript
Js 时间间隔计算的函数(间隔天数)
Nov 15 Javascript
jquery获取一组checkbox的值(实例代码)
Nov 04 Javascript
无刷新预览所选择的图片示例代码
Apr 02 Javascript
jQuery焦点图切换特效代码分享
Sep 15 Javascript
js表单验证实例讲解
Mar 31 Javascript
AngularJS使用指令增强标准表单元素功能
Jul 01 Javascript
如何安装控制器JavaScript生成插件详解
Oct 21 Javascript
JS块级作用域和私有变量实例分析
May 11 Javascript
jQuery实现每日秒杀商品倒计时功能
Sep 06 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中使用memcache存储session的三种配置方法
2014/04/05 PHP
php中time()与$_SERVER[REQUEST_TIME]用法区别
2014/11/19 PHP
PHP+Ajax实时自动检测是否联网的方法
2015/07/01 PHP
Laravel框架实现的rbac权限管理操作示例
2019/01/16 PHP
javascript定时变换图片实例代码
2013/03/17 Javascript
JavaScript子类用Object.getPrototypeOf去调用父类方法解析
2013/12/05 Javascript
setTimeout()递归调用不加引号出错的解决方法
2014/09/05 Javascript
JQuery实现超链接鼠标提示效果的方法
2015/06/10 Javascript
JavaScript模块化开发之SeaJS
2015/12/13 Javascript
Bootstrap基本组件学习笔记之下拉菜单(7)
2016/12/07 Javascript
在vue中添加Echarts图表的基本使用教程
2017/11/22 Javascript
Vue-Router的使用方法
2018/09/05 Javascript
JavaScript实现随机点名器实例详解
2019/05/07 Javascript
vue+element搭建后台小总结 el-dropdown下拉功能
2020/04/10 Javascript
JavaScript前端开发时数值运算的小技巧
2020/07/28 Javascript
echarts实现晶体球面投影的实例教程
2020/10/10 Javascript
举例讲解Linux系统下Python调用系统Shell的方法
2015/11/07 Python
Python中动态创建类实例的方法
2017/03/24 Python
Python基于递归算法实现的走迷宫问题
2017/08/04 Python
使用Python搭建虚拟环境的配置方法
2018/02/28 Python
python3处理含有中文的url方法
2018/05/10 Python
Django rest framework实现分页的示例
2018/05/24 Python
selenium+python自动化测试之使用webdriver操作浏览器的方法
2019/01/23 Python
python统计mysql数据量变化并调用接口告警的示例代码
2020/09/21 Python
open_basedir restriction in effect. 原因与解决方法
2021/03/14 PHP
HTML中fieldset标签概述及使用方法
2013/02/01 HTML / CSS
jurlique茱莉蔻英国官网:澳洲天然护肤品
2018/08/03 全球购物
澳大利亚最受欢迎的女士度假服装:Kabana Shop
2020/10/10 全球购物
最新党员思想汇报
2014/01/01 职场文书
建筑总经理岗位职责
2014/02/02 职场文书
优秀护士获奖感言
2014/02/20 职场文书
工作经历证明范本
2015/06/15 职场文书
环保建议书作文400字
2015/09/14 职场文书
小学班主任工作经验交流材料
2015/11/02 职场文书
Vue中使用import进行路由懒加载的原理分析
2022/04/01 Vue.js
python图像处理 PIL Image操作实例
2022/04/09 Python