专栏名称: 程序员鱼皮
鹅厂全栈开发,持续分享编程技法和实用项目
目录
相关文章推荐
乐游上海  ·  总计9000万元!2025“乐游上海”旅游消 ... ·  2 天前  
l 看齐 l  ·  周杰伦,突传新消息! ·  3 天前  
l 看齐 l  ·  周杰伦,突传新消息! ·  3 天前  
51好读  ›  专栏  ›  程序员鱼皮

领导竟被我的花式 log 吸引,直接写入公司库!

程序员鱼皮  · 公众号  ·  · 2024-05-24 13:58

正文

大家好,我是程序员鱼皮。今天逛编程社区时发现了一篇很有趣的文章,作者是一名前端开发,将最最最不起眼的功能 console.log 折腾出了花来,甚至 “征服” 了领导!给大家分享一下,学一手骚操作~

本文作者:石小石Orz(已授权转载)
来源: https://juejin.cn/post/7371716384847364147

背景简介

这几天代码评审,领导无意中看到了我本地代码的控制台,被我花里胡哨的控制台打印内容吸引了!

老板看见后,说我这东西有意思,花里胡哨的,他喜欢!

但是随即又问我,这么花里胡哨的东西,上生产会影响性能吧?我自信的说:不会,代码内有判断的, 只有开发环境会打印

老板很满意,于是让我给其他前端同事分享一下,讲解下实现思路!最终,这个方法还被写入公司的公用 utils 库里,供大家使用!

console 简介

console 是前端用于调试和记录信息的内置对象(类似 Java 的 print),提供了多种方法,可以帮助开发者输出各种信息,进行调试和分析。

1、console.log()

用于输出一般信息,大家应该在熟悉不过了。

2、console.info()

输出信息,与 console.log 类似,但在某些浏览器中可能有不同的样式。

3、console.warn()

输出警告信息,通常会以黄色背景或带有警告图标的样式显示。

4、console.error()

输出错误信息,通常会以红色背景或带有错误图标的样式显示。

5、console.table()

以表格形式输出数据,适用于数组和对象。

例如:

const users = [
    { name'石小石'age18 },
    { name'刘亦菲'age18 }
];
console.table(users);

效果如图:

通过上述介绍,我们可以看出,原生的文本信息、警告信息、错误信息、数组信息打印出来的效果都很普通,辨识度不高!现在我们通过 console.log 来实现一些花里花哨的样式!

技术方案

console.log()

console.log() 可以接受任何类型的参数,包括字符串、数字、布尔值、对象、数组、函数等。最厉害的是,它支持占位符!

常用的占位符:

  • %s - 字符串
  • %d or %i - 整数
  • %f - 浮点数
  • %o - 对象
  • %c - CSS 样式

格式化字符串

console.log() 支持类似于 C 语言 printf 函数的格式化字符串。我们可以使用占位符来插入变量值。

const name = 'Alice';
const age = 30;
console.log('Name: %s, Age: %d', name, age); // Name: Alice, Age: 30

添加样式

可以使用 %c 占位符添加 CSS 样式,使输出内容更加美观。






    
console.log('%c This is a styled message''color: red; font-size: 20px;');

效果如图:

自定义样式的实现,其实主要是靠 %c 占位符添加 CSS 样式实现的!

实现美化的信息打印

1、基础信息打印

我们创建一个 prettyLog 方法,用于逻辑编写,示例代码如下:

// 美化打印实现方法
const prettyLog = () => {
  const isEmpty = (value) => {
    return value == null || value === undefined || value === '';
  };
  const prettyPrint = (title, text, color) => {
    console.log(
      `%c ${title} %c ${text} %c`,
      `background:${color};border:1px solid ${color}; padding: 1px; border-radius: 2px 0 0 2px; color: #fff;`,
      `border:1px solid ${color}; padding: 1px; border-radius: 0 2px 2px 0; color: ${color};`,
      'background:transparent'
    );
  };
  // 基础信息打印
  const info = (textOrTitle, content = '') => {
    const title = isEmpty(content) ? 'Info' : textOrTitle;
    const text = isEmpty(content) ? textOrTitle : content;
    prettyPrint(title, text, '#909399');
  };
  return {
    info
  };
};

上述代码定义了一个 prettyLog 函数,用于美化打印信息到控制台。通过自定义样式,输出信息以更易读和美观的格式呈现。

我们使用一下看看效果:

// 创建打印对象
const log = prettyLog();
// 不带标题
log.info('这是基础信息!');
//带标题
log.info('注意看''这是个男人叫小帅!');

效果如图:

info 方法用于输出信息级别的日志。它接受两个参数:textOrTitle 和 content。如果只提供一个参数,则视为内容并设置默认标题为 Info;如果提供两个参数,则第一个参数为标题,第二个参数为内容。最后调用 prettyPrint 方法进行输出。

2、错误信息打印

代码如下:

const error = (textOrTitle, content = '') => {
    const title = isEmpty(content) ? 'Error' : textOrTitle;
    const text = isEmpty(content) ? textOrTitle : content;
    prettyPrint(title, text, '#F56C6C');
};
// 创建打印对象
const log = prettyLog();
log.error('奥德彪''出来的时候穷 生活总是让我穷 所以现在还是穷。');
log.error('前方的路看似很危险,实际一点也不安全。');

效果如图:

3、成功信息与警告信息打印

const warning = (textOrTitle: string, content = '') => {
    const title = isEmpty(content) ? 'Warning' : textOrTitle;
    const text = isEmpty(content) ? textOrTitle : content;
    prettyPrint(title, text, '#E6A23C');
};
const success = (textOrTitle: string, content = '') => {
    const title = isEmpty(content) ? 'Success ' : textOrTitle;
    const text = isEmpty(content) ? textOrTitle : content;
    prettyPrint(title, text, '#67C23A');
};

// 创建打印对象
const log = prettyLog();
log.warning('奥德彪''我并非无路可走 我还有死路一条! ');
log.success('奥德彪''钱没了可以再赚,良心没了便可以赚的更多。 ');

效果如图:

实现图片打印

图片打印会更复杂一些,但绝大多数的代码都是在调整样式:

const picture = (url: string, scale = 1) => {
    const img = new Image();
    img.crossOrigin = 'anonymous';
    img.onload = () => {
        const c = document.createElement('canvas');
        const ctx = c.getContext('2d');
        if (ctx) {
            c.width = img.width;
            c.height = img.height;
            ctx.fillStyle = 'red';
            ctx.fillRect(00, c.width, c.height);
            ctx.drawImage(img, 00);
            const dataUri = c.toDataURL('image/png');
            console.log(
                `%c sup?`,
                `font-size: 1px;
                padding: ${Math.floor((img.height * scale) / 2)}px ${Math.floor((img.width * scale) / 2)}px;
                background-image: url(${dataUri});
                background-repeat: no-repeat;
                background-size: ${img.width * scale}px ${img.height * scale}px;
                color: transparent;
                `

            );
        }
    };
    img.src = url;
};

// 创建打印对象
const log = prettyLog();
log.picture('图片地址');

效果如图:

图片地址支持 base64,如果图片是 url 链接,则必须开启了跨域访问才能打印。

实现美化的数组打印

打印对象或者数组,其实用原生的 console.table 比较好,不用自己封装了:

const data = [
  { id1name'Alice'age25 },
  { id2name'Bob'age30 },
  { id3name'Charlie'age35 }
];

console.table(data);

效果如图:

当然,我们也可以伪实现:

const table = () => {
    const data = [
        { id1name'Alice'age25 },
        { id2name'Bob'age30 },
        { id3name'Charlie'age35 }
    ];
    console.log(
        '%c id%c name%c age',
        'color: white; background-color: black; padding: 2px 10px;',
        'color: white; background-color: black; padding: 2px 10px;',
        'color: white; background-color: black; padding: 2px 10px;'
    );
    data.forEach((row) => {
        console.log(
            `%c ${row.id} %c ${row.name} %c ${row.age} `,
            'color: black; background-color: lightgray; padding: 2px 10px;',
            'color: black; background-color: lightgray; padding: 2px 10px;',
            'color: black; background-color: lightgray; padding: 2px 10px;'
        );
    });
};

效果如图:

但是,我们无法控制表格的宽度,因此,这个方法不太好用,个人感觉不如原生。







请到「今天看啥」查看全文