【webpack配置】resolve

2022/03/08 22:50:04

作用

设置模块如何被解析。

可配置项

type ResolveObject = {
  alias:
    | {
        // 定义别名
        [aliasName: string]: string, // key 为别名,value 为模块的绝对路径
      }
    | false, // alias 设置为 false 时 webpack 会忽略该模块。

  extensions: string[], // 如果有多个文件有相同的名字,但后缀名不同,webpack 会解析列在数组首位的后缀的文件 并跳过其余的后缀。默认['.js', '.json', '.wasm'],自定义时可以用 ... 访问默认拓展名,如: ['.ts', '...']。
  mainFiles: string[], // 解析目录时使用的文件名,默认 ['index']。
  enforceExtension: boolean, // 设置为 true 时引入文件必须带后缀名,默认为 false
  modules: string[], // 告诉 webpack 解析模块时应该搜索的目录。默认 node_modules,使用绝对路径,将只在给定目录中搜索。
  plugins: PluginObject[], // 要使用的额外解析插件列表。
  preferAbsolute: boolean, // 规定解析时首选的绝对路径为 resolve.roots。
  roots: string[], // 服务器相对url请求(以'/'开头)被解析的目录列表,默认为 context 配置选项。在非windows系统上,这些请求首先被解析为绝对路径。
  fallback: {
    [moduleName: string]: string, // 正常解析失败时,重定向模块请求
  },
};

alias

创建 import 或 require 的别名,来确保模块引入变得更简单。

给 alias 对象的 key 后面加上 $ 表示精准匹配。

将 alias 设置为 false 时 webpack 会忽略该模块。

const path = require("path");

module.exports = {
  resolve: {
    alias: {
      Utilities: path.resolve(__dirname, "src/utilities/"),
      xyz$: path.resolve(__dirname, "path/to/file.js"),
    },
  },
};

可以使用别名引入 Utilities 模块:

import Utility from "../../utilities/utility";
// 使用别名
import Utility from "Utilities/utility";

精准解析:

import Test1 from "xyz"; // 精确匹配,所以 path/to/file.js 被解析和导入
import Test2 from "xyz/file.js"; // 非精确匹配,触发普通解析

设置别名的一些情况:

alias:import 'xyz'import 'xyz/file.js'
{}/abc/node_modules/xyz/index.js/abc/node_modules/xyz/file.js
{ xyz: '/abc/path/to/file.js' }/abc/path/to/file.jserror
{ xyz$: '/abc/path/to/file.js' }/abc/path/to/file.js/abc/node_modules/xyz/file.js
{ xyz: './dir/file.js' }/abc/dir/file.jserror
{ xyz$: './dir/file.js' }/abc/dir/file.js/abc/node_modules/xyz/file.js
{ xyz: '/some/dir' }/some/dir/index.js/some/dir/file.js
{ xyz$: '/some/dir' }/some/dir/index.js/abc/node_modules/xyz/file.js
{ xyz: './dir' }/abc/dir/index.js/abc/dir/file.js
{ xyz: 'modu' }/abc/node_modules/modu/index.js/abc/node_modules/modu/file.js
{ xyz$: 'modu' }/abc/node_modules/modu/index.js/abc/node_modules/xyz/file.js
{ xyz: 'modu/some/file.js' }/abc/node_modules/modu/some/file.jserror
{ xyz: 'modu/dir' }/abc/node_modules/modu/dir/index.js/abc/node_modules/modu/dir/file.js
{ xyz$: 'modu/dir' }/abc/node_modules/modu/dir/index.js/abc/node_modules/xyz/file.js