Angular13+移除deployUrl致混合Angular/AngularJS应用故障求方案
2023年7月6日更新:我确定问题源于应用的混合架构,而非仅Angular升级。
我有一个混合Angular/AngularJS应用,所有客户端文件构建至/client/目录,该目录外的请求由后端处理。此前通过配置deployUrl='/client/'为所有资源请求添加对应前缀。
升级Angular后,deployUrl已被废弃/移除,我正尝试找到替代方案以维持原有功能。按照官方建议在angular.json中设置baseHref='/client/'后,资源请求可正常工作,但AngularJS部分出现故障:当AngularJS的$location解析初始URL(如https://example.com/home)时,抛出错误:
Error: [$location:ipthprfx] Invalid url "https://example.com/home", missing path prefix "https://example.com/client/".
显然AngularJS无法适配baseHref,而此前使用deployUrl时无需设置baseHref,不存在此问题。现在无法使用deployUrl,设置baseHref又导致AngularJS异常,恳请提供能让Angular与AngularJS部分同时正常运行的配置方案(我们正逐步移除AngularJS代码,但仍有大量遗留)。
可行解决方案
方案1:临时保留--deploy-url参数(过渡用)
虽然Angular官方标记deployUrl为废弃,但在部分新版本中仍可通过命令行参数临时使用,直到完成AngularJS代码的迁移:
ng build --deploy-url /client/
此方式无需设置baseHref,能维持原有资源路径前缀逻辑,同时避免AngularJS的路径检查错误。
方案2:调整AngularJS的$location配置
修改AngularJS模块的$locationProvider配置,关闭路径前缀强制检查,让它兼容不带/client/的URL:
angular.module('yourAngularJSApp', []) .config(['$locationProvider', function($locationProvider) { $locationProvider.html5Mode({ enabled: true, requireBase: false // 关闭base href强制检查 }); }]);
同时保持Angular的baseHref='/client/'配置,这样Angular资源路径正常,AngularJS也不会再抛出路径前缀错误。
方案3:后端资源路由转发
如果后端可控,可通过配置将所有前端资源请求转发到/client/目录,这样Angular无需设置任何路径前缀参数:
以Nginx为例,添加如下配置:
# 匹配所有静态资源请求,转发到client目录 location ~* \.(js|css|png|jpg|svg|woff2)$ { root /path/to/your/application/client; }
此方案下,Angular构建时无需设置baseHref或deployUrl,资源请求会被后端自动导向/client/目录,AngularJS部分也能正常解析原始URL。
内容的提问来源于stack exchange,提问作者DavidA

