Webpack 别名使我的代码保持健全

2025-06-09

Webpack 别名使我的代码保持健全

引用错误会让开发人员看起来很糟糕

如果你问我在基础 Web 开发中最常见的错误是什么,我会毫不犹豫地告诉你,引用错误是其中最严重的错误之一。无论是变量还是包导入,我都遇到过很多问题,也帮助过其他经常犯这类错误的开发者。特别是对于包导入,我希望每次重构和改进文件时,都不必再更改所有路径位置。

通过下面的一些示例代码,您可能熟悉它的样子。

    import { UserCard } from '../../../components';

    import { apiServices, themeServices } from '../../../services';

    import { objUtil, dateUtil } from '../../../utils';
Enter fullscreen mode Exit fullscreen mode

当你移动文件或批量更新应用中的引用时会发生什么?你必须费力地检查每个引用是否正确。接下来,你还必须确认,如果编译器配置错误,无法识别错误,你的页面不会崩溃或运行。更糟糕的是……你意外地引用了另一个具有相同导出名称的文件。结果,你直到代码发布到生产环境才注意到,而现在客户打电话来抱怨功能停止运行了。

别名来救援

Webpack 通过提供“别名”功能解决了这些问题。别名是一种让 Webpack 知道在哪里找到代码的方法,它通过提供一个单词或字符来表示代码所在位置的部分引用。一旦 Webpack 知道了这一点,就可以在开发过程中编译代码或构建最终包时正确地解析代码。这不仅对 JavaScript 和 TypeScript 有用,对 CSS 也同样有用。

为了将此功能添加到我们的代码中,我们需要首先在 webpack 中设置“resolve”。您的代码最终可能看起来类似于以下内容:

    const path = require('path');

    module.exports = {
      //...
      resolve: {
        extensions: ['js', 'jsx', 'ts', 'tsx'],
        alias: {
          '@': path.resolve(__dirname, 'src'),
          '@components': path.resolve(__dirname, 'src/components'),
          '@utilities': path.resolve(__dirname, 'src/utilities')
        }
      }
      //...
    };
Enter fullscreen mode Exit fullscreen mode

只要有实际用例,你可以使用任意数量的别名。总的来说,只使用“@”字符作为别名来引用“src”文件夹非常容易,但你可以为任何你想要的别名路径创建任何名称。一旦我们将 webpack 配置修改为类似于上面的代码,我们之前的导入现在看起来可能类似于这样:

    import { UserCard } from '@/components';

    import { apiServices, themeServices } from '@/services';

    import { objUtil, dateUtil } from '@/utils';
Enter fullscreen mode Exit fullscreen mode

好多了!现在,当你重构代码时,你将始终引用你想要的包。

使用 Babel 和 TypeScript

如果您结合使用 Babel、ESLint 或 TypeScript 中的 webpack 来解析代码,则可能需要更新它们的配置文件。这些文件可能是:.babelrc、.babel.json、.eslintrc.js、tsconfig.json、config.ts 等,具体取决于您的设置方式。在解析别名时,您可能需要在这些文件中进行一些修改,而不是使用 webpack.config.js。

巴别塔

    // .babelrc
    // npm i babel-plugin-module-resolver -D

    {
      "plugins": [
        "module-resolver",
        {
          root: ["./src"],
          alias: {
            @: "./src",
          }
        }
      ]
    }
Enter fullscreen mode Exit fullscreen mode

ESLint

    // .eslintrc.js
    // npm i eslint-import-resolver-alias -D

    const path = require('path');

    module.exports = {
      //...
      settings: {
        'import/resolver': {
          alias: {
            map: [['@', path.resolve(__dirname, 'src')]],
          },
        },
      },
    };
Enter fullscreen mode Exit fullscreen mode

TypeScript

    // tsconfig.json
    // npm i tsconfig-paths-webpack-plugin -D

    {
      //...
      "compilerOptions": {
        "baseUrl": "src",
        "paths": {
          "@/*": ["*"]
        }
      }
    }
Enter fullscreen mode Exit fullscreen mode

如果您不想在 TypeScript 和 Webpack 中解析别名,这里有一个示例,我们同时使用 TypeScript 和 Webpack 配置文件,但使用包安装,将别名保留在 tsconfig.json 中。另请注意,如果您使用 Webpack 并在 Webpack 中定义别名,通常只需要在 .babelrc 文件中配置别名。以下示例中将别名移到 TypeScript 和 Babel 配置文件中的总体目标是保持代码的 DRY 原则并集中在一个位置。这样可以避免更新一个配置后意外忘记在其他位置更新。

    // webpack.config.js
    // npm i tsconfig-paths-webpack-plugin -D

    const path = require('path');
    const TsconfigPathsPlugin = require('tsconfig-paths-webpack-plugin')

    module.exports = { 
      //... 
      resolve: {
        extensions: ['js', 'jsx', 'ts', 'tsx'],
        plugins: [
          new TsconfigPathsPlugin()
        ],
      } 
    };
Enter fullscreen mode Exit fullscreen mode

将此代码与您的 TypeScript“tsconfig.json”别名设置结合起来,您就可以开始了!

概括

使用别名来接管变量和文件导入的主要引用,会让开发者看起来更优秀。你的代码会更简洁,文件重构和合并时出错的可能性也会大大降低。自从我发现了别名之后,我确保几乎每个我负责的项目都使用了别名。我也鼓励你在将代码发布到任何地方之前,考虑一下别名是否适合你,这样可以避免再出现需要处理或担心的 bug。


如果您觉得本文有帮助或有用,请分享💓、🦄或🔖。谢谢!

鏂囩珷鏉ユ簮锛�https://dev.to/mmcshinsky/webpack-aliases-keep-my-code-sane-3c3e
PREV
像我五岁一样解释容器
NEXT
每个开发人员都应该知道的十大 Web 可访问性标准