NodeJS SSR服务端渲染:公共代码区分客户端和服务端

SSR服务端渲染(英语:server side render)指一般情况下,一个web页面的数据渲染完全由客户端或者浏览器端来完成。先从服务器请求,然后到页面;再通过AJAX请求到页面数据并把相应的数据填充到模板,形成完整的页面来呈现给用户。服务端渲染把数据的初始请求放在了服务端,服务端收到请求后,把数据填充到模板形成完整的页面,由服务端把渲染的完整的页面返回给客户端。这样减少了一次客户端到服务端的HTTP请求,加快了相应速度,一般用于性能优化。

在实现 SSR 服务端渲染时,一些代码会在两端都被加载,在这些公共代码中,如果用到了 window等服务端没有的属性方法,那么在服务端就会报错,反之亦然。以下提供了我在实践中想到的几种方案:

一、typeof 判断是否为 undefined

if(typeof window != 'undefined') {
	// 是客户端
} else {
	// 是服务端
}

二、分别在两端的全局对象上挂载一个判断变量

服务端在全局对象 global声明,客户端在全局对象 window声明:

// 服务端
global.__CLIENT = false

// 客户端
window.__CLIENT = true

// 在公共代码中判断是客户端还是服务端
if(__CLIENT) {
	// 客户端
} else {
	// 服务端
}

总结

以上提供了最简单但有效的方法来在公共代码中判断是 NodeJS 服务端还是 JavaScript 客户端,当然你也可以将判断条件进一步复杂化,以求万无一失。

0 条评论
请不要发布违法违规有害信息,如发现请及时举报或反馈
还没有人评论呢,速度抢占沙发!
相关文章
  • Node.js 有哪些特性?在应用构建的时候有哪些注意事项?入门同学如何实现技术进阶?本期大咖说,阿里云高级技术专家朴灵携作品《深入浅出 Node.js》展开分享。https://www.youku....

  • 说明 后台提供梦想Node.JS服务,方便调用控件后台功能,Windows服务程序所在目录:Bin\MxDrawServer\Windows,Linux服务程序所在目录:Bin\Linux\...

  • 进程:process模块process 模块是 nodejs 提供给开发者用来和当前进程交互的工具,它的提供了很多实用的 API。从文档出发,管中窥豹,进一步认识和学习 process 模块:如何处理...

  • 模块化的基本概念 什么是模块化? 模块化是解决一个复杂问题时,自顶向下逐层把系统划分为若干个模块的过程,编程中,就是遵守一定规则,把一个大文件拆成独立并相互依赖的多个小模块。 模块化规范 使用什么样的...

  • ZY.Node.Mongodb https://gitee.com/Z568_568/node.mongodb.git https://github.com/ZHYI-source/ZY.No...

  • Renode 是一个开发框架,通过让你模拟物理硬件系统来加速物联网和嵌入式系统开发。 Renode 可以模拟 Cortex-M、RISC-V 等微控制器,不仅可以模拟 CPU指令,还可以模拟外设,甚至...

  • node.js 初探Node.js 是一个 JS 的服务端运行环境,简单的来说,它是在 JS 语言规范的基础上,封装了一些服务端的运行时对象,让我们能够简单实现非常多的业务功能。如果我们只使用 JS ...

  • 问题描述 使用Azure Kubernetes服务(AKS),可以通过kubectl连接 pod 中查看日志,但是如何来查看节点的系统日志呢?如是否有ubuntu系统升级的记录? 问题解答 是的,可...

  • //中间件import jwt from "jsonwebtoken"; import {resultFail} from "../common/utils"; import {SECRET} fro...

  • 一、为什么需要GC 程序应用运行需要使用内存,其中内存的两个分区是我们常常会讨论的概念:栈区和堆区。 栈区是线性的队列,随着函数运行结束自动释放的,而堆区是自由的动态内存空间、堆内存是手动分配释放或者...

  • 概述写这篇blog的原因,想找个node的ORM框架用用,确很难找到一篇对比分析这些ORM框架的文章,唯一找到了一篇,居然是通过star数来论英雄,我觉着很难服众,于是就找几个看看。后来又不想分析,因...

  • 开场白 在平时的业务中,我们很多使用都会有文件上传这个功能。 今天分享一下使用 node+element-ui实现一下文件上传。 请个人大佬指点一番~~~。批评的时候稍微轻一点。 毕竟我心里承受能力弱...

  • Node.js Event Loop 处理的几大周期如下图所示:Timer:通过 setTimeout() 或 setInterval() 安排的一切都将在这里处理。IO 回调:这里将处理大部分回调。...

  • 1、portport是k8s集群内部(node节点)访问service的端口,即通过clusterIP: port可以访问到某个service。2、nodePortnodePort是外部访问k8s集群...

  • 代码封装实现文件名:spider-post.jsconst url = require('url') const axios = require('axios') module.exports = ...

  • 缘起 最近在弄docsify作为自己的记事本,好处就是用git+markdown方式比较好管理。碰到了个比较麻烦的事,就是要手动去加目录到_sidebar.md中,网上的确有一些开源的脚本做这个事,我...

  • --save === 生产环境 dependencied npm install xxx npm install xxx --save npm install xxx -S npm i xxx -S ...

  • 序言一次面试中,我提到自己用过pm2,面试接着问:「那你知道pm2父子进程通信方式吗」。我大概听说pm2有cluster模式,但不清楚父子进程如何通信。面试结束后把NodeJS的多进程重新整理了一下。...

  • 本文将通过一个 NodeJS 程序里无效的错误捕获示例,来讲解错误捕获里常见的陷阱。错误捕获不是凭感觉添加 try catch 语句,它的首要目的是提供有效的错误排查信息,只有精心设计的错误捕获才有可...

  • 本文代码以 Ceph 16.2.10 为准。 MDS 的活跃度统计方法 MDS 会统计 inode 的访问活跃度。 对于任何类型的 inode,都有两个计数器,分别表示该 inode 的读、写活跃度。...