Webpack 每个输入模块的网页包解析别名规则
这里有一个很长的。尽管我对答案或解决方案没有太多期望(或任何期望),但我仍然觉得分享/发泄是一个有趣的问题 我所拥有的 我有一个有2个入口点的应用程序。它们都导入相同的文件,Webpack 每个输入模块的网页包解析别名规则,webpack,Webpack,这里有一个很长的。尽管我对答案或解决方案没有太多期望(或任何期望),但我仍然觉得分享/发泄是一个有趣的问题 我所拥有的 我有一个有2个入口点的应用程序。它们都导入相同的文件,main.ts,该文件依次导入把手模板main.hbs: entry1.ts └ main.ts ├ main.hbs └ … entry2.ts └ main.ts ├ main.hbs └ … main.ts还导入其他ts类(数千个),这些ts类导入其他HBS模板(数百个),但几乎所有这些都在两个条目之
main.ts
,该文件依次导入把手模板main.hbs
:
entry1.ts
└ main.ts
├ main.hbs
└ …
entry2.ts
└ main.ts
├ main.hbs
└ …
main.ts
还导入其他ts类(数千个),这些ts类导入其他HBS模板(数百个),但几乎所有这些都在两个条目之间共享。这些条目只是通过一些特定于条目的选项从Main.ts
调用主类
我需要什么
我被要求为HBS模板创建一个特定于条目的“变体”,以便entry1
将加载main.v1.HBS
,entry2
将加载main.v2.HBS
,如果存在这样的文件。如果任何其他导入的.ts
文件导入任何其他.hbs
文件,它们还将返回相应的*.v1.hbs
/*.v2.hbs
变体
因为我希望它尽可能自动化,并且对实际源代码的更改尽可能少,所以我决定采用Webpack“重定向”导入:
importsentry1.ts
importsmain.ts
实际加载的main.hbs
main.v1.hbs
- 该
导入实际加载main.ts
menu.v1.hbs的
menu.ts
- 等等
- 该
importsentry2.ts
importsmain.ts
实际加载的main.hbs
main.v2.hbs
- 该
导入实际加载main.ts
menu.v2.hbs的
menu.ts
- 等等
- 该
- 这将增加编译时间和复杂性
- 如果不能正确地进行树抖动,并且必须将所有变量存储在一个包中,这样我才能在运行时访问正确的变量,那么可以大大增加包的大小(eww)
- 我这个整洁的怪胎不太热衷于处理更多的东西,只是为了把它们扔掉
- 该方法似乎只适用于
语法,而不适用于ES样式的静态require()
——因此不支持向前兼容import
require
调用,并将它们更改为其他模块,它甚至还支持正则表达式和谓词函数。但是,我很快就放弃了这一点,因为映射在编译期间无法更改。这意味着我不能对每个条目有不同的替换规则
现在我们深陷战壕。我想,为什么不写我自己的加载器来解决这个问题呢?读取其根条目的加载程序,因此理论上我应该能够使用该信息,而不是main.hbs
为entry1
加载main.v1.hbs
,为entry2
加载main.v2.hbs
虽然最初这似乎是可行的(尽管我讨厌这种方法的非无状态性),但我发现Webpack似乎在第一次缓存require/resolution th1e时:在处理main.ts
时。因此,即使使用我所有的逻辑,我的加载程序在每个文件中只调用一次,而不是在每个require
中调用一次,我也无法实现我想要的
我研究了告诉Webpack“不要缓存这个,下次再读一遍”的方法,我没有运气。由于两个条目只导入一次main.ts
,而导入main.hbs
,因此Webpack将ts和hbs分别视为一个模块,而不管它们是否导入到多个条目文件中。我想这是一个必须的优化,但我没有找到我的出路,为这个具体的情况
由于加载程序无法满足我的需要,我尝试编写一个插件。我浏览了详细的文档,并尝试连接到编译器
和编译
,但没有走得太远。我浏览了NormalModuleReplacementPlugin
,并以同样的方式连接到NormalModuleFactory
(文档似乎没有涵盖它)。最终,我或多或少地在插件系统中重新实现了我以前尝试的加载程序的功能,方法是更改对适当资源的请求,以包含每个条目的“变体”——这正是我所需要的。然而,遗憾的是,我遇到了与加载程序相同的障碍——文件(和我的代码)只被访问一次。