最终编辑
tl;博士的解决方案是这是不可能的。尽管下面的最佳答案确实有一些很好的信息。
考虑下面的代码,来自contacts.js
. System.import
这是一个动态加载的模块,在代码中的其他地方按需加载。
如果SharedUtil1
也用于其他动态加载的模块,System.import
我将如何从所有这些模块中SharedUtility1
排除,并且仅在第一次需要时按需加载?
顶级的System.import
不起作用SharedUtil1
,因为我的导出依赖于它:导出只能放在模块代码的顶级,而不是任何类型的回调中。
这对 Webpack 可行吗?我正在使用 2.0.7 测试版。
import SharedUtil1 from '../../SharedUtilities/SharedUtility1';
class Contacts{
constructor(data){
this.data = data;
this.sharedUtil1 = new SharedUtil1();
}
}
export default Contacts;
更新 1
我认为捆绑加载器是我想要的,但不,它会将您导入的模块变成一个不同的函数,一旦异步加载完成,您就可以通过回调调用该函数以访问实际模块。这意味着您不能透明地使模块 X 异步加载而不对代码进行重大更改,更不用说您回到最初描述的问题,如果您的顶级模块依赖于 now-asynchronously加载的依赖项,没有办法导出它,因为导出必须在顶层。
Webpack 中是否没有办法表示依赖项 X 将按需加载(如果需要),并且有任何导入的模块将其导入以透明地等待导入过程?我认为这个用例对于任何远程大型应用程序来说都是必要的,所以我不得不认为我只是错过了一些东西。
更新 2
根据彼得的回答,我试图让重复数据删除工作,因为他提到的 commonChunk 插件涉及在端点之间共享代码,并且因为require.ensure
将加载的代码放入回调中,从而阻止您使用 ES6export
依赖它的任何代码。
至于重复数据删除,contacts.js
并且tasks.js
都像这样加载相同的 sharedUtil
import SharedUtil1 from '../../sharedUtilities/sharedUtility1';
我尝试将 webpack 运行为
webpack --optimize-dedupe
并且还通过添加
plugins: [
new webpack.optimize.DedupePlugin()
]
到 webpack.config。在这两种情况下,虽然 sharedUtil 代码仍然放置在联系人和任务包中。