angular - 如何测试部署在云上的 Angular SPA
问题描述
我正在尝试通过将多个 Angular 应用程序组合在一起来使用 Angular 中的单页应用程序创建一个应用程序。我在 IBM 云上部署了一个应用程序,并希望从我本地运行的容器应用程序中对其进行测试。我无法这样做,在控制台中出现错误:
CORS 策略已阻止从源“http://localhost:4200”访问“https://srt-onenet.dal1a.ciocloud.nonprod.intranet.ibm.com/main.js”处的脚本:没有“访问权限” -Control-Allow-Origin' 标头存在于请求的资源上。
我认为 main.js 文件在我部署时没有生成。有人可以帮忙吗,我对此很陌生,角度 SPA 的资源并不多。
Docker File
# ----- BUILD -----
# Base image used for build node js apps
FROM node:12.2.0-alpine AS build
# Set our working directory
WORKDIR /app
# Copy package manifest (we do this in order to cache dependencies)
COPY ./package.json .
# Install dependencies
RUN npm i
RUN npm install -g @angular/cli@8.3.26
# Copy our application files
COPY . .
# Build a static version of our angular app
RUN ng build --prod --aot --vendor-chunk --common-chunk --delete-output-path
# ----- SERVE -----
# We'll use an nginx base to host our built static assets
FROM nginx
# Copy our minimal custom configuration
#COPY nginx.conf /etc/nginx/nginx.conf
# Copy our static assets from our build container
COPY --from=build /app/dist/app1 /usr/share/nginx/html
# support running as arbitrary user which belogs to the root group
RUN chmod g+rwx /var/cache/nginx /var/run /var/log/nginx
# 80 is a priviliged port
# users are not allowed to listen on priviliged ports
RUN sed -i.bak 's/listen\(.*\)80;/listen 8080;/' /etc/nginx/conf.d/default.conf
EXPOSE 8080
# remove the user directive
# comment user directive as master process is run as user in OpenShift anyhow
RUN sed -i.bak 's/^user/#user/' /etc/nginx/nginx.conf
#EXPOSE 8081
CMD ["nginx", "-g", "daemon off;"]
Index.html of container app
<html>
<head>
<meta http-equiv="Content-Security-Policy"
content="default-src * data: blob: 'unsafe-inline' 'unsafe-eval'; script-src * 'unsafe-inline' 'unsafe-eval'; connect-src * 'unsafe-inline'; img-src * data: blob: 'unsafe-inline'; frame-src *; style-src * data: blob: 'unsafe-inline'; font-src * data: blob: 'unsafe-inline';">
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Container application</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="importmap-type" content="systemjs-importmap">
<script type="systemjs-importmap">
{
"imports": {
"app1": "https://srt-onenet.dal1a.ciocloud.nonprod.intranet.ibm.com/main.js"
"single-spa": "https://cdnjs.cloudflare.com/ajax/libs/single-spa/5.5.0/system/single-spa.min.js",
"single-spa-layout": "https://unpkg.com/single-spa-layout@1.0.0-beta.2/dist/system/single-spa-layout.min.js"
}
}
</script>
<link rel="preload" href="https://cdnjs.cloudflare.com/ajax/libs/single-spa/5.5.0/system/single-spa.min.js"
as="script" crossorigin="anonymous" />
<script src='https://unpkg.com/core-js-bundle@3.1.4/minified.js'></script>
<script src="https://unpkg.com/zone.js@0.10.3/dist/zone.js"></script>
<script src="https://unpkg.com/import-map-overrides@1.15.1/dist/import-map-overrides.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/4.0.0/system.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/4.0.0/extras/amd.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/4.0.0/extras/named-exports.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/4.0.0/extras/named-register.min.js"></script>
<template id="single-spa-layout">
<single-spa-router>
<nav class="topnav">
<application name="nav-bar"></application>
</nav>
<div class="main-content">
<route path="app1">
<application name="app1"></application>
</route>
<route path="app2">
<application name="app2"></application>
</route>
<route path="nsrt-app">
<application name="nsrt-app"></application>
</route>
<route path="sldb-app">
<application name="sldb-app"></application>
</route>
</div>
</single-spa-router>
</template>
</head>
<body>
<script>
Promise.all([System.import('single-spa'), System.import('single-spa-layout')]).then(([singleSpa, singleSpaLayout]) => {
const { constructApplications, constructLayoutEngine, constructRoutes } = singleSpaLayout;
const { registerApplication, start } = singleSpa;
const routes = constructRoutes(document.querySelector('#single-spa-layout'));
const applications = constructApplications({
routes,
loadApp({ name }) {
return System.import(name);
},
});
const layoutEngine = constructLayoutEngine({ routes, applications });
applications.forEach(registerApplication);
start();
});
</script>
<import-map-overrides-full></import-map-overrides-full>
</body>
</html>
解决方案
推荐阅读
- python - Python/Plotly:如何使散点图上的每个数据点代表中值?
- apache-spark - 将 MySQL 语句创建为 Spark SQL 语句
- scala - Scala 生成参数化案例类的任意实例
- c# - 如何从 linux/mac os 支持的 3rd 方代码为我的 c# 项目制作 dll?
- mediawiki - 按组成员身份限制 $wgWhitelistRead 可能吗?
- azure - 如何在 Azure Devops 中设置控制台输出的编码?
- scala - 包含保留关键字的 JSON 的反序列化
- ruby - 如何将上下文传递给 C/C++ 中定义的 Ruby 方法
- git - 关于在 PR 审核后工作流程如何进行更改以及 git rebase 的问题
- c# - 肥皂错误:序言中不允许内容