近些年来,越来越多的JavaScript框架(即AngularJS,BackboneJS,ReactJS)变得越来越流行。许多公司和开发人员使用这些JavaScript框架开发应用程序。这些框架有很多的优势: 前端和后端独立开发 JavaScript框架+RESTFUL的API(或微服务架构) SPA(Single Page Application) 某种程度上有利于提高开发效率 但是使用JavaScript框架对前台尤其是需要支持搜索引擎的页面是很有问题的,这是因为我们使用这些框架基本上都是基于虚拟元素或属性和JavaScript绑定JSON对象,都是SEO不友好的。很多搜索引擎,社交媒体,爬虫甚至不支持抓取JavaScript的网页。 很庆幸的是,我们可以使用PreRender预渲染页面(PreRender通过执行页面上的JavaScript,然后呈现给搜索引擎爬虫)。 PreRender 预渲染解决方案 根据PreRender逻辑,有3个不同的级别的解决方案来实施prerender 方案1:应用层 通过中间件实现对应用程序级别prerender逻辑(即Express NodeJS中间件,Ruby on Rails的中间件,ASP.NET MVC中间件,…) Http请求到达 应用程序将检查Http请求是否来自爬虫(User Agent)。 如果请求来自爬虫,那么appliaction将调用prerender服务,把原来的URL作为查询字符串。 预渲染服务将调用应用程序 应用程序返回原始的HTML用JavaScript逻辑的prerender服务 预渲染服务将执行内部HTML的JavaScript(与浏览器类似) 预渲染服务将最终的HTML返回到应用程序。 Appliaction将最终的HTML返回到浏览器。 如果Http请求来自普通用户,应用程序将执行输出,并发送回浏览器。 方案2:服务器容器级别 通过使用URL重写中间件,实施服务器容器级别prerender逻辑(i.e. Apache,Nginx,IIS)。 Http请求到达 服务器容器(如Apache,Nginx,IIS)将检查Http请求是否来自爬虫(User Agent)。 如果Http请求来自爬虫,然后重写URL(将原始URL作为查询字符串)预呈现服务。 预渲染服务将调用应用程序 应用程序返回JavaScript逻辑原始的HTML 预渲染服务将执行内部HTML的JavaScript,与浏览器类似 预渲染服务将返回最终的HTML服务器容器(Apache,Nginx,IIS)。 如果Http请求来自普通用户,然后将流量重定向到应用程序。应用程序将执行并返回输出到服务器容器。 方案3:网络级别 我们通过负载均衡的代理实现网络级prerender逻辑,i.e. HAProxy: Http请求到达 负载均衡代理会检查Http请求是否来自爬虫(User Agent)。 如果Http来自爬虫,然后将流量重定向(将原始URL作为查询字符串)预呈现服务。 预渲染服务将调用应用程序 应用程序返回包含JavaScript原始的HTML 预渲染服务将执行内部HTML的JavaScript,与浏览器类似… Continue Reading PreRender 预渲染解决方案

原文:A collection of JavaScript error logging services, resources and shiny things. 作者:cheeaun 转自:https://github.com/cheeaun/javascript-error-logging JavaScript error logging A collection of JavaScript error logging services, and comparisons among them. Previously, on https://gist.github.com/cheeaun/5835757. Hosted services CatchJS – Screenshots, click trails, email notifications, remote object logging, intelligent error grouping. Extremely lightweight, only 1.78KB. http://errorception.com/ – translate error… Continue Reading [Reproduce]A collection of JavaScript error logging services, resources and shiny things.

原文:Async/Await替代Promise的6个理由 作者:KiwenLau 转自:https://kiwenlau.com/2017/04/01/nodejs-async-await/ Async/Await替代Promise的6个理由 译者按: Node.js的异步编程方式有效提高了应用性能;然而回调地狱却让人望而生畏,Promise让我们告别回调函数,写出更优雅的异步代码;在实践过程中,却发现Promise并不完美;技术进步是无止境的,这时,我们有了Async/Await。 原文: 6 Reasons Why JavaScript’s Async/Await Blows Promises Away 译者: Fundebug 为了保证可读性,本文采用意译而非直译。 Node.js 7.6已经支持async/await了,如果你还没有试过,这篇博客将告诉你为什么要用它。 Async/Await简介 对于从未听说过async/await的朋友,下面是简介: async/await是写异步代码的新方式,以前的方法有回调函数和Promise。 async/await是基于Promise实现的,它不能用于普通的回调函数。 async/await与Promise一样,是非阻塞的。 async/await使得异步代码看起来像同步代码,这正是它的魔力所在。 Async/Await语法 示例中,getJSON函数返回一个promise,这个promise成功resolve时会返回一个json对象。我们只是调用这个函数,打印返回的JSON对象,然后返回”done”。 使用Promise是这样的: const makeRequest = () => getJSON() .then(data => { console.log(data) return “done” }) makeRequest() 使用Async/Await是这样的: const makeRequest = async () => { console.log(await getJSON())… Continue Reading 【转载】Async/Await替代Promise的6个理由