我想构建一个Angular 5应用程序,然后将其发布到不同的地址,例如:
默认情况下,Angular会假设所有文件都在/中托管,当我访问index.html时,它会加载https://sub1.example.com/vendor.bundle.js这样的脚本,因为它会部署到/ myapp1 / vendor .bundle.js(为了使它稍微复杂一些,我实际上从一个单独的域中加载来自CDN的文件,但我认为这不会影响这个问题):
Angular 5允许我运行:
ng build --deploy-url "https://example.com/myapp1"
这将修改inline.bundle.js并设置以下内容:
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "https://example.com/myapp1";
这反过来将确保从正确的路径加载脚本。
但是,这是一个编译时开关,我想在部署时或运行时配置它。
我已阅读各种建议,例如:
我目前的解决方法是在部署时更新变量__webpack_require __。p,但这极易出错,因为此时此变量被最小化为类似" n.p"并依赖内部实施细节。
这样做的正确方法是什么?
答案 0 :(得分:5)
在.angular-cli.json中设置deployUrl设置,或者将--deploy-url传递给build命令可以做两件事。它确保index.html文件中的脚本包含使用它作为基础,并设置一个变量,确保webpack将其添加为任何延迟加载模块的“基本路径”。我想我们同意这一点,并确定在html中加载脚本的位置非常简单。但是,设置webpack应该使用的路径有点棘手...... webpack使用的值未命名为 __ webpack_public_path __ ,如链接建议和文档中所述。
当您说设置--deploy-url导致以下
时,您甚至会自己提及解决方案__webpack_require__.p = "https://example.com/myapp1";
因此,如文档中所述,不必在运行时设置 __ webpack_public_path __ ,而是必须设置 __ webpack_require __。p 属性。
最简单的方法是在 app.module.ts 文件中设置它。做这样的事情应该适用于你的场景
<script>
window.config = { basePath: 'https://sub1.example.com/myapp1' }
</script>`
// imports etc...
declare var __webpack_require__: any;
declare var config;
__webpack_require__.p = window.config.basePath;
@NgModule({})
...
这将确保 __ webpack_require __。p 属性在加载时设置为配置的值。
在这种情况下,我只是将配置的值作为配置变量添加到窗口对象上,但您可以从任何地方获取它。为了简单起见,我只是假设值始终存在...如果配置对象不可用,或者未设置basePath属性,您可能希望有一个回退。