【发布时间】:2019-10-12 06:20:10
【问题描述】:
我需要能够用一个非常简单的模块替换我的 Angular 应用程序中的一个相当大的模块,以使我的服务器端渲染构建负载(避免对一个过于丰富而无法在服务器上工作的组件的所有不必要的要求反正)。如果没有替换,代码将尝试加载window 或document。我可以简单地用null-loader 替换一些库,但在这种情况下,我需要通过修剪这个特定的 Angular 模块来切断整个依赖树。
尽管我尝试覆盖原始模块,Angular (@ngtools/webpack) 仍然以某种方式成功地为我希望修剪的组件生成 require 调用...
我试过了:
- 在编译器插件中使用
hostReplacementPaths参数
new AngularCompilerPlugin({
tsConfigPath: 'tsconfig.ssr.json',
entryModule: path.join(__dirname, 'src/js/landing/landing.server.module.ts#LandingServerModule'),
hostReplacementPaths: {
[path.resolve('./src/js/app/help.module.ts')]: path.resolve('./src/js/landing/server-mock.module.ts')
}
})
- 使用
NormalModuleReplacementPlugin
new NormalModuleReplacementPlugin(
/help\.module\./,
resource => {
resource.requestresource.request.replace('app/help.module.ts', 'landing/server-mock.module.ts')
},
),
file-replace-loader
{
test: /help\.module\.ts/,
loader: 'file-replace-loader',
options: {
condition: 'if-replacement-exists',
replacement: path.resolve('./src/js/landing/server-mock.module.ts'),
async: true,
}
},
我怀疑 Angular 编译器正在扫描文件以查找 webpack 之外的依赖项...
有什么想法可以在构建时用模拟模块覆盖单个 Angular 模块吗?
【问题讨论】:
标签: angular webpack angular-universal server-side-rendering