A progressive Node.js framework for building efficient and scalable server-side applications.
Angular Universal module for Nest.
Using the Angular CLI:
$ ng add @nestjs/ng-universal
Or manually:
$ npm i @nestjs/ng-universal
See full example here.
If you have installed the module manually, you need to import AngularUniversalModule
in your Nest application.
import { Module } from '@nestjs/common';
import { join } from 'path';
import { AngularUniversalModule } from '@nestjs/ng-universal';
@Module({
imports: [
AngularUniversalModule.forRoot({
bootstrap: AppServerModule,
viewsPath: join(process.cwd(), 'dist/{APP_NAME}/browser')
})
]
})
export class ApplicationModule {}
The forRoot()
method takes an options object with a few useful properties.
Property | Type | Description |
---|---|---|
viewsPath |
string | The directory where the module should look for client bundle (Angular app) |
bootstrap |
Function | Angular server module reference (AppServerModule ). |
templatePath |
string? | Path to index file (default: {viewsPaths}/index.html ) |
rootStaticPath |
string? | Static files root directory (default: *.* ) |
renderPath |
string? | Path to render Angular app (default: * ) |
extraProviders |
StaticProvider[]? | The platform level providers for the current render request |
cache |
boolean? | object? | Cache options, description below (default: true ) |
errorHandler |
Function? | Callback to be called in case of a rendering error |
Property | Type | Description |
---|---|---|
expiresIn |
number? | Cache expiration in milliseconds (default: 60000 ) |
storage |
CacheStorage? | Interface for implementing custom cache storage (default: in memory) |
keyGenerator |
CacheKeyGenerator? | Interface for implementing custom cache key generation logic (default: by url) |
AngularUniversalModule.forRoot({
bootstrap: AppServerModule,
viewsPath: join(process.cwd(), 'dist/{APP_NAME}/browser'),
cache: {
storage: new InMemoryCacheStorage(),
expiresIn: DEFAULT_CACHE_EXPIRATION_TIME,
keyGenerator: new CustomCacheKeyGenerator()
}
});
export class CustomCacheKeyGenerator implements CacheKeyGenerator {
generateCacheKey(request: Request): string {
const md = new MobileDetect(request.headers['user-agent']);
const isMobile = md.mobile() ? 'mobile' : 'desktop';
return (request.hostname + request.originalUrl + isMobile).toLowerCase();
}
}
This tool uses @nguniversal/express-engine
and will properly provide access to the Express Request and Response objects in you Angular components. Note that tokens must be imported from the @nestjs/ng-universal/tokens
, not @nguniversal/express-engine/tokens
.
This is useful for things like setting the response code to 404 when your Angular router can't find a page (i.e. path: '**'
in routing):
import { Response } from 'express';
import { Component, Inject, Optional, PLATFORM_ID } from '@angular/core';
import { isPlatformServer } from '@angular/common';
import { RESPONSE } from '@nestjs/ng-universal/tokens';
@Component({
selector: 'my-not-found',
templateUrl: './not-found.component.html',
styleUrls: ['./not-found.component.scss']
})
export class NotFoundComponent {
constructor(
@Inject(PLATFORM_ID)
private readonly platformId: any,
@Optional()
@Inject(RESPONSE)
res: Response
) {
// `res` is the express response, only available on the server
if (isPlatformServer(this.platformId)) {
res.status(404);
}
}
}
Nest is an MIT-licensed open source project. It can grow thanks to the sponsors and support by the amazing backers. If you'd like to join them, please read more here.
Nest is MIT licensed.
Angular 使用 @toolkit/universal 实现服务端渲染 SPA 的缺陷 — SEO 基本上所有现在大行其道的单页应用都存在这个问题,它们只在客户端运行和渲染,也许你会说:“单页明明就是这样设计的,这是优点而不是缺陷!”, 当然,你说的完全正确!现在的问题是你的应用“只在”客户端渲染和运行。 爬虫是怎样去爬取网页的? 问题在于搜索引擎的 机器人/爬虫 的工作类似于CURL命令。为
2ndboot-ng – this is a bootloader, which can boot custom boot image (including custom kernel + initrd) from any place/file. It consists from: - small kernel module, for creating device for booting/con
angular CLI 1.6内置了 Angular Universal 服务端渲染。解放webpack配置的痛苦。 新建项目 ng new angulrUniversal cd angulrUniversal 复制代码 加入Angular Universal ng g universal universal npm i 复制代码 有兴趣的可以研究下改的什么,建议瞅瞅 然后修改下package.j
问题内容: 我试图了解和/ 之间的区别,但对我来说它们看起来相同。 我应该记住使用一个或另一个来区别吗? 问题答案: ngIf 该指令根据表达式 删除或重新创建 DOM树的一部分。如果赋值为的表达式的计算结果为假值,则将元素从DOM中删除,否则将元素的克隆重新插入DOM中。 删除元素时,使用它的作用域将被销毁,并在恢复该元素时创建一个新的作用域。在内部创建的作用域使用原型继承从其父作用域继承。 如
问题内容: 任何人都可以为该JSFiddle提供正确的方法: JsFiddle链接 我正在尝试通过.class&#ID更改元素的类。 提前致谢 感谢tymeJV,新的JSFiddle: 解 问题答案: 正确的方法是根据切换变量使用,请考虑: CSS: JS: HTML: 通过根据变量(“ toggle”)是否为或分配引用的类(在上面为“红色”)来工作。
问题内容: 我了解这一点,并会影响在元素上设置的类,并控制是否将元素呈现为DOM的一部分。 有没有对选择的准则在/ 或反之亦然? 问题答案: 取决于您的用例,但总结不同之处: 将从DOM中删除元素。这意味着您所有的处理程序或所有附加到这些元素的内容都将丢失。例如,如果将单击处理程序绑定到子元素之一,则将其评估为false时,将从DOM中删除该元素,并且即使稍后将其评估为true并显示该元素,您的单
NG Bootstrap 是基于 Angular(非 Angular.js)开发的 Bootstrap CSS 框架的指令集。 原生开发 专为Bootstrap 4 开发的Angular组件,开发了符合Angular生态系统的API,没有使用任何第三方Javascript库来实现,全都是纯粹的原生Javascript。 Boostrap的JS插件 支持全部Boostrap自带的Javascript
Mogwai ERDesigner NG是一个实体关系建模工具类似于ERWin。它设计成让数据库建模变得尽可能简易并为整个开发过程提供支持,从数据库设计到模式 (schema)和代码生成。此外ERDesigner还提供一个灵活的插件体系,从而可以通过安装新的插件来扩展该工具的功能。ERDesigner提 供的功能包括: *.能够使用一个强大和易于使用的图形编辑来设计数据库模型。 *.能够依据ER图
ng-inspector 是Chrome和Safari的浏览器扩展程序,它显示一个检查器面板,该面板实时显示当前页面中的AngularJS作用域层次结构,以及哪些控制器或指令与哪个作用域相关联。 将鼠标悬停在检查器中的范围上将突出显示该范围附加到的DOM元素。单击模型将console.log该模型的内容。 该扩展程序在带有AngularJS徽标的地址栏旁边添加了一个按钮,用于打开和关闭窗格。