js相关
  1. try…catch无法捕获的错误

总体来说就是异步错误,类似下面这种情况是无法捕获的:

// setTimeout中的错误
try {
  setTimeout(function () {
    throw new Error('error in setTimeout'); // 200ms后会把异常抛出到全局
  }, 200);
} catch (err) {
  console.error('catch error', err); // 不会执行
}

// Promise中的错误
try {
  Promise.resolve().then(() => {
    throw new Error('error in Promise.then');
  });
} catch (err) {
  console.error('catch error', err);
}

改正方法:

  1. 改成await写法
  2. then里写try…catch
  3. 使用全局捕捉Promise异常方法,window上有一个事件unhandledrejection,监听并处理即可
lerna

Lerna 介绍

实际上lerna就是基于集成了git的npm包封装了常用命令。

  1. 注意npm login公网和私网用户名不能冲突,应当取不同的账户名
浏览器渲染流程

How_browsers_work

  1. 注意chrome浏览器的每一个tab都是一个单独的render进程,其中只包含一个js引擎线程
  2. js和css的资源的下载会阻塞DOM渲染主进程
小程序相关
解剖小程序的 setData

小程序是双线程设计,逻辑层和渲染层通信需要传递数据,传输的数据,会转换为字符串形式传递, 故应尽量避免

  1. 单次传递大量数据,比如一个大对象。
  2. 频繁调用setData
【小程序代码自查】小程序闪退-内存泄露

一般开发过程中,会有以下这几种情况导致内存泄露:

  1. 将页面实例挂载到全局对象上
  2. 通过暴露内部函数给外部对象,导致存在作用域的引用
  3. 存在定时执行的函数存在对页面实例的引用,页面销毁没有清除定时器
  4. 通过延时执行的函数循环调用,并存在对页面实例的引用,页面销毁没有停止调用。
小程序首屏加载性能优化总结
  1. 优化setData调用次数,具体做法是合并冗余调用,例如不要在循环里一直调用setData
  2. 优化setData单次传递数据大小,将一个大对象拆开,只取需要的部分进行setData
  3. 接口预加载,从上个页面跳转的时候预先异步请求接口(不阻塞跳转),然后将接口数据放到内存里,这样首屏就可以直接用到数据,省去了请求接口导致渲染阻塞的时间,适用于页面首屏依赖单一接口的情况
  4. 页面DOM治理,将首屏不需要的DOM 比如popup等使用变量控制渲染,比如v-if

正则表达式

表示非

JS编译原理

JS编译原理

字符流->词法分析->语法分析生成AST->边解释边执行