• Angular Universal教学-将现有专案导入Server Side Render


    找了各式各样的文章,一直没有看到完整关于Angular Univeral的详细步骤教学

    而在设定时也会有一些小细节需要处理,因此本文将完整从Client Side Render 如何成功导入Server Side Render

    让Google的爬虫能够搜寻的到使用 Angular开发的网站。

    在2020的今天,随着Web Framework的窜起,使用前端框架如:Angular,React,Vue开发系统早已是见怪不怪的事。

    但这种前端主流框架,对于SPA 没办法进行SEO一直以来都是开发者最为头痛的事。

    因此就有Next.js 这类的工具可以协助我们进行Server-Side-Render。

    而在Angular中,则有Angular Universal可以帮助我们解决问题。

    早期Angular 要使用SSR 技术要新增不少的档案与内容,但现在只需要使用cli的指令就可以达成。

    加入@nguniversal/express-engine 到专案中

    在Angular专案下,我们可以安装

    ng add @nguniversal/express-engine --clientProject 專案名稱(可以由angular.json查看名稱)

    安装后,我们会发现cli指令帮我们建立了不少档案。

    其中最主要的部份则以server.ts以及app.server.module.ts这两支档案为主。

    这边简单说明一下:

    server.ts主要是运行我们SSR最主要的程式,透过这支程式,会自动在部属时自动将首页进行编译,让我们的angular的程式,能够预先载入到index.html中

    而不是透过浏览器执行的时候才将js渲染到画面上。简单来说,就是该程式就是将首页的js进行编译,并载入到html中回传静态的网页内容。

    app.server.module.ts 则是与app.module.ts相同,但不同的是,透过ssr编译时,会采用的是app.server.module.ts进行呼叫。

    在安装好express-engine 套件后,接下来要运行 Universal Web Server。

    这里跟一般我们平时在使用ng serve 一样,都是去呼叫node.js的express起来,进行监听。

    输入以下指令

    npm run build:ssr;npm run serve:ssr

    就会执行ssr 的build(部属)以及serve(运行)。

    如果正确无误的话,那么你将会看到以下画面:

    但如果不能build出现can't find window / localstorage的话。由于SSR是透过nodejs预先将页面进行编译以及载入。

    因此在nodejs中并没有windows 或是localStorage等其他在Web上的功能。

    尽管可以透过nodeJS进行部分模拟,放入到server.ts中,让node.js读懂这些语法是什么。

    但大多数在Client Side中的语法,还是得需要透过浏览器去运行。

    让node.js读懂的语法如下:

    import 'localStorage-polyfill';

    global['localStorage'] = localStorage;

    但如果是其他的套件,例如应该要在Client端运行的Ex: jQuery/scroll ...等

    就不应该由Server编译的时候执行。

    必须区分哪些程式码应该要在Server进行SSR编译时执行,哪些该由Client执行的时候运行。

    因此我们需要在Component的constructor 中注入:

    constructor(@Inject(PLATFORM_ID) private platformId: any) { }

    并且在需要由Client端执行的程式码加入以下判断:

        if (isPlatformBrowser(this.platformId)) {
          const anchorOffset = $('div.anchor-' + this.anchor);
          $('html,body').animate({
            scrollTop: anchorOffset.offset().top - 100
          }, 100);
        }

    像上面这种有使用到jQuery还有scroll,牵涉到画面甚至是动画效果的,都应该由Client端执行,而非在Server端中执行。

    因此我们就需要透过 isPlatformBrowser(this.platformId) 来判断当前执行此段程式码是否为Browser

    若是在SSR编译时期,则该段程式就不会被运行。

    注记: 若使用ngModel的话,使用到该物件的所有兜必须要先初始化才能使用,让nodejs编译。

    若上述都完成,则会在dist建立browser以及server这两个资料夹。

    browser:编译完后所产生的程式码,内含有index.html (和过去使用ng build --prod相同)

    server=>在SSR渲染的第一页中,所有用到的图档,以及js都会在这里

    若正常完成的话,会自动在localhost端监听4000 port来运行SSR

    Node Express server listening on http://localhost:4000

    此时将网页按右键检视原始码,将会看到在 中的程式码已经被自动带入

  • 相关阅读:
    在VScode下搭载Perl的调试环境
    32.最长有效括号(Longest Valid Parentheses)
    23.合并K个排序链表(Merge k Sorted Lists)
    10.正则表达式匹配(Regular Expression Matching)
    4.寻找两个有序数组的中位数(Median of Two Sorted Arrays)
    C++中不引人瞩目的细节
    关于C++项目中头文件相互包含的问题
    关于css中hover下拉框的一个bug
    DFS-BFS(深搜广搜)原理及C++代码实现
    trie(字典树)原理及C++代码实现
  • 原文地址:https://www.cnblogs.com/wwwblender-3dcn/p/13391573.html
Copyright © 2020-2023  润新知