是否可以在 Webpack 的编译时解析导入的模块路径?

Posted

技术标签:

【中文标题】是否可以在 Webpack 的编译时解析导入的模块路径?【英文标题】:Is it possible to resolve imported module path at compile time in Webpack? 【发布时间】:2021-09-27 22:32:20 【问题描述】:

我想创建一个基于 env 变量的构建,它只包含捆绑包中的特定组件。

例如当我像这样导入组件时:

import Module1 from '@/components/Module1'

我希望实际转换路径,以便导入看起来像这样:

import Module1 from '@/components/brands/' + process.env.APP_BRAND + 'Module1'

现在我不想对所有导入执行此操作,只是针对某些导入(例如具有品牌版本的模块),所以也许我想在导入路径前加上 !brand! 之类的前缀,这将是指示符应用路径变换。 所以上面的逻辑应该只对导入路径执行,例如:

import Module1 from '!brand!@/components/Module1'

如果 process.env.APP_BRAND 是假的,那么我只想坚持原来的导入(例如,只需从路径中删除 !brand! 前缀)。

所以重要的方面是我希望在构建时完成此操作,以便 Webpack 可以静态分析模块并创建优化的构建。这可能吗?我想我需要以某种方式添加这个路径转换逻辑,但我应该怎么做呢?我应该创建一个加载器、插件还是有现有的解决方案?

我正在使用 Webpack 5。

【问题讨论】:

【参考方案1】:

Webpack 提供了一个模块 resolve 功能,您可以在这里使用。阅读docs here。例如,在您的情况下,您可以这样做:

const path = require('path');

module.exports = 
  resolve: 
    alias: 
      '@/components/Module1': path.join(
        __dirname,
        process.env.APP_BRAND
          ? '@/components/brands/' + process.env.APP_BRAND + 'Module1'
          : '@/components/Module1')
    
  ,
;

请注意,在这里您需要将环境变量传递给您的 Webpack 进程(也称为 Node.js 进程)并做出相应的决定。此外,您的解析模块必须是绝对路径

【讨论】:

以上是关于是否可以在 Webpack 的编译时解析导入的模块路径?的主要内容,如果未能解决你的问题,请参考以下文章

vuejs:vue-cli webpack模板无法解析sass导入

webpack中的eslint导入:无法解析模块的路径

使用 wasm 将模块导入并编译到 webpack 中

是否可以使用webpack单独导入捆绑的webpack和库?

当我使用 webpack 和 ts-loader 构建项目时,Typescript 环境模块未解析

是否可以将模块导入 Polymer 组件?