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 相关文章推荐
JavaScript中的getTimezoneOffset()方法使用详解
Jun 10 Javascript
JavaScript中的数据类型转换方法小结
Oct 26 Javascript
jQuery实现页面顶部显示的进度条效果完整实例
Dec 09 Javascript
javascript检测flash插件是否被禁用的方法
Jan 14 Javascript
AngularJS使用ng-Cloak阻止初始化闪烁问题的方法
Nov 03 Javascript
AngularJS入门教程之Helloworld示例
Dec 25 Javascript
jQuery中each循环的跳出和结束实例
Aug 16 jQuery
详解在WebStorm中添加Vue.js单文件组件的高亮及语法支持
Oct 21 Javascript
JavaScript DOM元素常见操作详解【添加、删除、修改等】
May 09 Javascript
小程序实现左右来回滚动字幕效果
Dec 28 Javascript
JavaScript实现图片轮播特效
Oct 23 Javascript
vue项目从node8.x升级到12.x后的问题解决
Oct 25 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 一个比较完善的简单文件上传
2010/03/25 PHP
PHP使用glob函数遍历目录或文件夹的方法
2014/12/16 PHP
php类的扩展和继承用法实例
2015/06/20 PHP
PHP时间戳和日期相互转换操作实例小结
2018/12/18 PHP
javascript FormatNumber函数实现方法
2008/12/30 Javascript
JavaScript 应用技巧集合[推荐]
2009/08/30 Javascript
JavaScript中的apply()方法和call()方法使用介绍
2012/07/25 Javascript
JavaScript中json对象和string对象之间相互转化
2012/12/26 Javascript
JS区分浏览器页面是刷新还是关闭
2016/04/17 Javascript
实现点击下箭头变上箭头来回切换的两种方法【推荐】
2016/12/14 Javascript
浅谈webpack打包生成的bundle.js文件过大的问题
2018/02/22 Javascript
微信小程序开发之路由切换页面重定向问题
2018/09/18 Javascript
js中async函数结合promise的小案例浅析
2019/04/14 Javascript
webpack自动打包和热更新的实现方法
2019/06/24 Javascript
基于Vue CSR的微前端实现方案实践
2020/05/27 Javascript
JS实现电脑虚拟键盘打字测试
2020/06/24 Javascript
Element Alert警告的具体使用方法
2020/07/27 Javascript
[06:43]2018DOTA2国际邀请赛寻真——VGJ.Thunder
2018/08/11 DOTA
Python中的赋值、浅拷贝、深拷贝介绍
2015/03/09 Python
Django自定义插件实现网站登录验证码功能
2017/04/19 Python
深入解析Python小白学习【操作列表】
2019/03/23 Python
关于python多重赋值的小问题
2019/04/17 Python
Python爬虫爬取、解析数据操作示例
2020/03/27 Python
python语音识别指南终极版(有这一篇足矣)
2020/09/09 Python
HTTP状态码详解
2021/03/18 杂记
Calzedonia美国官网:意大利风格袜子、打底裤和沙滩装
2018/07/19 全球购物
Coccinelle官网:意大利的著名皮具品牌
2019/05/15 全球购物
英文商务邀请信
2014/01/22 职场文书
《狐假虎威》教学反思
2014/02/07 职场文书
五水共治捐款倡议书
2014/05/14 职场文书
人力资源求职信
2014/05/25 职场文书
安全施工标语
2014/06/07 职场文书
公司出纳岗位职责
2015/03/31 职场文书
2016大一新生军训心得体会
2016/01/11 职场文书
MySQL系列之开篇 MySQL关系型数据库基础概念
2021/07/02 MySQL
基于Python实现对比Exce的工具
2022/04/07 Python