【问题标题】:How to render angular component from node express如何从节点快递渲染角度组件
【发布时间】:2019-06-16 02:15:24
【问题描述】:

我正在使用 GET 请求访问网址:http://localhost:5029/article/16

在节点内部,我正在检查article/16,如下所示:

req.url.split("article/")[1];

并尝试像这样使用handlebars 渲染组件:

res.render('header', {layout: 'header.component.html'});

我看到组件已渲染,但未加载 css 样式。

我的组件.ts:

@Component({
  selector: 'app-header',
  templateUrl: './header.component.html',
  styleUrls: ['./header.component.scss']
})
export class HeaderComponent implements OnInit { }

组件html:

<div class="header">
  <li class="menu-item">
    <a [routerLinkActive]="['active']" routerLink="/home">Home</a>
  </li>
  <li class="menu-item">
    <div class="dropdown">
      <button type="button" class="btn dropdown-toggle" data-toggle="dropdown" [routerLinkActive]="['active']">Tutorials</button>
    </div>
  </li>
</div>

车把设置:

app.engine(
  "hbs",
  hbs({
    extname: "html",
    defaultView: "default",
    layoutsDir:  "../src/app/components/header/",
    partialsDir: "../src/app/components/"
  })
);

app.set("view engine", "hbs");

RiotJS 也实现了类似的要求:

https://riot.js.org/api/#-riotrendertagname-opts

// render "my-tag" to html
var mytag = require('my-tag')
riot.render(mytag, { foo: 'bar' })

【问题讨论】:

  • 你什么时候需要在运行时编译这些?您可以查看角度通用项目。它应该阐明如何做到这一点。
  • @Rafael 在运行时或 AOT。我需要在发出 GET 请求时渲染它
  • 您要求您的车把渲染器渲染一个 Angular 模板,这是不可能的。您需要使用 Angular Universal。或者让你的服务器返回整个模块,让 Angular 在运行时渲染它
  • @Milad 我并不是说车把应该渲染它。我只是我尝试过的一个例子。我正在寻找一种在运行时渲染角度组件的方法。我不确定是否可以使用角度通用,因为我只想渲染特定组件而不是整个应用程序
  • @kittu ,我明白了,也许你应该把你的组件分成不同的应用程序,让 Universal 来渲染它们。但是你的用例是什么?也许我们可以建议其他方式。你想在运行时渲染组件的唯一原因是为了 SEO,我猜

标签: javascript node.js angular express angular6


【解决方案1】:

不确定为什么要从 node express 渲染特定的 Angular 组件,但我会尝试解释什么是组件以及为什么不能直接加载它们以及更好的替代方法。

您可能已经知道,装饰器使用特定的代码块区分服务、组件、指令等。

装饰器是使用前缀@符号调用并紧跟类、参数、方法或属性的函数。

例如

@Component({
})
export class TestComponent {}

@Injectable()
export class TestService {}

注意@Component 或@Injectable 上的 ()。 (这些装饰器需要在某些或其他的 ngModule() 中注册)

这意味着一旦 JavaScript 遇到 @Component(),就会调用 @Component。反过来,这意味着某处必须有一个组件函数,该函数返回与上述装饰器签名之一匹配的函数。这是装饰器工厂模式的一个示例。

在应用程序的Bootstrap过程中,所有这些函数都被调用,编译器将ts代码转换成vanilla js,在浏览器中执行。

回到你试图做的问题是试图加载组件而不用 TS 编译器处理它,(在引擎盖下,当我们构建或编译应用程序时,Angular 为我们做了很多工作)

可能的解决方案,如果您不想在 Angular 的帮助下为所有组件提供服务,您可以使用 Angular Element(Angular 元素是打包为自定义元素的 Angular 组件,一种用于在框架中定义新 HTML 元素的 Web 标准-不可知的方式),可以直接在任何页面上呈现而不需要角度。

要了解更多信息,请访问https://angular.io/guide/elements

希望这有助于一切顺利!

【讨论】:

  • 是否可以在运行时手动编译 Angular 组件(ts 到 js)/服务器端的 Aot 可以使用 webpack?
  • 您可以创建一个 Angular Element(组件),它可以独立编译,并且可以通过在任何项目中简单地导入来用作 Web 元素。 (反应,香草js等)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-19
  • 2021-03-05
  • 1970-01-01
  • 2020-01-31
  • 1970-01-01
  • 1970-01-01
  • 2018-03-16
相关资源
最近更新 更多