跳到主要内容

ConsolePatchDev 控制台补丁开发

开发者寄语
  • 帮助函数,用于修补 console.log ,以避免在渲染函数无副作用重放期间记录日志。
  • 目前这仅是懒加载地修补对象,如果 log 函数被提前提取,则无法覆盖。
  • 我们也可以选择提前修补该方法。

一、 禁用日志

export function disableLogs(): void {
if (__DEV__) {
if (disabledDepth === 0) {
prevLog = console.log;
prevInfo = console.info;
prevWarn = console.warn;
prevError = console.error;
prevGroup = console.group;
prevGroupCollapsed = console.groupCollapsed;
prevGroupEnd = console.groupEnd;
// https://github.com/facebook/react/issues/19099
const props = {
configurable: true,
enumerable: true,
value: disabledLog,
writable: true,
};
Object.defineProperties(console, {
info: props,
log: props,
warn: props,
error: props,
group: props,
groupCollapsed: props,
groupEnd: props,
});
}
disabledDepth++;
}
}

二、开启日志

export function reenableLogs(): void {
if (__DEV__) {
disabledDepth--;
if (disabledDepth === 0) {
const props = {
configurable: true,
enumerable: true,
writable: true,
};
// $FlowFixMe[cannot-write] Flow thinks console is immutable.
Object.defineProperties(console, {
log: { ...props, value: prevLog },
info: { ...props, value: prevInfo },
warn: { ...props, value: prevWarn },
error: { ...props, value: prevError },
group: { ...props, value: prevGroup },
groupCollapsed: { ...props, value: prevGroupCollapsed },
groupEnd: { ...props, value: prevGroupEnd },
});
}
if (disabledDepth < 0) {
console.error(
'disabledDepth fell below zero. ' +
'This is a bug in React. Please file an issue.',
);
}
}
}

三、常数

1.

let disabledDepth = 0;
let prevLog;
let prevInfo;
let prevWarn;
let prevError;
let prevGroup;
let prevGroupCollapsed;
let prevGroupEnd;

function disabledLog() {}
disabledLog.__reactDisabledLog = true;