yarn的优势:html
zhuanlan.zhihu.com/p/27449990vue
yarn.lock 会记录你安装的全部大大小小的软件包的具体版本号。只要你不删除 yarn.lock 文件,再次运行 yarn install 时,会根据其中记录的版本号获取全部依赖包。你能够把 yarn.lock 提交到版本库里,这样其余同事签出代码并运行 yarn install 时,能够保证你们安装的依赖都是彻底一致的。react
虚拟 DOM 就是用来模拟 DOM 的一个对象,这个对象拥有一些重要属性,而且更新 UI 主要就是经过对比(DIFF)旧的虚拟 DOM 树 和新的虚拟 DOM 树的区别完成的。webpack
innerHTML: render html string O(template size) + 从新建立全部 DOM 元素 O(DOM size)web
Virtual DOM: render Virtual DOM + diff O(template size) + 必要的 DOM 更新 O(DOM change)ajax
Virtual DOM render + diff 显然比渲染 html 字符串要慢,可是!它依然是纯 js 层面的计算,比起后面的 DOM 操做来讲,依然便宜了太多。能够看到,innerHTML 的总计算量不论是 js 计算仍是 DOM 操做都是和整个界面的大小相关,但 Virtual DOM 的计算量里面,只有 js 计算和界面大小相关,DOM 操做是和数据的变更量相关的。前面说了,和 DOM 操做比起来,js 计算是极其便宜的。这才是为何要有 Virtual DOM:它保证了 1)无论你的数据变化多少,每次重绘的性能均可以接受;2) 你依然能够用相似 innerHTML 的思路去写你的应用。算法
Virtual DOM 为了提高小量数据更新时的性能,也须要针对性的优化,好比 shouldComponentUpdate 或是 immutable datanpm
Virtual DOM 真正的价值历来都不是性能,而是它 1) 为函数式的 UI 编程方式打开了大门;2) 能够渲染到 DOM 之外的 backend,好比 ReactNative。编程
www.zhihu.com/question/31…redux
redux设计有如下几个要点:
react-redux主要包含两个部分。
Hook 提供了更直接的 API:props, state,context,refs 以及生命周期
useState 会返回一对值:当前状态和一个让你更新它的函数
const [count, setCount] = useState(0);
useEffect 它跟 class 组件中的 componentDidMount、componentDidUpdate 和 componentWillUnmount 具备相同的用途,只不过被合并成了一个 API。
// 至关于 componentDidMount 和 componentDidUpdate:
useEffect(() => {
// 使用浏览器的 API 更新页面标题
document.title = `You clicked ${count} times`;
});
复制代码
useEffect 能够在组件渲染后实现各类不一样的反作用。有些反作用可能须要清除,因此须要返回一个函数:
useEffect(() => {
function handleStatusChange(status) {
setIsOnline(status.isOnline);
}
ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
<!--返回-->
return () => {
ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
};
});
复制代码
简版
当组件实例被建立并插入 DOM 中时,其生命周期调用顺序以下:
constructor()
static getDerivedStateFromProps()
render()
componentDidMount()
当组件的 props 或 state 发生变化时会触发更新。组件更新的生命周期调用顺序以下:
static getDerivedStateFromProps()
shouldComponentUpdate()
render()
getSnapshotBeforeUpdate()
componentDidUpdate()
若是 shouldComponentUpdate() 返回 false,则不会调用 render()。
componentWillUnmount()
当渲染过程,生命周期,或子组件的构造函数中抛出错误时,会调用以下方法:
static getDerivedStateFromError() componentDidCatch()
取代componentWillReceiveProps()。这个钩子是从props去取到state的值。
getSnapshotBeforeUpdate() 在最近一次渲染输出(提交到 DOM 节点)以前调用。它使得组件能在发生更改以前从 DOM 中捕获一些信息(例如,滚动位置)。今生命周期的任何返回值将做为参数传递给 componentDidUpdate()。
此用法并不常见,但它可能出如今 UI 处理中,如须要以特殊方式处理滚动位置的聊天线程等。
应返回 snapshot 的值(或 null)。
React 经过制定大胆的 diff 策略,将 O(n3) 复杂度的问题转换成 O(n) 复杂度的问题;
React 经过分层求异的策略,对 tree diff 进行算法优化;
React 经过相同类生成类似树形结构,不一样类生成不一样树形结构的策略,对 component diff 进行算法优化;
React 经过设置惟一 key的策略,对 element diff 进行算法优化;
建议,在开发组件时,保持稳定的 DOM 结构会有助于性能的提高;
建议,在开发过程当中,尽可能减小相似将最后一个节点移动到列表首部的操做,当节点数量过大或更新操做过于频繁时,在必定程度上会影响 React 的渲染性能。 zhuanlan.zhihu.com/p/2034637
在AntDesign出品的babel-plugin-import 安装以上插件后,在.babelrc
服务端渲染:渲染过程在服务器端完成,最终的渲染结果 HTML 页面经过 HTTP 协议发送给客户端。对于客户端而言,只是看到了最终的 HTML 页面,看不到数据,也看不到模板。
客户端渲染:服务器端把模板和数据发送给客户端,渲染过程在客户端完成。
服务端渲染的优势就是客户端渲染的缺点,服务端渲染的缺点同时也是客户端渲染的优势,反之亦然
Next.js 作的是同构渲染。同一套代码既能够在服务器端渲染,也能够在客户端渲染。Exciting当咱们首次访问时,换言之当咱们访问首屏页面时,Next.js 使用服务器端渲染,为咱们返回已经渲染完成的最终 HTML 页面。这样就同时解决了首屏白屏问题以及 SEO 问题。此后当咱们再进行交互时,则使用客户端渲染。HTML、CSS、JS 等资源都不须要再从新请求,只须要经过 ajax/websocket 等途径获取数据,在客户端完成渲染过程。
Context 设计目的是为了共享那些对于一个组件树而言是“全局”的数据,例如当前认证的用户、主题或首选语言。Context提供了一个无需为每层组件手动添加props,就能在组件树间进行数据传递的方法。
const ThemeContext = React.createContext('light'); //建立context,设置默认值
复制代码