// Credits: borrowed code from fcomb/redux-loggerimport {
deepCopy } from "../util";/*** 关于 createLogger 的使用: ===> 以插件的方式进行使用。用于打印 vuex 使用过程中的消息日志。* import { createLogger } from 'vuex';const store = new Vuex.store({state: {},mutations: {},actions: {},plugins: process.env.NODE_DEV !== 'production' ? [createLogger()]:[],strict: true});export default store;* */
export default function createLogger({
//用于判断使用 console.group ,还是使用 console.grounpCollased 来进行分组打印消息。collapsed = true,//用于设置 commit 的过滤条件,该函数返回false,则表示不打一个当前commit行为的日志消息。filter = (mutation, stateBefore, stateAfter) => true,//将 state 数据转换成自定义的格式。transformer = (state) => state,//将 mutation 数据 { type, payload } 转化为自定义的格式。mutationTransformer = (mut) => mut,//用于设置 dispatch 的过滤条件,该函数返回false,则表示不打一个当前dispatch行为的日志消息。actionFilter = (action, state) => true,//将 action 数据 { type, payload } 转化为自定义的格式。actionTransformer = (act) => act,//是否要开启打印所有 commit 行为的日志消息。logMutations = true,//是否要开启打印所有 dispatch 行为的日志消息。logActions = true,//指定打印日志的对象。默认为 consolelogger = console,
} = {
}) {
//在 store.js 的 constructor() 方法中调用 plugins.forEach((plugin) => plugin(this)); 传入的参数 this 就是 store。//也就是说,下面的这个函数,是在 store 初始化时就被调用了的。return (store) => {
//深度拷贝一份 store.state 对象, 这个state是 store._vm 实例 data 中的state属性数据。let prevState = deepCopy(store.state);//如果没有指定打印输出对象,直接返回。默认是 console.if (typeof logger === "undefined") {
return;}//如果指定了 logMutations ,则订阅 mutation 消息队列。if (logMutations) {
//当 commit(_type, _payload, _options) 函数被调用时,该订阅回调函数会被调用。store.subscribe((mutation, state) => {
//第一个参数: mutation 是 const mutation = { type, payload }; type是 namspace;//第二个参数: state 就是 store.stateconst nextState = deepCopy(state);//用于判断是否要打印这个 mutation 的日志。默认是所有commit都会触发打印日志。if (filter(mutation, prevState, nextState)) {
//获取当前的时间的”时分秒毫秒“。const formattedTime = getFormattedTime();//对mutation进行格式转化,默认是不处理。const formattedMutation = mutationTransformer(mutation);//mutation.type 就是 commit() 方法调用时候的第一个参数;const message = `mutation ${
mutation.type}${
formattedTime}`;//开启分组,以 message 作为消息日志的分组的名称。startMessage(logger, message, collapsed);logger.log("%c prev state","color: #9E9E9E; font-weight: bold",//转换 state 数据格式。默认是不转换。 prevState 展示改变数据之前的 state。transformer(prevState));logger.log("%c mutation","color: #03A9F4; font-weight: bold",//格式转换之后的 { type, payload } 数据,即 commit 的第一个参数,第二个参数。这两个参数是被store.unifyObjectStyle()统一处理过的。formattedMutation);logger.log("%c next state","color: #4CAF50; font-weight: bold",//转换 state 数据格式。默认是不转换。 nextState 展示改变数据之后的 state。transformer(nextState));//结束分组。endMessage(logger);}//nextState 成为下一次 commit 时的旧 state。prevState = nextState;});}//如果开启了打印 action 日志的属性。if (logActions) {
//当 dispatch(_type, _payload) 函数被调用时,该订阅回调函数会被调用。store.subscribeAction((action, state) => {
//判断是不是要过滤掉当前 dispatch 事件的日志,默认是打印所有的 dispatch 行为日志。if (actionFilter(action, state)) {
//获取当前的时间的”时分秒毫秒“。const formattedTime = getFormattedTime();//获取转换格式的 action 对象; action 是这个数据 const action = { type, payload };这两个参数是被store.unifyObjectStyle()统一处理过的。const formattedAction = actionTransformer(action);//日志分组的名称const message = `action ${
action.type}${
formattedTime}`;//开启console日志分组。startMessage(logger, message, collapsed);//开始打印日志。logger.log("%c action","color: #03A9F4; font-weight: bold",//formattedAction 仅仅是个数据对象。{ type, payload }formattedAction);//结束console日志分组。endMessage(logger);}});}};
}/*console.group(); 开启一个分组==> 这之间 console 打印的内容,会被收集到一个分组,且展开和收起。console.groupEnd(); 结束一个分组console.groupCollapsed() 方法用于设置折叠的分组信息,在这个代码以下执行输出的信息都会再折叠的分组里。点击扩展按钮打开分组信息。第一个参数是 console;第二个参数是 message 表示分组的名称。*/
function startMessage(logger, message, collapsed) {
const startMessage = collapsed ? logger.groupCollapsed : logger.group;try {
//使用上面的 console.group 或者 console.groupCollapsed 来打印。startMessage.call(logger, message);} catch (e) {
//如果上面的方法不存在,则使用 console.log 来打印。logger.log(message);}
}/*对于使用了 console.group(), console.groupCollapsed() 方法打印日志,则需要使用 console.groupEnd() 来结束。 */
function endMessage(logger) {
try {
logger.groupEnd();} catch (e) {
logger.log("—— log end ——");}
}/*** 获取当前日期的格式化时间 "HH:mm:ss.msecond"*/
function getFormattedTime() {
//获取当前日期。const time = new Date();//保证小时,分钟,秒都是2位数, 毫秒是3位数。return ` @ ${
pad(time.getHours(), 2)}:${
pad(time.getMinutes(), 2)}:${
pad(time.getSeconds(),2)}.${
pad(time.getMilliseconds(), 3)}`;
}/*将 str 重复 times 次。比如 str="hello", times=2 ===> 返回结果为 "hellohello" */
function repeat(str, times) {
return new Array(times + 1).join(str);
}/*左填充0,当 num 的长度不够 maxLength 时,填充0. */
function pad(num, maxLength) {
return repeat("0", maxLength - num.toString().length) + num;
}
详细解决方案
vuex3源码注释系列 /src/plugins/logger.js
热度:49 发布时间:2023-10-26 11:43:05.0
相关解决方案
- J4ME-开源的UI Logger 项目,该如何处理
- Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:该怎么处理
- Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:该如何解决
- weblogic 支配报错 tried to access method org.apache.log4j.Logger
- Java日志管理:Logger.getLogger()跟LogFactory.getLog()的区别(详解Log4j) 转发
- Wordpress图片相本插件/ Gallery Plugins
- javascript logger blackbird jquery 改建
- (轻巧)调试JavaScript的旺旺插件(基于jzshmyt的javascript-logger)
- 关于支付宝控件 关于navigator.plugins,该怎么处理
- jQuery插件写法入门图书(Plugins/Authoring)
- log4j 每个类都要写private Logger logger = Logger.getLogger(类名吗解决方法
- 请教net.cybercorlin.util.logger.appender.IMAppender在哪个Jar包里面
- LogFactory.getLog(),Logger.getLogger()这两种记录日志的方法有撒区别啊谢拉!解决办法
- 急WARN No appenders could be found for logger (org.hibernate.cfg.Environment,该怎么处理
- 我 的目的 是想写个LogExtend类 继承org.apache.log4j.Logger (
- java logger 日志的有关问题
- import org.apache.log4j.Logger;这个包报错应该怎么解决
- Eclipse 惯用 plugins 插件
- MyEclipse中施用Hibernate时出现log4j:WARN No appenders could be found for logger 警告信息解决
- MyEclipse9 破译 找不到Common\plugins\com.genuitec.eclipse.core_9.0.0.me201103181703.jar
- java.util.logging.Logger?解决办法
- log4j:WARN No appenders could be found for logger,该怎么解决
- ADT for exlipse plugins 就要过时了
- 一个 Activity 加了 Logger 以后,Logger 总是为空,咋回事呢
- 您的日志组件记录够清晰嘛?自己开发日志组件 Logger
- java.lang.NoClassDefFoundError: Lorg/slf4j/Logger
- idea的Maven配置问题:Cannot resolve plugin org.apache.maven.plugins:maven-clean-plugin:2.5
- log4j警告之log4j:WARN No appenders could be found for logger(org.apache.ibatis.logging.LogFactory).
- springboot org.slf4j.Logger 添加日志到文件 logback-spring.xml
- nagios监控mysql(percona-monitoring-plugins)