博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
webpack(5)--Resolve
阅读量:5088 次
发布时间:2019-06-13

本文共 2023 字,大约阅读时间需要 6 分钟。

Resolve

webpack在启动后会从配置的入口模块触发找出所有依赖的模块,Resolve配置webpack如何寻找模块对应的文件。webpack内置JavaScript模块化语法解析功能,默认会采用模块化标准里约定好的规则去寻找,但你可以根据自己的需要修改默认的规则。

1. alias

resolve.alias配置项通过别名来把原来导入路径映射成一个新的导入路径。如下:

//webpack alias配置resolve: {    alias: {        componets: './src/components/' } }

当你通过import Button from 'components/button'导入时,实际上被alias等价替换成import Button from './src/components/button'

以上alias配置的含义是把导入语句里的components关键字替换成./src/components。

这样做可能会命中太多的导入语句, alias还支持$符号来缩小范围只命中以关键字结尾的导入语句:

resolve: {    alias: {        'react$' : '/path/to/react.min.js' } }

这样react$只会命中以react结尾的导入语句,即只会把import react关键字替换成import '/path/to/react.min.js'

2. mainFields

有一些第三方模块会针对不同环境提供几份代码。例如分别提供采用ES5 和 ES6的2份代码,这2份代码的位置写在package.json文件里:

{    "jsnext: main": "es/index.js", //采用ES6语法的代码入口文件    "main": "lib/index.js"//采用ES5语法的代码入口文件 }

webpack会根据mainFields的配置去决定优先采用哪份代码, mainFields默认如下:

mainFields: ['browser', 'main']

webpack会按照数组里的顺序去package.json文件里面找,只会使用找到的第一个。

假如我们想要ES6的那份代码,可以这样进行配置:

mainFields: ['jsnext:main', 'browser', 'main']

3. extensions

在导入语句没带文件后缀时,webpack会自动带上后缀去尝试访问文件是否存在。resolve.extensions用于配置在尝试过程中用到的后缀列表,默认是:

extensions:['.js', '.json']

也就是说当遇到require('./data')这样的导入语句时,webpack会先去寻找./data.js文件,如果找不到则去找./data.json文件,如果还是找不到则会报错。

4. modules

resolve.modules配置webpack去哪些目录下寻找第三方模块。默认是去node_modules目录下寻找。有时你的项目中会有一些模块大量被其他模块依赖和导入,由于其他模块的位置分布不定,针对不同的文件都要去计算被导入模块文件的相对路径,这个路径有时候会很长,例如:import './../../components/button',这时你可以利用modules配置项优化,假如那些大量导入的模块都在./src/components目录下:

modules:['./src/components', 'node_modules']

5. descriptionFiles

resolve.descriptionFiles配置描述第三方模块的文件名称,也就是package.json文件。默认如下:

descriptionFiles: ['package.json']

6. enforceExtension

resolve.enforceExtension如果配置为true,所有导入语句都必须带文件后缀。

7. enforceModuleExtension

enforceModuleExtension 和 enforceExtension 作用类似,但 enforceModuleExtension 只对 node_modules 下的模块生效。 enforceModuleExtension 通常搭配 enforceExtension 使用,在 enforceExtension:true 时,因为安装的第三方模块中大多数导入语句没带文件后缀, 所以这时通过配置 enforceModuleExtension:false 来兼容第三方模块。

转载于:https://www.cnblogs.com/luckyXcc/p/9836551.html

你可能感兴趣的文章
VC(VISUAL_C++)虚拟键VK值列表
查看>>
《风笛》-林白
查看>>
Android 网络请求框架Retrofit
查看>>
GeoServer手动发布本地Shapefile地图
查看>>
KMP之我见
查看>>
BZOJ1119[POI2009]SLO && BZOJ1697[Usaco2007 Feb]Cow Sorting牛排序
查看>>
<a>标签中的href伪协议 ...
查看>>
java初始化过程中成员变量
查看>>
20145322 《信息安全系统设计基础》第十周学习总结
查看>>
babel常识备忘
查看>>
js中的事件代理(委托)
查看>>
Django组件——分页器和中间件
查看>>
scala 14 trait
查看>>
You need to run build with JDK or have tools.jar问题解决
查看>>
BZOJ 1030: [JSOI2007]文本生成器 [AC自动机 DP]
查看>>
HDU 3949 XOR [高斯消元XOR 线性基]
查看>>
LeetCode Best Time to Buy and Sell Stock III
查看>>
PHP变量引用赋值后unset 输出原始变量,值存在.
查看>>
简单的新浪微博爬虫-Python版-(下载部分)---(上)
查看>>
for-each用法误区(不能改变数组元素值)
查看>>