node.js - 在编译时将基于包名称的变量传递给 webpack 源
问题描述
我有一个场景,其中多个捆绑包具有相同的入口点,称为index.js
env
然后,我在该文件中通过查看变量对各个子模块进行动态导入:
await import("api/" + process.env.API")
这样做的问题是 webpack 将捆绑所有文件,api/
因为它在编译时不知道该动态值是什么。
的值process.env.API
实际上与捆绑包的名称相同。所以我尝试使用 webpack 的神奇评论功能来让它工作:
await import(
/* webpackInclude: [name] */
"api/" + process.env.API")
但根据文档,占位符仅用于块名称,而不用于包含/排除功能。
我也尝试过使用带有回调的上下文替换插件,但上下文回调不包含有关捆绑名称的信息。
是否有可能以某种方式定义插件或配置一个值,该值将在编译时解析为包名称?
解决方案
如果您使用的是 dynamicImport 语法,您通常会生成单独的块。据我了解您的问题,您想根据动态路径变量命名这些块吗?
一种方法是
import(/* webpackChunkName: "[request]" */ 'api/${process.env.API')
编辑
动态块名称似乎是在运行时生成的(至少我是这样向自己解释的),这就是环境变量可能不可用的原因。将 .env 变量保存在 JS 变量中并像这样加载动态导入:
const api = process.env.API;
const module = await import(/* webpackChunkName: "[request]" */ 'api/${api}');
这将正确输出仅包含与路径对应的模块的名称块。
编辑 2(来自 OP)
当使用错误的插件导致 webpack 将import
statments 转换为require
. 使用解决:
@babel/plugin-syntax-dynamic-import
推荐阅读
- html - 自动调整 IFrame 大小
- c++ - 如何使用 ParseDelimitedFromCodedStream 处理协议缓冲区 ZeroCopyInputStream EOF
- java - PDFBox拆分单个PDF的多线程范围页面
- notepad++ - 使用记事本++交换某些字符的大小写
- sql-server - 获取 SQL 表的扩展属性
- javascript - 用反应检测广告拦截
- python - 在列表列表中获取对
- apache-spark - Spark:AttributeError:“SQLContext”对象没有属性“createDataFrame”
- python - Python中的循环可视化与堆积范围
- html - 我正在尝试使用 ngFor 在引导选项卡上循环,