## 简述ES6的新特性
*Default Parameters(默认参数) in ES6
*Template Literals (模板文本)in ES6
*Multi-line Strings (多行字符串)in ES6
*Destructuring Assignment (解构赋值)in ES6
*Enhanced Object Literals (增强的对象文本)in ES6
*Arrow Functions (箭头函数)in ES6
*Promises in ES6
*Block-Scoped Constructs Let and Const(块作用域构造Let and Const)
*Classes(类) in ES6
*Modules(模块) in ES6
## Koa 与 Express 比较
1. **语法区别**
experss 异步使用 回调
koa1 异步使用 generator + yeild
koa2 异步使用 await/async
2. **中间件区别**
koa采用洋葱模型,进行顺序执行,出去反向执行,支持context传递数据
express本身无洋葱模型,需要引入插件,不支持context
express的中间件中执行异步函数,执行顺序不会按照洋葱模型,异步的执行结果有可能被放到最后,response之前。
这是由于,其中间件执行机制,递归回调中没有等待中间件中的异步函数执行完毕,就是没有await中间件异步函数
3. **集成度区别**
express 内置了很多中间件,集成度高,使用省心,
koa 轻量简洁,容易定制
## 什么是服务端渲染,服务端渲染的优点
***服务端渲染***:在早期的时候,由于页面比较简单,前后端分离还没有做的比较完善,所以当时一般页面渲染还是在服务端完成html文件的拼装,然后浏览器接收到这个文件,就可以直接解析展示。
如今前端页面的复杂性提高,前端已经不再仅仅是普通的页面展示了,现在前端页面功能更加完善,也更加复杂。同时伴随着ajax的兴起,使得现在越来越崇尚前后端分离的开发方式。后端不再提供完整的html页面,而是提供一些API使得前端可以获取需要的json数据,然后前端拿到数据后在前端完成html页面的拼装,然后展示在浏览器上,这就是***客户端渲染***。
**优点**:
1.*前端耗时少*。因为后端拼接完了html,浏览器只需要直接渲染出来。
2.*有利于SEO*。因为在后端有完整的html页面,所以爬虫更容易爬取获得信息,更有利于seo。
3.*无需占用客户端资源*。即解析模板的工作完全交由后端来做,客户端只要解析标准的html页面即可,这样对于
4.*客户端的资源占用更少*,尤其是移动端,也可以更省电。
5.*后端生成静态化文件*。即生成缓存片段,这样就可以减少数据库查询浪费的时间了,且对于数据变化不大的页面非常高效 。
**缺点**:
1.*不利于前后端分离,开发效率低*。使用服务器端渲染,则无法进行分工合作,则对于前端复杂度高的项目,不利于项目高效开发。另外,如果是服务器端渲染,则前端一般就是写一个静态html文件,然后后端再修改为模板,这样是非常低效的,并且还常常需要前后端共同完成修改的动作; 或者是前端直接完成html模板,然后交由后端。另外,如果后端改了模板,前端还需要根据改动的模板再调节css,这样使得前后端联调的时间增加。
2.*占用服务器端资源*。即服务器端完成html模板的解析,如果请求较多,会对服务器造成一定的访问压力。而如果使用前端渲染,就是把这些解析的压力分摊了前端,而这里确实完全交给了一个服务器。
## React 组件间信息传递
1.父组件向子组件传值:父组件通过属性进行传递,子组件通过props获取
2.子组件向父组件传值:触发父组件传给子组件的函数传值
3.兄弟组件传值:可以用上面两种方法一点一点方法传给相同父组件在传下去
使用context传递数据
利用redux传递数据
## 为什么有时连续多次setState只有一次生效?
原因就是 React会批处理机制中存储的多个 setState进行合并,来看下 React源码中的 _assign函数,类似于 Object的 assign:
React会对多次连续的 setState进行合并,如果你想立即使用上次 setState后的结果进行下一次 setState,可以让 setState 接收一个函数而不是一个对象。这个函数用上一个 state 作为第一个参数,将此次更新被应用时的 props 做为第二个参数。
## React状态管理工具都有哪些?redux actionCreator都有什么?
一种是将Redux进一步封装的如dva、refrect、refast等,二是采用observable的方案如MobX、dob
actionCreator就是定义个函数然后传入一个数据并返回一个带有action对象,然后供组件使用