【问题标题】:angular universal working successfully on localhost not on production server角度通用在本地主机上成功工作而不是在生产服务器上
【发布时间】:2018-06-23 00:17:06
【问题描述】:

angular 通用在 localhost 上成功运行,但是当使用 nginx 页面视图源部署到生产时仅显示静态内容,但相同的代码在 localhost 中运行。

我还通过禁用浏览器的 js 进行了测试,localhost 正在按预期运行,但是当再次部署到生产服务器时,只会呈现静态组件。

请帮忙。

// These are important and needed before anything else
import 'zone.js/dist/zone-node';
import 'reflect-metadata';

import { enableProdMode } from '@angular/core';

import * as express from 'express';
import { join } from 'path';

// Faster server renders w/ Prod mode (dev mode never needed)
enableProdMode();

// Express server
const app = express();

const PORT = process.env.PORT || 4000;
const DIST_FOLDER = join(process.cwd(), 'dist');

// * NOTE :: leave this as require() since this file is built Dynamically from webpack
const { AppServerModuleNgFactory, LAZY_MODULE_MAP } = require('./dist/server/main.bundle');

// Express Engine
import { ngExpressEngine } from '@nguniversal/express-engine';
// Import module map for lazy loading
import { provideModuleMap } from '@nguniversal/module-map-ngfactory-loader';

app.engine('html', ngExpressEngine({
  bootstrap: AppServerModuleNgFactory,
  providers: [
    provideModuleMap(LAZY_MODULE_MAP)
  ]
}));

app.set('view engine', 'html');
app.set('views', join(DIST_FOLDER, 'browser'));

// TODO: implement data requests securely
app.get('/api/*', (req, res) => {
  res.status(404).send('data requests are not supported');
});

// Server static files from /browser
app.get('*.*', express.static(join(DIST_FOLDER, 'browser')));

// All regular routes use the Universal engine
app.get('*', (req, res) => {
  res.render(join(DIST_FOLDER, 'browser', 'index.html'), { req });
});

// Start up the Node server
app.listen(PORT, () => {
  console.log(`Node server listening on http://localhost:${PORT}`);
});

【问题讨论】:

  • 您在浏览器的调试控制台中看到任何错误吗?
  • 我搞定了,实际上 cloudflare 搞砸了。

标签: angular nginx angular-universal


【解决方案1】:

在 localhost 工作但服务器上的 prod 没有工作的地方有同样的问题。原来这是由于http协议。在 localhost 上是 http,在服务器上是 https,这会导致一些资产请求失败。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题。在 localhost 上,初始页面的响应会在 DevTools 中打印路由的源,但不会在生产环境中打印。原来这是本地主机与生产上所有@angular包的版本不匹配。

    【讨论】:

      【解决方案3】:

      有一篇关于server-side rendering的文章对阅读很有帮助,我也强烈建议你看看Git上的Angular Universal-starter存储库。

      请按照以下步骤操作,如果还不行,请告诉我:

      1. 构建服务器项目应用程序。
      2. 在您的本地主机上运行它。 有效吗?
      3. 取决于您的构建和 WebPack 设置,您可能还需要上传 node_modules 目录。某些 WebPack 设置(如 Universal-starters)允许您仅部署 dist 目录,而无需使用 node_modules
      4. 在您的服务器上部署代码后,您需要运行您的节点应用程序。您可以使用 node dist/server.js 或使用 Nodejs 生产流程管理器之一运行它,例如 pm2forever
      5. 您需要配置 Nginx 以重定向到定义的 Nodejs 端口(@98​​7654332@ 或您导出的端口)

      如果您按照上述说明操作,它有望正常工作。

      【讨论】:

      • 我已经使用相同的过程来构建服务器和浏览器模块。我还将项目部署在数字海洋上,使用 nginx 作为节点的代理服务器。我正在使用 pm2。一切正常,除了页面视图源仅返回静态元素而不是在 api 调用后呈现的元素。我也在我的本地系统上创建了相同的设置,它可以工作,但我不知道为什么它不能在服务器上工作。
      • 你确定不检查平台是否只有浏览器?
      • 问题与 cloudflare 有关,npw 工作正常。
      • @PijushKarmakar 很高兴您能自己解决问题!谢谢你告诉我
      • @PijushKarmakar 请告诉我们,您在 cloudflare 设置中做了哪些更改?不知何故,我面临着同样的问题。
      【解决方案4】:

      运行以下命令:

      ng build --prod
      

      这将在根项目中生成 dist 文件夹。 dist 的内容是部署应用程序所需的内容。

      【讨论】:

      • 我已经创建了两个构建服务器和浏览器,我的问题是,相同的设置在 localhost 中运行没有任何问题,但是当我将它移动到服务器时,项目运行正常但是当我查看页面源时仅显示静态 html。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-10
      • 2021-10-12
      • 1970-01-01
      • 1970-01-01
      • 2018-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多