如何正确启动 Angular Universal 到实时服务器

Posted

技术标签:

【中文标题】如何正确启动 Angular Universal 到实时服务器【英文标题】:How to properly launch Angular Universal to live server 【发布时间】:2018-04-17 15:19:31 【问题描述】:

我通过修改此处找到的通用启动器种子来设置和工作我的网站:https://github.com/angular/universal-starter 并且我的网站在 localhost 节点服务器上工作(呈现 html),现在我安装了 SSH 连接和节点,现在我在这里:

我不确定我将 /dist 文件等放在哪里,然后启动 nodejs 服务器。

此处显示已安装的 NodeJS/npm:

【问题讨论】:

【参考方案1】:

编辑(21 年 3 月 23 日):使用 Universal 时需要注意的事项

您确实需要考虑专门为浏览器或服务器编写代码块。例如:

您可以使用外部 SAAS 解决方案(如 SharpSpring 或 Google Tag Manager)来帮助您的团队跟踪潜在客户并生成自动工作流。

其中一些服务要求您将对象写入窗口或文档对象。因为您的服务器没有运行 javascript,所以当在服务器上运行您的应用程序时,无法让这些对象表现得像本机那样。你将需要真正搞砸这些事情。 我发现一篇非常有用的文章是this demo of real app problems using Angular Universal。

您还需要动态地将导入的脚本添加到您的 index.html 标头中。我在几个不同的地方看到过同样的概念,但here 也是一个。可能有一个堆栈溢出答案具有相同的想法。

但是,在某些情况下,您将需要使用库或其他东西(如 Postscribe)将脚本动态添加到您的一个 html 模板文件中的单个组件。 Postscribe 通过允许我们在其中一个组件的表单前动态导入特定脚本,极大地帮助了我们。我强烈推荐使用 Postscribe。

因此,长话短说,您需要确保您正在导入脚本并将它们附加到您的 index.html 文件中仅当您的应用程序在浏览器中运行时。对所有外部 JS 文件以及您正在导入应用程序并直接使用的所有外部 JS 文件执行此检查。首先将 PLATFORM_ID 注入到您需要进行此签入的任何组件中,然后以这种方式使用它

这适用于各种事物,如动画(可能正在监听窗口滚动事件)等。

原帖如下:

@Cacoon 我希望这就是你所做的。

第一部分是 m98 在this Github issue 上的现有答案。为了清楚起见,只是在这里发布

    构建您的应用程序:npm run build:s-s-r 将 dist 移到您的服务器上 安装PM2npm install pm2 -g 在您的服务器上,使用 PM2 运行服务器捆绑的应用程序pm2 start dist/server.js 如果您使用的是 nginx 或其他 Web 服务器,请确保将请求重定向到以 PM2 启动的应用正在侦听的端口。

更新(2020 年 2 月 7 日)

对于 Apache,请确保您的文档根目录被指定为您的 dist/browser 文件夹,例如

    DocumentRoot "$SRVROOT/htdocs/dist/browser"
    <Directory "$SRVROOT/htdocs/dist/browser">

然后在你的 httpd.conf 文件的底部试试这个:

<Location />
 RewriteEngine On
 # If an existing asset or directory is requested go to it as it is
 RewriteCond %DOCUMENT_ROOT%REQUEST_URI -f [OR]
 RewriteCond %DOCUMENT_ROOT%REQUEST_URI -d
 RewriteRule ^ - [L]

 RewriteRule ^ /index.html
</Location>

<VirtualHost *:80>
 ServerName localhost
 ServerAlias localhost
 ProxyPreserveHost On
 ProxyRequests Off
 ProxyPass / http://localhost:4000/
 ProxyPassReverse / http://localhost:4000/
</VirtualHost>

<VirtualHost *:443>
 ServerName localhost
 ServerAlias localhost
 ProxyPreserveHost On
 ProxyRequests Off
 ProxyPass / https://localhost:4000/
 ProxyPassReverse / https://localhost:4000/
</VirtualHost>

您必须在 httpd.conf 中设置虚拟主机,而不是在 .htaccess 文件中。您可以在 .htaccess 文件中将 Mod_rewrite 设置为与索引文件相同的级别,但不能在该级别设置虚拟主机。

另外,请确保启用代理模块,例如 httpd.conf 文件中的 mod_proxy_express

这是用于本地开发的。部署到产品时将 localhost 更改为您的域。

【讨论】:

听起来和我做的差不多,谢谢你发布这个!【参考方案2】:

这实际上比看起来更容易,我只需要使用 npm 安装 pm2,这样我就可以使 nodejs 进程保持不变,然后使用 .htaccess 文件中的 RewriteEngine 设置来渲染我的 Angular 通用应用程序(它是在子域文件夹中)并确保端口正确并且完美链接并在源中加载 html 以允许正确的 SEO 和索引

【讨论】:

嗨,Cacoon,你能用命令和步骤更多地解释你的答案吗?我不是服务器极客,并且与您的问题保持一致。 @VivekSinha 很抱歉回复太晚了,但是很高兴写下来,你能@我或在接下来的几天内再次回复吗?我很快就开始工作,记性不好 @Cacoon 我知道这是一个古老的 SO 问题,但如果您还记得,您能否在答案或评论中添加您的步骤?我也被困在这里了。 是的,我给自己一个提醒,今晚试着写下步骤

以上是关于如何正确启动 Angular Universal 到实时服务器的主要内容,如果未能解决你的问题,请参考以下文章

Angular 2 Universal 中的身份验证,nodejs

如何在 Angular 4 Universal 中发出 http post 请求?

当网站上的文档过时时如何安装 Angular2 Universal?

Angular Universal Render 等待 Http 结果 Observable 订阅者

使用 Angular Universal 进行服务器端渲染的防御性编程思路

如何在 Angular Universal 中检测屏幕分辨率?