作者:攻击的大葱
转发链接:https://mp.weixin.qq.com/s/rPi9u9gUFejw0m2xzbaCJA
序言
最近在研究JAMStack的一些干系内容,创造这的确是个好东西,以是想写一篇文章把这个观点分享给还不理解JAMStack的同学。本篇文章紧张包含以下的内容:

JAMStack中的JAM实在是三个词的缩写,它们分别是JavaScript, APIs以及Markdown。而Stack用中文的说法便是技能栈(Tech Stack),也便是我们在构建运用的时候详细利用到的技能的凑集。举个例子,国外现在比较火的一个Stack叫做Mean Stack,它表示利用MongoDB + Express.js + AngularJS + Node.js这些技能来构建一个Web运用。因此用最普通易懂的话来描述JAMStack便是:利用JavaScript,APIs和Markdown三种技能来构建Web运用。以是JAMStack是一种问题办理方案,而不是一个详细的实现。
接着我们再详细看一下JavaScript,APIs和Markdown这三种技能在JAMStack的天下中是起到什么浸染的。
JavaScript在JAMStack的观点中,JavaScript指的是在客户端(client)实现动态网页效果的JavaScript,它既可以是React和Vue这种Web框架,也可以是原生的JavaScript。它紧张卖力网页动态的内容。
APIs这里的API和我们平时开拓调用的API是一样的。JAMStack的Web运用会通过JavaScript给后端API发送AJAX要求或者GraphQL query,后端API会以某种格式(一样平常是JSON)返回数据给前端来实现一些用户交互。
MarkdownMardown是一种轻量级的标记措辞。在JAMStack的天下中,Markdown类型的文件常日是用来作为天生静态HTML文件的数据源。有用过hexo写博客的同学对这个观点肯定不会陌生,由于hexo的事理便是将我们编写的Markdown文件根据我们指定的主题或者模板天生一些静态的HTML然后托管在github pages或者其它类似的静态网站做事器来供别人访问的。
除了Markdown文件之外,JAMStack的静态数据源还可以是其它的东西,例如我们后面说到的Gatsby(JAMStack的一种实现)就许可通过插件的办法利用SQL直接读取数据库的内容来天生静态页面。
理解了这三个观点的详细内容后,我们再通过一个Gatsby的小demo来体会一下JAMStack的运用是如何事情的。
Gatsby Demo由于文章篇幅的限定,我将不在这里为大家讲述Gatsby的详细用法,不过我后面会写一系列文章来教大家如何用Gatsby来免费构建一个比较大的内容网站(CMS),大家可以留神一下。
大略来说,Gatsby是一个可以让开发者利用React,GraphQL等当代技能快速开拓网站的静态网站天生器(static-site generator)。它是存在于网站构建(build)阶段的一个工具。为了给大家一个直不雅观点的认识,我利用Gatsby搭建了一个大略的个人博客网站,网站的源代码可以在我的github仓库找到。
博客网站包含以下的功能:
博客列表页面:展示我揭橥的所有博客。(静态内容)博客详情页面:展示每一篇博客的详细内容。(静态内容)博客评论列表:游客评论博客以及展示游客对这篇博客的评论列表。(动态内容)细心的你一定把稳到了我在上面每个功能点的右边标出了这个功能是静态的还是动态的。所谓静态的内容便是那些不会常常发生变革的内容,这些内容在一段韶光内不同用户访问的时候都会得到同样的结果。而动态的内容便是那些频繁发生变革的内容,例如游客对我的博客的评论。那么我为什么要区分开这两种类型的内容呢?要回答这个问题我们可以先看看如果利用做事端渲染(SSR)的方案这个博客运用是如何运行的。首先游客会向SSR做事器发送一个查看某个博客的要求,SSR做事器收到要求后向后端做事要求这个博客的内容然后渲染出一个HTML页面然后返回给用户。这时候如果其他用户也向SSR做事器要求了同样的资源,SSR做事器还是会做同样的事情,要求资源 + 渲染页面。这个时候实在SSR做事器花费了很多IO和CPU资源来做这些重复性的渲染,而且随着你的博客访问量的增大这些无用的资源花费也会越来越多,在不升级做事端资源的条件下用户体验也会随之变差。到这里你可能会问,既然做事端渲染这么摧残浪费蹂躏资源,我们不进行SSR,直接将webpack打包天生的文件放在一个静态做事器然后页面都是在浏览器渲染不就行了吗?从实现博客功能的层面上来说这是没有问题的,可是这对搜索引擎优化(SEO)很不友好,百度收录不了你的博客,你的网站火不起来啊!
为了避免重复性的无用渲染而且能对SEO友好,Gatsby采纳了区分网站静态内容和动态内容的技能方案。对付那些不常常变动的而且希望被搜索引擎收录的静态内容,Gatsby会在Webpack打包阶段就天生,这样就不须要在用户访问该页面的时候才摧残浪费蹂躏资源来渲染页面了,而且这些静态文件还可以通过CDN来优化用户体验。而对付那些数据常常发生变革的且不须要被搜索引擎收录的内容,它们会等到浏览器实际渲染对应组件的时候才通过APIs动态获取数据渲染出来。
我们接着来看一下博客网站的代码目录构造:
上面代码中,server文件夹存放的是一个大略的管理用户评论的express运用,src文件夹才是Gatsby操作的前端资源,它包括以下内容:
blogs:这个文件夹是用来存放博客内容的,每一个Markdown文件都会天生一个静态的HTML文件。components: 存放React组件用的。images:存放博客的一些图片资源。pages: 网站的路由文件夹,这个文件夹下的每一个文件都会被天生一个对应的HTML静态文件,当要求该路由时会直接返回该静态文件。例如现在pages底下有两个路由,404的路由对应着的是没找到资源的页面,而index路由则是博客的主页面。templates: 网站的模板文件夹,该文件夹底下只有一个叫做blog-post.js的模板文件,在Gatsby构建网站的时候blogs文件夹底下的每一个Markdown文件都会通过这个模板文件天生一个对应的HTML文件,这样当用户访问做事器的时候博客的HTML文件就会被直接返回而无需进行做事端渲染了。接着我们可以看一下Gatsby打包会天生哪些文件:
由上图可以看出,Gatsby会为每一个pages文件夹底下的文件天生一个对应的html文件,以及为每一个blogs文件夹底下的博客天生一个静态的HTML文件,同时还有一些在客户端实行的JS文件。天生的文件可以直策应用静态网站做事器来为用户供应做事,同时你还可以把它们放在CDN中来让用户访问起来更快。
末了让我们来看一下这个博客网站的运行效果吧:
上图中我点击了“如何立时实现财富自由”这个博客,进入到博客详情页时浏览器没有重新向做事端要求博客详情的HTML文件,而是直接在浏览器完成渲染,用户体验非常之流畅。这实在是Gatsby运用的一个很大的亮点,那便是:Gatsby打包的运用在浏览器首次要求得到提前天生的静态HTML文件后,会演化成一个React SPA运用,接下来的用户交互就和一样平常的SPA运用没有任何差别了,换句话来说,Gatsby既保留了SSR方案SEO友好的优点又保留了SPA运用的流畅用户体验,可谓是各取所长,扬长补短了!
实在JAMStack的运用现在已经有很多了,只不过我们平时没有留神到而已。举个例子,React开拓者十分熟习的React官网reactjs.org便是用Gatsby构建。那么除了这些比较大略的文档性和博客网站,JAMStack可以用来构建繁芜的商业运用吗?答案是肯定的,除了一些大略的CMS平台,JAMStack还可以用来搭建诸如braun这类电商平台,你可能想不到的是著名的程序员学习网站freeCodeCamp也是利用JAMStack技能栈来搭建的,大家可以去网上(Google)查一下关于freeCodeCamp架构设计的视频或文章,看完之后我相信你会对JAMStack有更深入的理解的。
JAMStack的上风在上面的先容中我已经大概说了一些JAMStack的上风了,个中包括SEO友好还有流畅的用户体验,那么除了这些,JAMStack还有没有其它吸引人的地方呢?
高性能为什么JAMStack是高性能的呢?这是由于JAMStack的运用将网站的静态部分和动态部分区分开来了,那些不会频繁发生变革的内容会被提前天生,从而无需利用额外的打算资源来进行做事端渲染。这样用户首次访问某个页面的时候速率会变得很快,而且这些静态的资源还可以被放在CDN来进一步提升用户体验。将动态内容和静态内容区分开来还有其余一个好处,便是我们后端接口的职责更加明确了,API接口的数量会变得更少,性能也会变得更好。
高性价比以及高可扩展性由于我们前真个内容都是一些静态的文件没有做事端渲染的哀求,而静态资源做事器对性能的哀求并不高,以是我们在购买做事器方面不须要很大的本钱,我们乃至还可以利用一些诸如netlify和Gatsby Cloud等免费资源来托管我们的文件。对付后端来说由于我们已经将前后端彻底分离了,所往后端可以利用一些廉价的Baas或者Serverless做事,例如可以利用Auth0作为我们的用户鉴权做事,利用Firebase作为我们的接口做事等等。利用这些Baas和Serverless做事有一个好处便是它们很便宜,而且它们是按照接口利用量来收费的,你的用户量决定了你的支出,如果你的用户很少,你乃至不须要花一分钱。
除了极高的性价比,JAMStack还有很好的扩展性。举个例子,如果你现在的博客网站由于某一篇博客溘然火了,访问用户激增。如果你的前端静态文件利用的是CDN网络的话,你的网站很随意马虎就可以扩展了,统统都是自动的,无需你做任何东西,而后端如果你利用了Serverless和Baas的办理方案的话,统统也是自动的,用户不会觉得到有利用体验的差别,而你只须要给利用到的做事平台多一点点用度而已。
更好的开拓者体验拿我们前面提到的Gatsby来举例,它就许可我们利用一些当代的前端技能来进行开拓,例如React,Styled-components和GraphQL等,这些都是我们前端开拓者十分熟习的技能了,没有很大的学习本钱以是开拓者体验会很好。除此之外,由于Gatsby利用了React,以是它间接上接入了React的生态系统,这样开拓者在开拓Gatsby运用时就可以利用React生态的各种最佳实践和库实现了,这无疑可以大大提高我们的开拓效率。
更高的安全性由于JAMStack是一种前后端分离的技能,没有了后端渲染以是可以降落被攻击的风险。举个例子采取Gatsby天生的CMS平台就比传统的WordPress平台安全很多:)。
JAMStack适宜什么运用既然JAMStack有那么多好处,我们是不是一把梭在所有的项目中都利用JAMStack呢?答案是否定的,由于JAMStack须要我们将网站的静态部分和动态部分区分开来,静态部分的内容会在构建的时候就天生而动态的内容会在浏览器进行渲染,这个特点就注定了它不适宜于构建以下类型的运用:
掘金,知乎这种紧张由第三方用户创建内容的运用。由于这些运用的内容都是由平台用户创建的,而且用户可以不断地修正和删除已经创建的内容,如果利用JAMStack的话网站的内容就须要被频繁构建,这显然是不合理的。微博,推特这种社走运用。这类运用的内容除了频繁更新之外,还有便是动态内容多于静态内容,例如用户的主页只会展示他关注的人揭橥的动态,以是也不适宜利用JAMStack。一些不须要SEO的运用。JAMStack一个很大的优点便是对SEO友好,如果你的运用没有被搜索引擎收录的需求的话,就没必要利用JAMStack了。内允许多的运用。由于JAMStack须要我们每次都构建出所有的静态资源,以是对付那些静态内允许多的运用(例如页面数超过50k)的话,每次构建运用都须要大量的韶光,因此这种类型的网站也不适宜用JAMStack。相反JAMStack十分适宜构建以下类型的运用:
项目文档之类的网站,例如React的官网等。企业或者组织的官方网站。个人管理的博客网站。中小型规模的CMS平台。中小型的电商平台。既有须要被SEO的静态内容又有动态的不须要SEO的内容的稠浊运用。例如一些To B的平台,里面既有用户的事情台又有一些操作文档干系的静态内容。当然了我在这里列出来的无论是适用还是不适用JAMStack的运用实在都是一些很笼统的分类,我们在实际开拓时还得详细问题详细剖析,根据实际情形来评估我们的运用是不是适宜利用JAMStack来开拓。
我的个人思考在末了我想说一下我自己对JAMStack的一些思考。
首先我个人十分看好这个技能栈,也会在日后的开拓中利用这个技能栈。由于它帮我办理了网站SEO的问题。在不理解JAMStack之前,如果我想我的网站被搜索引擎收录要么便是刀耕火种地硬写HTML和原生JS,这种方案明显开拓效率十分低下。还有一种方案便是我利用React等当代开拓技能,这样我就得学习next.js等SSR技能来实现SEO,这个方案有一个问题便是学习next.js有一定的学习本钱,而且在项目上线后我得掩护一个后端做事来进行做事端渲染,以是会有一定的运维本钱。可是利用了JAMStack或者说是Gatsby后这些问题就迎刃而解了,由于我可以连续利用我熟习的React技能栈来快速开拓Web运用,还无需考虑做事端渲染的问题就可以达到SEO的效果,这不是美滋滋?
其次我以为JAMStack这个技能栈十分有利于我们实践一些自己想到的不愿定能不能成功的点子(创业想法)。上面在先容JAMStack上风的时候,我提到了一点便是利用JAMStack实在你可以免费支配你的运用,由于你可以将前真个静态代码放在一些免费的静态资源托管做事器,然后后端利用一些免费的Baas API做事,当然了这只适宜于我们平台用户量不大的情景,当用户量大的时候我们还是得付费的。可是我们网站刚起步的时候用户量不都是不大的吗?如果我们一大早就买好做事器资源和域名,后面却创造这个想法根本行不通的话,这些钱就算是赔进去了。相反,利用免费做事的话,纵然我们做的东西黄了,我们也不会有什么丢失。
总的来说我对JAMStack这个技能栈是很有信心的,特殊是在CMS内容管理平台这方面我相信它一定会逐渐火起来,而且有可能可以取代WordPress的地位。
推举JavaScript经典实例学习资料文章《前后端全部用 JS 开拓是什么体验(Hybrid + Egg.js履历分享)上》
《前后端全部用 JS 开拓是什么体验(Hybrid + Egg.js履历分享)中》
《前后端全部用 JS 开拓是什么体验(Hybrid + Egg.js履历分享)下》
《一文带你搞懂 babel-plugin-import 插件(上)「源码解析」》
《一文带你搞懂 babel-plugin-import 插件(下)「源码解析」》
《JavaScript常用API合集汇总「值得收藏」》
《推举10个常用的图片处理小帮手(上)「值得收藏」》
《推举10个常用的图片处理小帮手(下)「值得收藏」》
《JavaScript 中ES6代理的实际用例》
《12 个实用的前端开拓技巧总结》
《一文带你搞懂搭建企业级的 npm 私有仓库》
《教你如何利用内联框架元素 IFrames 的沙箱属性提高安全性?》
《细说前端开拓UI公共组件的新认识「实践」》
《细说DOM API中append和appendChild的三个不同点》
《细品淘系大佬讲前端新人如何上王者「干货」》
《一文带你彻底办理背景跟随弹窗滚动问题「干货」》
《推举常用的5款代码比较工具「值得收藏」》
《Node.js实现将笔墨与图片合成技巧》
《爱奇艺云剪辑Web真个技能实现》
《我再也不敢说我会写前端 Button组件「实践」》
《NodeX Component - 滴滴集团 Node.js 生态组件体系「实践」》
《Node Buffers 完全指南》
《推举18个webpack精美插件「干货」》
《前端开拓须要理解常用7种JavaScript设计模式》
《浅谈浏览器架构、单线程js、事宜循环、行列步队、宏任务和微任务》
《了不起的 Webpack HMR 学习指南(上)「含源码讲解」》
《了不起的 Webpack HMR 学习指南(下)「含源码讲解」》
《10个打开了我新天下大门的 WebAPI(上)「实践」》
《10个打开了我新天下大门的 WebAPI(中)「实践」》
《10个打开了我新天下大门的 WebAPI(下)「实践」》
《「图文」ESLint 在中大型团队的运用实践》
《Deno是代码的浏览器,你认同吗?》
《前端存储除了 localStorage 还有啥?》
《Javascript 多线程编程的前世今生》
《微前端方案 qiankun(实践及总结)》
《「图文」V8 垃圾回收原来这么大略?》
《Webpack 5模块联邦引发微前真个革命?》
《基于 Web 真个人脸识别身份验证「实践」》
《「前端进阶」高性能渲染十万条数据(韶光分片)》
《「前端进阶」高性能渲染十万条数据(虚拟列表)》
《图解 Promise 实现事理(一):根本实现》
《图解 Promise 实现事理(二):Promise 链式调用》
《图解 Promise 实现事理(三):Promise 原型方法实现》
《图解 Promise 实现事理(四):Promise 静态方法实现》
《实践教你从零构建前端 Lint 事情流「干货」》
《高性能多级多选级联组件开拓「JS篇」》
《深入浅出讲解Node.js CLI 工具最佳实战》
《延迟加载图像以提高Web网站性能的五种方法「实践」》
《比较 JavaScript 工具的四种办法「实践」》
《利用Service Worker让你的 Web 运用为虎傅翼(上)「干货」》
《利用Service Worker让你的 Web 运用为虎傅翼(中)「干货」》
《利用Service Worker让你的 Web 运用为虎傅翼(下)「干货」》
《前端如何一次性处理10万条数据「进阶篇」》
《推举三款正则可视化工具「JS篇」》
《如何让用户选择是否离开当前页面?「JS篇」》
《JavaScript开拓职员更喜好Deno的五大缘故原由》
《仅用18行JavaScript实现一个倒数计时器》
《图文细说JavaScript 的运行机制》
《一个轻量级 JavaScript 全文搜索库,轻松实现站内离线搜索》
《推举Web程序员常用的15个源代码编辑器》
《10个实用的JS技巧「值得收藏」》
《细品269个JavaScript小函数,让你少加班熬夜(一)「值得收藏」》
《细品269个JavaScript小函数,让你少加班熬夜(二)「值得收藏」》
《细品269个JavaScript小函数,让你少加班熬夜(三)「值得收藏」》
《细品269个JavaScript小函数,让你少加班熬夜(四)「值得收藏」》
《细品269个JavaScript小函数,让你少加班熬夜(五)「值得收藏」》
《细品269个JavaScript小函数,让你少加班熬夜(六)「值得收藏」》
《深入JavaScript教你内存泄露如何戒备》
《手把手教你7个有趣的JavaScript 项目-上「附源码」》
《手把手教你7个有趣的JavaScript 项目-下「附源码」》
《JavaScript 利用 mediaDevices API 访问摄像头自拍》
《手把手教你前端代码如何做缺点上报「JS篇」》
《一文让你彻底搞懂移动前端和Web 前端差异在哪里》
《63个JavaScript 正则大礼包「值得收藏」》
《提高你的 JavaScript 技能10 个问答题》
《JavaScript图表库的5个首选》
《一文彻底搞懂JavaScript 中Object.freeze与Object.seal的用法》
《可视化的 JS:动态图演示 - 事宜循环 Event Loop的过程》
《教你如何用动态方案和贪心算法实现前端瀑布流布局「实践」》
《可视化的 js:动态图演示 Promises & Async/Await 的过程》
《原生JS封装拖动验证滑块你会吗?「实践」》
《如何实现高性能的在线 PDF 预览》
《细说利用字体库加密数据-仿58同城》
《Node.js要完了吗?》
《Pug 3.0.0正式发布,不再支持 Node.js 6/8》
《纯JS手写轮播图(代码逻辑清晰,普通易懂)》
《JavaScript 20 年 中文版之创立标准》
《值得收藏的前端常用60余种工具方法「JS篇」》
《箭头函数和常规函数之间的 5 个差异》
《通过发布/订阅的设计模式搞懂 Node.js 核心模块 Events》
《「前端篇」不再为正则烦恼》
《「速围」Node.js V14.3.0 发布支持顶级 Await 和 REPL 增强功能》
《深入细品浏览器事理「流程图」》
《JavaScript 已进入第三个时期,未来将何去何从?》
《前端上传前预览文件 image、text、json、video、audio「实践」》
《深入细品 EventLoop 和浏览器渲染、帧动画、空闲回调的关系》
《推举13个有用的JavaScript数组技巧「值得收藏」》
《前端必备根本知识:window.location 详解》
《不要再依赖CommonJS了》
《犀牛书作者:最该忘却的JavaScript特性》
《36个事情中常用的JavaScript函数片段「值得收藏」》
《Node + H5 实现大文件分片上传、断点续传》
《一文理解文件上传全过程(1.8w字深度解析)「前端进阶必备」》
《【实践总结】关于小程序解脱枷锁实现批量上传》
《手把手教你前真个各种文件上传攻略和大文件断点续传》
《字节跳动口试官:请你实现一个大文件上传和断点续传》
《谈谈前端关于文件上传下载那些事【实践】》
《手把手教你如何编写一个前端图片压缩、方向纠正、预览、上传插件》
《最全的 JavaScript 模块化方案和工具》
《「前端进阶」JS中的内存管理》
《JavaScript正则深入以及10个非常故意思的正则实战》
《前端口试者常常忽略的一道JavaScript 口试题》
《一行JS代码实现一个大略的模板字符串更换「实践」》
《JS代码是如何被压缩的「前端高等进阶」》
《前端开拓规范:命名规范、html规范、css规范、js规范》
《【规范篇】前端团队代码规范最佳实践》
《100个原生JavaScript代码片段知识点详细汇总【实践】》
《关于前端174道 JavaScript知识点汇总(一)》
《关于前端174道 JavaScript知识点汇总(二)》
《关于前端174道 JavaScript知识点汇总(三)》
《几个非常故意思的javascript知识点总结【实践】》
《都2020年了,你还不会JavaScript 装饰器?》
《JavaScript实现图片合成下载》
《70个JavaScript知识点详细总结(上)【实践】》
《70个JavaScript知识点详细总结(下)【实践】》
《开源了一个 JavaScript 版敏感词过滤库》
《送你 43 道 JavaScript 口试题》
《3个很棒的小众JavaScript库,你值得拥有》
《手把手教你深入巩固JavaScript知识体系【思维导图】》
《推举7个很棒的JavaScript产品步骤勾引库》
《Echa哥教你彻底弄懂 JavaScript 实行机制》
《一个合格的中级前端工程师须要节制的 28 个 JavaScript 技巧》
《深入解析高频项目中利用到的知识点汇总【JS篇】》
《JavaScript 工具函数大全【新】》
《从JavaScript中看设计模式(总结)》
《身份证号码的正则表达式及验证详解(JavaScript,Regex)》
《浏览器中实现JavaScript计时器的4种创新办法》
《Three.js 动效方案》
《手把手教你常用的59个JS类方法》
《127个常用的JS代码片段,每段代码花30秒就能看懂-【上】》
《深入浅出讲解 js 深拷贝 vs 浅拷贝》
《手把手教你JS开拓H5游戏【消灭星星】》
《深入浅出讲解JS中this/apply/call/bind奥妙用法【实践】》
《手把手教你全方位解读JS中this真正含义【实践】》
《书到用时方恨少,一大波JS开拓工具函数来了》
《干货满满!如何优雅简洁地实现时钟翻牌器(支持JS/Vue/React)》
《手把手教你JS 异步编程六种方案【实践】》
《让你减少加班的15条高效JS技巧知识点汇总【实践】》
《手把手教你JS开拓H5游戏【黄金矿工】》
《手把手教你JS实现监控浏览器高下旁边滚动》
《JS 经典实例知识点整理汇总【实践】》
《2.6万字JS干货分享,带你领略前端魅力【根本篇】》
《2.6万字JS干货分享,带你领略前端魅力【实践篇】》
《大略几步让你的 JS 写得更俊秀》
《恭喜你得到治疗JS this的详细药方》
《谈谈前端关于文件上传下载那些事【实践】》
《口试中教你绕过关于 JavaScript 浸染域的 5 个坑》
《Jquery插件(常用的插件库)》
《【JS】如何防止重复发送ajax要求》
《JavaScript+Canvas实现自定义画板》
《Continuation 在 JS 中的运用「前端篇」》
作者:攻击的大葱
转发链接:https://mp.weixin.qq.com/s/rPi9u9gUFejw0m2xzbaCJA