Javascript 检查模块是否已加载到网页包中?

Javascript 检查模块是否已加载到网页包中?,javascript,webpack,require,Javascript,Webpack,Require,我在一家拥有定制JS模块绑定器的公司工作。该实现有一个函数requireIfLoaded,允许您需要一个模块,但前提是该模块已经加载。如果模块尚未加载,它将抛出一个错误。使用requireIfLoaded不会捆绑模块。这大大减少了我们的文件大小 下面是一个关于它如何有用的示例: if (page === PROFILE) { // ProfileHelper should already be downloaded if we're on the profile page. const

我在一家拥有定制JS模块绑定器的公司工作。该实现有一个函数
requireIfLoaded
,允许您需要一个模块,但前提是该模块已经加载。如果模块尚未加载,它将抛出一个错误。使用
requireIfLoaded
不会捆绑模块。这大大减少了我们的文件大小

下面是一个关于它如何有用的示例:

if (page === PROFILE) {
  // ProfileHelper should already be downloaded if we're on the profile page.
  const ProfileHelper = requireIfLoaded('ProfileHelper');
  ProfileHelper.doSomething();
} else if (page === FEED) {
  // FeedHelper should already be downloaded if we're on the feed page.
  const FeedHelper = requireIfLoaded('FeedHelper');
  FeedHelper.doSomething();
}
为概要文件页面和提要页面生成一个单独的包
require('ProfileHelper')
未在提要页面的代码路径中调用,因此
ProfileHelper
未包含在提要包中
require('FeedHelper')
未在配置文件页面codepath中调用,因此
FeedHelper
未包含在配置文件包中。网页包有这样的东西吗

编辑澄清:

如果我一直都需要
ProfileHelper
FeedHelper
,那么其中一个模块将不使用。在任何给定页面上最多加载一个。在配置文件页面上,加载了
ProfileHelper
,但没有加载
FeedHelper
。对于提要页面,反之亦然


另外,我不想使用
require。请确保
,因为它是异步的。

Webpack将多次删除所需的所有模块,并且已加载的模块将不会再次初始化(遵循CommonJS规范)。所以,基本上,只要直接要求所有依赖项,就可以了


更重要的是:如果你使用webpack,不要包装你的需求。确定您实际使用的模块的静态分析将停止准确工作,webpack将绑定过多。

此方法与webpack绑定相反

require语句正是指导webpack编译什么的东西。它永远不会编译您的条件要求,因为这些条件要求将在运行时进行计算(但webpack捆绑包是预编译的),webpack不会将任何条件要求添加到您的捆绑包中

您需要的是代码拆分:

教程:


从您的问题和评论来看,
ProfileHelper
似乎是通过一个单独的
标记加载的,并且可以在
窗口下立即使用,无需进一步异步加载

此外,此帮助程序似乎不由
requireIfLoaded
管理,如果尚未加载,则将抛出

因此,在这些假设下,
requireIfLoaded
的作用只是检查模块在
窗口下是否可用,如果不可用则抛出错误

所以。。。为什么不创建自己的
requireIfLoaded

所需的函数(文件){
设m=窗口[文件];
如果(m){
返回m;
}否则{
抛出新错误(`找不到模块'${file}``)
}
}

我遗漏了什么吗?

我找到了一份说明这一点的文档。上面说 “尽管有各种加载JavaScript的选项,但仍然无法下载JavaScript文件并将其设置为在任意时间执行。可以说立即执行,也可以等到DOM文档完成后再执行,但不能指定任何其他时间点来执行代码。”


有关更多信息

如果您的问题是:网页是否消除了所需模块的重复?是的。我的问题是,只有在已经下载的情况下,我才需要什么。也许你真正需要的是代码拆分<代码>需要。确保
始终需要模块,我只想在文件已下载的情况下才需要该文件。此外,
需要。确保
是异步的。我想同步检查给定的模块是否已经是必需的。@LeoJiang,您只需调用
require即可。当您实际需要某个模块时,确保该模块的
(异步),并将逻辑更改为始终以异步方式工作。没有受支持的方法检查模块是否已加载。我也不太明白你的用例。如果ProfileHelper尚未加载,但您到达了profile页面,您是否会出错?为什么不在您到达配置文件页面时异步获取ProfileHelper?因为v2的网页包也将只包括所使用的依赖项。因此,在捆绑过程中,您可以随意使用required,它只会包含一次。请澄清,这与重复数据消除无关。@MichałIgnaszewski所有依赖项都会使用,但不会一直使用。也就是说,整个文件加载到多个页面上,但这些页面并不使用所有的代码路径。这些依赖关系是针对某些代码路径的。我所在的公司为不同的页面生成了许多不同的包。大多数模块不必检查它在哪个包中是必需的,它们只需检查哪些模块已经是必需的。代码拆分增加了网络请求,我想要的不需要额外的网络请求。