如何使用亚马逊 s3 提供 Angular 2

Posted

技术标签:

【中文标题】如何使用亚马逊 s3 提供 Angular 2【英文标题】:How to serve angular 2 using amazon s3 【发布时间】:2016-11-20 20:29:13 【问题描述】:

是否可以在不使用专用服务器的情况下使用 amazon s3 来提供 angular 2 应用程序。如果是,如何进行?

【问题讨论】:

【参考方案1】:

不,在没有专用服务器的情况下,无法使用 amazon s3 运行 angular2。根据Angular2 Docs,您至少需要很少的服务器来运行这些文件。您可以做的是在 E3 或 ESB 上运行 NodeJs 服务器,并在那里部署您的 angular2 应用程序。

感谢@Gunter 指出 - 如果没有额外的命令行参数,这是无法完成的。

【讨论】:

难道angular2是用JS而不是typescript写的,这样就不需要反编译了。 S3 “至少是一个小服务器”。由于浏览器安全限制(至少没有附加命令行参数),您不能做的是从本地磁盘的file:///... url 加载它。您可能需要启用HashLocationStrategy,因为默认的PathLocationStrategy 需要服务器支持。 感谢您的澄清@GünterZöchbauer 更正应该是“(至少没有out额外的命令行参数)。” 这个答案在早期阶段是有效的,但使用 aot 不再正确。【参考方案2】:

这是可能的。但是你应该使用webpack。

配置应用以使用 webpack 后,您可以 npm run build 并将处理后的文件上传到 S3 as a static website。

【讨论】:

已确认。我通过克隆this git repo、使用npm run build 并将/dist 的内容上传到已经设置好的aws s3 网站存储桶来快速启动并运行它。谢谢乔乔。 此外,您需要确保为 index.html 以外的 url(例如 example.com/items)寻址路由,因为这些需要重定向到 index.html 以允许 angular 路由他们 - 见***.com/questions/16267339/… npm run build 需要--prod 选项,您不应直接从 amazonS3 提供文件,因为它是存储服务而不是分发服务。 Webpack 与从 S3 提供站点无关。这只是一个构建步骤。您可以使用任何您喜欢的任务运行器。此外,当 URL 没有专门请求 index.html 时,您很快就会遇到问题。所有请求都需要重写以服务 index.html。查看@coorasse 的答案【参考方案3】:

是的,您可以将应用程序部署到 AmazonS3,但您不应该直接从 Amazon S3 提供它:S3 是一种存储服务,而不是一种分发服务。这就是您应该为您的 S3 存储桶创建 CloudFront 分配的原因。

步骤:

    使用npm run build --prod 构建您的应用程序(小心包含--prod 选项!)

    为您的 Amazon S3 存储桶创建 CloudFront 分配并将您的 Default Root Object 设置为 index.html

    如果您使用 url 重写而不是哈希策略(您的路径看起来像 http://yourwebsite/login 而不是 http://yourwebsite/#/login,请使用以下内容为您的 CloudFront 分配创建自定义错误响应:

    HTTP 错误代码:404

    错误缓存最小 TTL(秒):0

    自定义错误响应:是 响应页面路径:/index.html HTTP 响应代码:200

在将应用程序部署到 CloudFront 上的 Invalidate index.html 时还需要小心,否则旧版本会被缓存并提供给客户端。

请follow my guide for more details。

【讨论】:

这应该是公认的答案。它清楚地详细说明了添加重写规则的要求,以便为所有请求提供 index.html(S3 不这样做)并将 S3 区分为存储平台。

以上是关于如何使用亚马逊 s3 提供 Angular 2的主要内容,如果未能解决你的问题,请参考以下文章

将亚马逊 s3 与电子制造商的自动更新程序一起使用 [关闭]

如何使用 axios 将文件上传到亚马逊 s3 存储桶?

在 react-native 中将图像上传到亚马逊 s3

如何从亚马逊 s3 存储桶中删除文件?

如何使用 Codeigniter/PHP 将文件上传到亚马逊 S3?

如何从存储桶根重定向到 AWS S3 中的子目录?