阿里巴巴
1、请简要介绍一下Koa2中间件原理。
Koa2中间件,主要由四大部分构成,application、context、request、response构成,在application中通过use来注册我们所要使用的中间件,在createServer的时候传入一个回调函数,在这个回调函数里面,依次来执行我们的中间件。那么就是说,当我们的server监听到相应的请求之后,就会去执行这些注册的中间件。那么难点就来了,如何递归执行我们的中间件呢, koa2提供了一个compose函数,这也是koa2的核心中的核心,它通过遍历中间件,返回一个dispatch函数,这个dispatch函数是个递归调用函数,也就是在dispatch里面执行我们的响应的中间件。
2、请问你使用过哪些Koa2中间件?你写过哪些koa2中间件?
koa2中间件在项目中的使用还是比较频繁的,我主要使用到了koa-router、koa-session、koa-bodyparser和koa-static等中间件。当然我也自己写过一些中间件,例如在项目中,我曾经写过接口请求及返回内容、耗时情况的日志记录中间件;风控拦截中间件;前端跨域代理等中间件。
3、在你的项目中有没有涉及到Cluster?
当然,是涉及到的(即使没用到,至少也说一点,装一下,让面试官觉得你涉猎很广)。我记得我之前做过这样一个项目,一个后台服务系统,支持同时上传大量资源文件。当时我们针对这个服务,做了一个简单的单机集群。其实也就是借助了pm2,做了一些并发。将我们的上传服务速度比较之前提升了3倍。如果您有兴趣的话,我倒是可以介绍一下cluster的原理。
接下来开始bana bana.
4、介绍PM2
pm2,作为node应用的进程管理器。可以实现node对应用的启动、监控、日志。其内建了负载均衡,可以让我们的node应用充分利用我们的cpu。其不光能够实现node应用进程的管理,也能管理一般的脚本程序。它甚至还有deploy功能,能够直接从本地部署我们的线上应用。非常强大的一款工具,我上家公司的上线打包工具就是基于pm2实现的, 通过一个命令即可完成项目的打包发布。
5、Master挂了pm2如何处理?
pm2可以通过fork产生多个独立进程实例。 这些实例能够在master挂掉后,随时替代master。
6、如何与MySql通信?
npm提供了mysql的node应用。在项目中,项目中引入mysql,通过调用connect方法,连接到远程数据库,拿到connection连接对象。 connect连接对象,提供了增删改查api,通过输入数据库脚本,完成与数据库的通信。 mysql还提供了连接池对象,通过它可以直接完成curd操作,当然也可以复用已有的连接池,减少连接开销。
7、React生命周期以及自己的理解
Reac1.5以前的生命周期这里就不多说了, React1.6以后生命周期总体概括分为三个部分。组件创建、更新、卸载三个阶段。创建时,依次顺序调用constructor、getDerivedStateFromProps、render、componentDidMount这四个生命周期函数,其中getDerivedStateFromProps主要用来将外部属性转换为自身状态,比较适用于组件既能被外部控制又能内部更新的场景。更新阶段,依次通过getDerivedStateFromProps、shouldComponentUpdate、render、getSnapshotBeforeUpdate、componentDidUpdate这个四个方法。 最后卸载时调用componentWillUnMount方法。
8、如何配置React-Router
配置React-Router,概括起来就是有大概三种方式:
第一种,通过标签形式,例如<Router/>
这样的标签,通过这样的标签来引入我们的组件,最后render的时候返回这样的Router就好了,这种方式比较简单,但是不能做一些比较个性化的事情。
第二种,通过声明式配置的方式,声明一个对象,该对象是一个数组,可以更加灵活的配置我们的路由,可以配置我们跳转路由之前的操作,例如离开页面、进入页面,都能配置响应的回调事件。然后通过<Router routes={routerConfig} />
这种方式来应用我们的配置。
第三种,按需加载的方式,在大型应用中,性能是一个很重要的问题,按需要加载JS是一种优化性能的方式。在React router中不仅组件是可以异步加载的,路由也是允许异步加载的。Route 可以定义getChildRoutes
,getIndexRoute
和getComponents
这几个函数,他们都是异步执行的,并且只有在需要的时候才会调用。这种方式需要配合webpack中有实现代码拆分功能的工具来用。
9、路由的动态加载
在React V4以后, React由静态路由变成动态路由了,根据官方code splitting的要求, 实现动态加载需要
webpack,babel-plugin-systax-dynamic-import和react-loadable, 具体配置如下。这样组件动态加载和HMR就都实现了。
<Route exact path="/settings"
component={Loadable({
loader: () => import(/* webpackChunkName: "Settings" */ './Settings.js'),
loading:Loading
})}
/>
10、服务端渲染 SSR
传统的服务端渲染SSR,主要是通过在服务端组装html,组装的html已经是结合了css,并执行了js,返回给客户端,直接就可以展示,客户端省去了解析html和渲染css的工作。在这种开发模式下,服务端与前端的分工变得模糊,前后端分离的目标并没有达到。虽然利于SEO,但是服务端的压力比较大。
Node.js技术浪潮袭来之后,服务端渲染主要有node中间件来完成了,这样保证了,前后端分工仍然明确。并且node技术框架下,有大量优秀的服务端渲染工具可以选择,例如中间件架构,我们可以选择的express、koa、egg等, 视图模版,我们有pug(jade)、handlebars、art-template、ejs 等等工具, React体系下有next.js,Vue体系下有Nuxt.js。
未完,待续。。。 请关注我哦。。连载中。。