引言

前后端分离这个词相信大家都听过,不知道大家是怎么理解的呢。前阵子看项目的时候,有一段实现硬是没看懂,下面来给大家说一下一段愚蠢的经历哈。

(我没正正式式写过前端,所以如果文章有错的地方希望可以在评论区友善交流~)

一、交代背景

我一直都知道我现在的这个系统是前后端分离的,我的接口只会返回JSON出去,但我不曾关心前端是怎么处理我的JSON数据的(以及他是怎么跑通和运行的)

在某一天,我在查接口的时候,习惯F12,想直接看一下这个请求返回的JSON数据是什么。但是一看,在network返回的是html格式:

于是,我就很好奇啊,就看一下这个接口是不是我想象中的那个。于是就去找我的接口,看一下是不是真的返回JSON(我还专门Debug了一下,看看是不是真请求到这个接口上了):

得出的结果是:我的接口的确是返回JSON数据,浏览器的reponse返回的的确是HTML格式

于是,我就去找我前端的小伙伴,去问了一下这是怎么搞的。他回复我说:“在浏览器看到返回的是页面,那肯定是你们后端干的呀”

我说:“没有啊,我Java接口返回的是JSON数据啊,是不是中途你们用node做了些处理啊?”(我之前听过Node.js,但仅仅是听过)

他说:“Node.js也是你们后端的啊。”

我一听,啊?Node.js不是属于前端的吗?

二、初识Node.js

在遇到这个事情之前,其实我在知乎已经看了一个帖子,话题名是这个《毕设答辩,老师说node不可能写后台怎么办?》

有兴趣的小伙伴可以去了解一下,大多数内容还是挺通俗易懂的:

  • www.zhihu.com/question/32…

我在下载Node.js的时候,发现其简介十分简洁

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.


Node.js® 是一个基于 Chrome V8 引擎 的 JavaScript 运行时。

然后点进去Chrome V8引擎,再看了一下介绍:

V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++. It is used in Chrome and in Node.js, among others.


V8是Google的开源高性能JavaScript和WebAssembly引擎,用C ++编写。它用于Chrome和Node.js等。

看了介绍,一脸懵逼,这是啥玩意啊。下面我来解释一下

2.1 V8引擎是什么?

众所周知,JavaScript是解析型语言,我们写好的JavaScript代码会由JavaScript引擎去解析,而V8是JavaScript引擎的一种。

  • 在传统意义上,我们会认为解析器是逐条解析(一边执行一边解析),但为了提高JavaScript的解析速度(相当于提高用户体验),在解析的时候做了点“手脚”。
  • V8引擎:为了提高解析的性能,引入了一些“后端”的技术(不过他本来就由C++编写的)。它是先将JavaScript源代码转成抽象语法树,然后再将抽象语法树生成字节码。如果发现某个函数被多次调用或者是多次调用的循环体(热点代码),那就会将这部分的代码编译优化。说白了就是:对热点代码做编译,非热点代码直接解析

总结:V8引擎是JavaScript引擎的一种,这个引擎由C++来编写的,性能很不错。

参考资料:

  • zhuanlan.zhihu.com/p/27628685
  • zhuanlan.zhihu.com/p/73768338

2.2回到Node.js

浏览器为了安全,没有为JavaScript提供一套IO环境,而一门后端语言是肯定能进行网络通信、文件读写(IO)的。

后来,有牛逼的人把V8引擎搬到了服务端上,在V8引擎的基础上加了网络通信、IO、HTTP等服务端的函数。取了一个名字叫:Node.js

  • 比如通过libuv库来进行文件读取,以及建立TCP/UDP连接。通过xxx库解析HTTP请求和响应....这些库都是由C/C++来编写的。

所以,Node.js是运行在服务端的,只不过在基础语言是JavaScript。

三、前后端分离入门

回顾一下自己学JavaWeb的历程:

  • 刚学Servlet的时候,会在response对象上写一些HTML代码输出到浏览器看效果
  • 后来,学习到JSP了,就纯粹用Servlet做控制,JSP做视图。
  • JSP本质上还是一个Servlet,只不过看起来像HTML文件,在编译的时候还是会变成一个HttpJspPage类(该类是HttpServlet的一个子类)
  • 再后来,学到了AJAX技术,发现我们完全可以通过AJAX来进行交互。AJAX请求Servlet,Servlet返回JSON数据回去,AJAX拿到Servlet返回的数据进行解析和处理。这里压根就不需要JSP了(纯HTML+AJAX),这算是前后端分离的一种了
  • 在开发上体验:如果完全使用HTML+AJAX的话,会发现其实需要写非常非常多的JavaScript代码,而且这些JavaScript代码都不好复用。
  • 在部署上,还是跟Java一起部署(放在resource下),没有将前端单独部署。
  • 再后来,学到了一些在常用的模板引擎(比如freemarker),其实用起来跟JSP没多大的区别,只不过性能要比JSP好不少。
  • ...流下不学无术的泪水

目前我了解到的前后端分离,首先部署是分离的(至少不会跟Java绑定在一起部署):

Java接口只返回JSON数据:

关于前端这几大框架:angular/vue/react这几个我都是没有写过的,所以也就不多BB了。我一直想知道的是:前框框架和node是啥关系。问了一下前端的小伙伴,他回复是大致这样的:

前端现在是讲究工程化的,工程化用到了node而已(就是打包编译那些会用到,项目里面真正跑起来的话是没有这些东西的)

-----------以下引用摘录:

Webpack、Less、Sass、Gulp、Bower以及这些工具的插件都是Node上开发的---@知乎陈龙

举个例子:随着发展,前端的JavaScript需要依赖的包也非常复杂,类比于Java我们会有Maven,而前端现在有npm (包管理)

  • 而npm是随同Node.js一起安装的。所以前端(vue/angular/react)在开发环境下都是离不开Node.js的(编译、打包等等)

参考资料(为什么要使用 npm):

  • zhuanlan.zhihu.com/p/24357770

3.1 方式一(Nginx+Server)

OK,现在假设我们用前端(vue/angular/react)开发完,开发环境下将JavaScript编译/打包完,那我们能得到纯静态的文件。我们可以直接将纯静态文件放到Nginx(CDN)等等地方【只要能够响应HTTP请求就行】。

如果请求是调用后端服务,则经过Nginx转发到后端服务器,完成响应后经Nginx返回到浏览器。

3.2 方式二(加入Node.js)

在前边的基础上加入Node.js,至于为啥要Node.js,一个重要的原因就是:加快首屏渲染速度,解决SEO问题

加入Node.js,此时的请求流程应该是这样的:

浏览器发起的请求经过前端机的Nginx进行分发.

URL请求统一分发到Node Server,在Node Server中根据请求类型从后端服务器上通过RPC服务请求页面的模板数据,然后进行页面的组装和渲染;

API请求则直接转发到后端服务器,完成响应。

最后

好的,现在问题来了:你是觉得Node.js归属在后端还是前端?

小结

欢迎关注头条号:JAVA大飞哥

觉得收获的话可以点个关注收藏转发一波喔,谢谢大佬们支持!

私信本头条号:发送:“免费资料”就可以获取微服务、分布式、高并发、高可用,性能优化丶源码分析等等一些技术资料

最后,每一位读到这里的Java程序猿朋友们,感谢你们能耐心地看完。希望在成为一名更优秀的Java程序猿的道路上,我们可以一起学习、一起进步!都能赢取白富美,走向架构师的人生巅峰!

servlet里面为什么有时候覆_为什么新来的经理强烈推荐?前后端分离知识,学到了...相关推荐

  1. 为什么新来的经理强烈推荐前后端分离

    前言 我在合肥的一家公司上班,公司规模不大不小.不是什么互联网公司,也不像北上广那些大城市的公司,我们的开发技术很保守,运用传统的技术来玩着我们的项目.因为大家都习惯了,也懒得去换什么新潮技术了.前段 ...

  2. 接口入参形式_某小公司RESTful、共用接口、前后端分离、接口约定的实践

    点击上方"后端技术精选",选择"置顶公众号" 技术文章第一时间送达! 作者:邵磊 juejin.im/post/59eafab36fb9a045076eccc3 ...

  3. springboot jwt token前后端分离_实战:十分钟实现基于JWT前后端分离的权限框架

    前言 面试过很多Java开发,能把权限这块说的清楚的实在是不多,很多人因为公司项目职责问题,很难学到这类相关的流程和技术,本文梳理一个简单的场景,实现一个基于jwt前后端分离的权限框架. 简易流程 登 ...

  4. 「newbee-mall新蜂商城开源啦」 前后端分离的 Vue 版本即将开源

    不仅仅是展现形式的增多和产品线的丰富,技术栈也加入了 Vue,开发模式也变成了前后端分离模式. 1 新蜂商城 Vue 版本 2019 年 10 月份我在 GitHub 开源仓库中上传了新蜂商城项目的所 ...

  5. elementui datetimepicker 移动端_在 Gitee 收获 2.5K Star,前后端分离的 RuoYi 它来了

    作为 2019 年 Gitee 上最受欢迎的开源项目,权限管理系统 RuoYi 已经在 Gitee 上获得了超过 11K 的 Star. 这次作者若依推出了基于 SpringBoot + Vue + ...

  6. sm4 前后端 加密_这7个开源的Spring Boot前后端分离项目整理给你

    来源|公众号:江南一点雨 前后端分离已经开始逐渐走进各公司的技术栈,不少公司都已经切换到前后端分离开发技术栈上面了,因此建议技术人学习前后端分离开发以提升自身优势.同时,也整理了 7 个开源的 Spr ...

  7. 前后端解析_好程序员Web前端教程分享前后端分离接口

    随着互联网的高速发展以及IT开发技术的升级,前后端分离已成为互联网项目开发的业界标准使用方式.在实际工作中,前后端的接口联调对接工作量占Web前端人员日常工作的30%-50%,甚至会更高.接下来的好程 ...

  8. springboot jwt token前后端分离_基于Spring Boot+Spring Security+JWT+Vue前后端分离的开源项目...

    一.前言 最近整合Spring Boot+Spring Security+JWT+Vue 完成了一套前后端分离的基础项目,这里把它开源出来分享给有需要的小伙伴们 功能很简单,单点登录,前后端动态权限配 ...

  9. 若依前后端分离如何写移动端接口_前后端分离实践的架构设计

    前后端分离的项目开发策略已经不是什么新鲜东西了,网上介绍这方面的文章非常多.我自己是在14年的时候接触到的,对这种开发策略一直爱不释手,不管新老项目都会首先用前后端分离的思维先去思考一番.从14年到现 ...

最新文章

  1. GCC 编译时优化某一个或几个函数或者不优化某一个或几个函数
  2. JAVA 技术类分享(一)
  3. 自旋锁 Linux内核,Linux内核中的自旋锁
  4. 车场系统服务器内存莫名急速下降,宝德工控机在停车场监控系统的解决方案
  5. 2015 湘潭大学程序设计比赛(Internet)--D题-最小的数
  6. LeetCode 3. 无重复字符的最长子串 (滑动窗口哈希表)
  7. Cocos2d-x-3.0rc0创建新项目
  8. 【前端 · 面试 】JavaScript 之你不一定会的基础题(二)
  9. 1121 - Reverse the lights 思维题
  10. 泰安本地话听不懂,为何后来能勉强听懂?
  11. plsql 导出分区_plsql批量导出数据库数据
  12. 2022 年 Flutter 适合我吗?Flutter VS Other 量化对比
  13. FaShop-开源拖拽式小程序搭建平台
  14. java 图片导出word_【freemaker实现导出word②】代码实现导出word(包括导出list数据和导出图片到word)...
  15. 【Jupyter notebook更改默认浏览器】
  16. gromacs 安装_gromacs编译安装教程
  17. Dockerfile的编写
  18. Flink Window Function
  19. VS +QT 手动添加Q_OBJECT 报错问题解决
  20. Ant Design Pro右上角个人设置管理

热门文章

  1. python回测量化交易策略收益率
  2. XShell远程连接LInux服务器(地址端口映射方法)
  3. Socket源码相关——SocketAddress和InetSocketAddress
  4. linux vps 运行exe文件夹,在centos环境下运行.exe文件
  5. 局部放大_Origin教程|巧用ZOOM功能做数据对比和快速绘制局部放大图
  6. 织梦自定义图片字段和缩略图一样_织梦图片集模型自定义图片字段调用
  7. bilibili里的硬币有什么用 硬币的作用详细介绍
  8. QQ邮箱怎么发送文件夹 怎样在QQ邮箱里发送压缩文件夹
  9. NodeJS 模板 -- jade
  10. 【计算机系统】指令流水线