zoukankan      html  css  js  c++  java
  • 细化webpack的resolve配置项

    当我们使用webpack进行构建前端项目的时候,会从配置的入口模块处出发找出所有依赖的模块,Resolve配置Webpack如何去找出模块所对应的文件。

    由于Webpack 内置了 JavaScript 模块化语法解析功能,默认会采用模块化标准里约定好的规则去寻找,但你也可以通过Resolve字段根据自己的需要修改默认的规则。

    // webpack.config.js
    module.exports = {
      //...
      resolve: {
        // configuration options
      }
    };
    

    resolve.alias

    作用:通过别名来把原导入路径映射成一个新的导入路径,例如:

    // webpack.config.js
    module.exports = {
      //...
      resolve: {
        alias: {
          '@Components': path.resolve(__dirname, 'src/components/'),
          '@Utils': path.resolve(__dirname, 'src/utils/')
        }
      }
    };
    

    先看下,我们传统模式导入一个组件是这样的:

    import Button from '../../../componets/button'
    

    现在,我们就可以这么使用别名了:

    import Button from '@Components/button'
    

    当然,我们还可以给定对象键后末尾添加$进行精确匹配

    // webpack.config.js
    module.exports = {
      //...
      resolve: {
        alias: {
          xyz$: path.resolve(__dirname, 'path/to/file.js')
        }
      }
    };
    
    
    import Test1 from 'xyz'; // 精确匹配,所以 path/to/file.js 被解析和导入
    import Test2 from 'xyz/file.js'; // 非精确匹配,触发普通解析
    

    resolve.mainFields

    当从 npm 包中导入模块时(例如,import * as D3 from 'd3'),此选项将决定在 package.json 中使用哪个字段导入模块。根据 webpack 配置中指定的 target 不同,默认值也会有所不同。

    当 target 属性设置为 webworker, web 或者没有指定,默认值为:

    // webpack.config.js
    module.exports = {
      //...
      resolve: {
        mainFields: ['browser', 'module', 'main']
      }
    };
    

    对于其他任意的 target(包括 node),默认值为:

    // webpack.config.js
    module.exports = {
      //...
      resolve: {
        mainFields: ['module', 'main']
      }
    };
    

    例如,考虑任意一个名为 upstream 的 library,其 package.json 包含以下字段:

    {
      "browser": "build/upstream.js",
      "module": "index"
    }
    

    在我们 import * as Upstream from 'upstream' 时,这实际上会从 browser 属性解析文件。在这里 browser 属性是最优先选择的,因为它是 mainFields 的第一项。同时,由 webpack 打包的 Node.js 应用程序首先会尝试从 module 字段中解析文件。

    resolve.extensions

    自动解析确定的扩展。默认值为:

    // webpack.config.js
    module.exports = {
      //...
      resolve: {
        extensions: ['.wasm', '.mjs', '.js', '.json']
      }
    };
    

    能够使用户在引入模块时不带扩展:

    import File from '../path/to/file';
    

    resolve.modules

    告诉 webpack 解析模块时应该搜索的目录。

    绝对路径和相对路径都能使用,但是要知道它们之间有一点差异。

    通过查看当前目录以及祖先路径(即 ./node_modules, ../node_modules 等等),相对路径将类似于 Node 查找 'node_modules' 的方式进行查找。

    使用绝对路径,将只在给定目录中搜索。

    // webpack.config.js
    module.exports = {
      //...
      resolve: {
        modules: ['node_modules']
      }
    };
    

    如果你想要添加一个目录到模块搜索目录,此目录优先于 node_modules/ 搜索:

    // webpack.config.js
    module.exports = {
      //...
      resolve: {
        modules: [path.resolve(__dirname, 'src'), 'node_modules']
      }
    };
    

    上述配置会导致webpack在查找模块时候,先去src目录下找,如果没有找到会去node_modules下查找

    resolve.descriptionFiles

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

    descriptionFiles: ['package.json']
    enforceExtension
    

    resolve.enforceExtension

    如果配置为 true 所有导入语句都必须要带文件后缀, 例如开启前 import './foo' 能正常工作,开启后就必须写成 import './foo.js'

    resolve.enforceModuleExtension

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

    更多关于resolve配置项

    可自行查阅官方文档

  • 相关阅读:
    产品经理的十宗罪,你犯了几宗?
    产品经理的10大顾虑
    【FastAPI 学习 七】GET和POST请求参数接收以及验证
    【FastAPI 学习 六】异常处理
    【FastAPI 学习 五】统一响应json数据格式
    前端展示(三)
    前端展示(二)
    前端设计(一)
    后端流程分析
    生成词云图
  • 原文地址:https://www.cnblogs.com/fe-linjin/p/12245794.html
Copyright © 2011-2022 走看看