zoukankan      html  css  js  c++  java
  • webpack(5)--Resolve

    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 来兼容第三方模块。

  • 相关阅读:
    NBUT 1120 Reimu's Teleport (线段树)
    NBUT 1119 Patchouli's Books (STL应用)
    NBUT 1118 Marisa's Affair (排序统计,水)
    NBUT 1117 Kotiya's Incantation(字符输入处理)
    NBUT 1115 Cirno's Trick (水)
    NBUT 1114 Alice's Puppets(排序统计,水)
    188 Best Time to Buy and Sell Stock IV 买卖股票的最佳时机 IV
    187 Repeated DNA Sequences 重复的DNA序列
    179 Largest Number 把数组排成最大的数
    174 Dungeon Game 地下城游戏
  • 原文地址:https://www.cnblogs.com/luckyXcc/p/9836551.html
Copyright © 2011-2022 走看看