将 Angular 4 Web 应用程序转换为 Angular 通用应用程序

2023-11-30

我需要将 Angular 4 Web 应用程序转换为角度通用原因是目前,Web 应用程序无法被 Google(和 Facebook 社交预览缩略图)正确索引,因为它是单页应用程序并在客户端呈现。所以现在我需要实现 Angular Universal、服务器侧渲染。

我了解了如何使用创建新的 Angular 通用应用程序这个很棒的视频系列.

问题:您能否告诉我将现有应用程序转换为 Angular 通用应用程序时必须遵循的方向。也许一个好的 URL 或步骤或任何方向将受到高度赞赏。

Note:这里角度版本不是问题。要么2 or 4.


From 这个博客 (网络存档备份)

First npm install --save @angular/platform-server @angular/animations

Edit /src/app/app.module.ts并将 BrowserModule 导入更改为BrowserModule.withServerTransition({appId: 'your-app-name'}),

创建文件/src/app/app.server.module.ts

import { NgModule } from '@angular/core';
import { ServerModule } from '@angular/platform-server';
import { AppModule } from './app.module';
import { AppComponent } from './app.component';

@NgModule({
imports: [
    ServerModule,
    AppModule
],
bootstrap: [AppComponent]
})
export class AppServerModule { }

创建文件/src/server.ts

import 'reflect-metadata';
import 'zone.js/dist/zone-node';
import { platformServer, renderModuleFactory } from '@angular/platform-server'
import { enableProdMode } from '@angular/core'
import { AppServerModuleNgFactory } from '../dist/ngfactory/src/app/app.server.module.ngfactory'
import * as express from 'express';
import { readFileSync } from 'fs';
import { join } from 'path';

const PORT = 4000;

enableProdMode();

const app = express();

let template = readFileSync(join(__dirname, '..', 'dist', 'index.html')).toString();

app.engine('html', (_, options, callback) => {
  const opts = { document: template, url: options.req.url };

  renderModuleFactory(AppServerModuleNgFactory, opts)
    .then(html => callback(null, html));
});

app.set('view engine', 'html');
app.set('views', 'src')

app.get('*.*', express.static(join(__dirname, '..', 'dist')));

app.get('*', (req, res) => {
  res.render('index', { req });
});

app.listen(PORT, () => {
  console.log(`listening on http://localhost:${PORT}!`);
});

Edit /src/tsconfig.app.json并添加server.ts to the exclude array

Edit /tsconfig.json并在之后"compilerOptions"节点添加以下内容

"angularCompilerOptions": {
    "genDir": "./dist/ngfactory",
    "entryModule": "./src/app/app.module#AppModule"
} 

Edit package.json并改变"scripts"部分通过添加"prestart"并改变"start"

"prestart": "ng build --prod && ngc",
"start": "ts-node src/server.ts"

您现在可以输入npm run start在你的控制台/终端窗口中,它将构建所有内容并开始在端口 4000 上提供服务。

它不会监视源代码或进行热模块替换等,但是一旦服务器运行,您也可以输入ng serve(假设您正在使用 @angular/cli npm 包)在另一个窗口中并像平常一样编辑您的单页应用程序并使用npm run start仅在重建或更改服务器代码时。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 Angular 4 Web 应用程序转换为 Angular 通用应用程序 的相关文章

随机推荐

  • 如何在 PowerShell 中从连接字符串获取数据库名称

    我正在尝试从 PowerShell 中的连接字符串获取数据库名称 Server server instance uid User pwd Hello Database SomeName 我可以想到两种方法来做到这一点 要么搜索字符串Data
  • 作曲家在 PHP 中未找到类异常

    我正在尝试包含来自作曲家的包 但我收到了找不到类 error 我已经尝试过以下可能性 supermeteor new Supermeteor Supermeteor XXXXXXXX and use Supermeteor Supermet
  • 如何将句子中第一个单词的第一个字母大写?

    我正在尝试编写一个函数来清理用户输入 我并不想让它变得完美 我宁愿有几个小写的名字和缩写 也不愿有一个完整的大写段落 我认为该函数应该使用正则表达式 但我对这些非常不熟悉 我需要一些帮助 如果以下表达式后跟一个字母 我想将该字母设为大写 f
  • 仅选择一个选项在角度4中显示ID而不显示名称

    我正在研究 Angular 4 Web API 当选择一个选项时 它将显示打包类型名称 其工作正常 但我的问题是 当单击添加按钮时 它只会保存我想要的包装类型ID 包装类型ID 和包装类型名称 这里我想在选择包装类型名称时自动将其ID 传递
  • 如何检测具有背景模糊的容器的亮度以改变文本的颜色

    模糊容器的亮度根据背景中的图像而变化 有没有办法检测图像或模糊容器的亮度来改变文本颜色 最好不处理图像 我制作了一个小部件作为一个有趣的练习和概念验证 称为PixelDataOverlay 它有一个background建设者和overlay
  • 二进制与线性搜索未排序的 N 个元素

    当我们应该使用快速排序时 我尝试理解一个公式 例如 我们有一个数组N 1 000 000元素 如果我们要搜索只有一次 我们应该使用一个简单的线性搜索 但如果我们要做 10 次 我们应该使用排序数组O n log n 如何检测阈值 何时以及对
  • 批处理窗口中的正则表达式

    我目前正在处理批处理作业 我也是新手 以获取 Maven 依赖项列表 一直在努力使用正则表达式获取这些依赖项 但无济于事 我已经对此测试了我的正则表达式site看起来它正在发挥作用 从这里检查了 FOR 循环内所需的转义字符堆栈溢出问题但同
  • 如何在 if 语句中使用这个布尔值?

    private String getWhoozitYs StringBuffer sb new StringBuffer boolean stop generator nextBoolean if stop true sb append y
  • 虚假唤醒后的互斥状态

    考虑这个使用 pthread 的基本多线程程序 我们有一个主线程 创建另一个执行一些工作的线程 bool done false mutex m condition c void foo pthread mutex lock m while
  • 将 np.arange 中的范围增加 1 则将范围增加 2

    我不确定这是一个错误还是我做错了什么 我有以下代码 r div 200 r max 1 4 numMax 84 lowerBin int numMax 2 r max r div upperBin int numMax 2 r max r
  • Swift 中带有键值对的 POST 请求

    我必须在 Swift 中发出发布请求并收到响应 我需要以键值对格式向请求添加值 然后得到答案 0 或 1 我不知道如何将字典值添加到请求中 var url NSURL string www myurl com var request NSM
  • 是否可以使用 CSS 中的 :active 选择器在点击时显示 div?

    我想展示一个div on click 目标是使用pure CSS只有 没有 jQuery Working FIDDLE Demo 考虑一下您想要这样的东西 我们尽可能简单地编写标记 一个元素为container 我们的一个元素link和另一
  • 如何在 iPython 中使用 pandas 库读取 .xlsx 文件?

    我想使用 python 的 Pandas 库读取 xlsx 文件并将数据移植到 postgreSQL 表 到目前为止我能做的就是 import pandas as pd data pd ExcelFile File Name 现在我知道该步
  • 应用程序第二次运行时拒绝访问文件

    当尝试使用代码访问 SD 卡上的文件时 我遇到一个奇怪的问题 var path D Test test txt try StorageFile file await StorageFile GetFileFromPathAsync path
  • 通过 m3u8 流式传输到 iPhone

    我一直在阅读有关通过 m3u8 在 iphone 上进行流媒体的内容 但我不确定我是否遗漏了一些东西 有据可查的是 MPMoviePlayerController 只能在 OS 3 1 中全屏播放 因此 iPhone 用户只能观看视频 在我
  • 省略号在 Firefox 中运行不佳,但在 Chrome 中运行良好

    我试图使用省略号将链接限制为宽度 html 是这样的 a class blueLink2 destination url space href http google com uyv245 http google com iuh345345
  • 如何禁用数据表上特定列的搜索/过滤?

    我的数据表有 5 列 我需要禁用第三 第四和最后一列的过滤 请帮忙 这是 JavaScript
  • 如何将条目参数传递给 Xamarin MVVM 视图模型

    我一直在寻找通过单击带有命令参数的按钮 在视图中 将输入参数 用户名 密码 传递到 Xamarin MVVM 视图模型的最佳方法 这是以 Xamarin MVVM 模式传递用户名和密码的示例 它工作正常 1 创建一个 LoginViewMo
  • 显示加载时的等待警报视图

    我希望当我的应用程序启动时 它会显示一个警报视图大约 5 秒 然后根据后台进程的结果 它将显示另一个警报视图 我遇到的问题是 当我尝试使用睡眠来等待后台进程发生时 第一个警报未显示并等待 5 秒 应用程序显示应用程序的第一个视图 然后 5
  • 将 Angular 4 Web 应用程序转换为 Angular 通用应用程序

    我需要将 Angular 4 Web 应用程序转换为角度通用原因是目前 Web 应用程序无法被 Google 和 Facebook 社交预览缩略图 正确索引 因为它是单页应用程序并在客户端呈现 所以现在我需要实现 Angular Unive