Babel Coder

เมื่อโลกนี้ไม่ได้มีแค่ console.log

beginner

แม้จอคอมของเราจะแสดงผลได้หลากสี แต่พวกเรายังคงชื่นชอบสีขาวดำที่จืดชืดจาก console.log กันอยู่

เพื่อนๆหลายคนที่เคยใช้ logger บางตัวเช่น redux-logger อาจคุ้นตากับสีสรรแบบนี้

redux-logger

แหมค่อยให้ความรู้สึกคุ้มค่ากับ Retina Display ที่ซื้อมาหน่อย! ในบทความนี้เราจะมาดูกันซิว่า Console API นั้นทำอะไรได้บ้าง นอกจากแสดงข้อความอันจืดชืดจาก console.log ครับ

สารบัญ

แต่งแต้มสีสันให้ console.log

ในคืนงานเต้นรำ ซิลเดอเรลล่าสามารถล่าเหยื่อเป็นเจ้าชายได้เพราะเธอมาในชุดราตรีแสนสวย ทางกลับกันถ้าเธอแต่งชุดโทนดำแฟชั่นงานศพ ทหารคงไล่เธอกลับตั้งแต่ยังไม่เหยียบประตูวังแล้วครับ

console.log ที่จืดชืดด้วยข้อความสีดำก็เช่นกัน ถ้าเราใส่สีสันเข้าไปซักหน่อย แม้จะมีบั๊คต่อแถวให้แก้อีกเป็นร้อย เราก็คงอิ่มเอิบกับสีสรรที่งามตา… มั้งนะ

วิธีตกแต่งสไตล์ให้ console.log นั้น เราสามารถใช้ CSS ได้ครับผ่าน %c ดังนี้

console.log("%cBabel Coder rocks!", 'font-style: italic; color: #18D8A9');

เราก็จะได้ข้อความแสนสวยงามดังรูป

console-log-color

แต่ถ้าความสวยงามระดับนี้ยังไม่จุใจ ก็ใส่ CSS แบบจัดเต็มไปเลยแบบนี้ก็ได้เช่นกัน (ขอไม่ลงโค๊ดนะครับ มันยาว)

console-log-rainbow

รวมกลุ่มข้อความเข้าด้วยกัน

คุณอยากพิมพ์ข้อมูลสินค้าแต่ละประเภทออกมา โดยสินค้าประเภทเดียวกันก็ต้องรวมกลุ่มเข้าด้วยกัน

const categories = [
  {
    title: 'สินค้าทาสแมว',
    products: [
      { id: 1, title: 'ธูปบูชาเทพเจ้าแมว' },
      { id: 2, title: 'ชักโครกแมว' }
    ]
  },
  {
    title: 'สินค้าเจ้าตูบ',
    products: [
      { id: 3, title: 'อาหารเม็ดสูตรหมาเมิน' }
    ]
  }
]

หลังการเขียนโค๊ดตามโจทย์ข้างต้น หน้าตาของช่องคอนโซลจะเป็นเช่นนี้

console group

ซื้อเลย! นี่หละครับคือการใช้งาน console.group เพื่อรวมสิ่งที่สัมพันธ์กันไว้ภายใต้กลุ่มเดียวกันดังแสดงในโค๊ดนี้

const categories = [
  {
    title: 'สินค้าทาสแมว',
    products: [
      { id: 1, title: 'ธูปบูชาเทพเจ้าแมว' },
      { id: 2, title: 'ชักโครกแมว' }
    ]
  },
  {
    title: 'สินค้าเจ้าตูบ',
    products: [
      { id: 3, title: 'อาหารเม็ดสูตรหมาเมิน' }
    ]
  }
]

// พิมพ์ประเภทต่างๆของสินค้า
function printCategories(categories) {
  console.log('=== All Categories ===')
  
  for(const { title, products } of categories) {
    // พิมพ์ชื่อประเภทสินค้าออกมาก่อนโดยถือว่าชื่อนี้คือชื่อของกลุ่ม
    console.group(title)
    // ภายใต้ประเภทสินค้าดังกล่าว เราจะแสดงรายการสินค้าเหล่านั้น
    printProducts(products)
    // เมื่อแสดงรายการสินค้าในกลุ่มนั้นจบ ถือว่าสิ้นสุดการแสดงผลในกลุ่มนี้
    console.groupEnd()
  }
}

// พิมพ์รายการสินค้า
function printProducts(products) {
  for(const product of products) {
    console.log(product)
  }
}

printCategories(categories)

console group

จากรูปที่ได้ เราจะเห็นว่าแต่ละกลุ่มเปิดเผยไส้ในตั้งแต่ต้น แล้วถ้าเกิดเราอยากให้แต่ละกลุ่มแสดงแค่ชื่อกลุ่มแต่ต้นหละจะทำยังไง?

เราสามารถใช้ console.groupCollapsed ได้ครับเพื่อแก้ปัญหาข้างต้น ผลลัพธ์จากการใช้ groupCollapsed จะเป็นเช่นดังภาพ

console group collapsed

function printCategories(categories) {
  console.log('=== All Categories ===')
  
  for(const { title, products } of categories) {
    // อยู่ตรงนี้ไงพวกนาย
    console.groupCollapsed(title)
    printProducts(products)
    console.groupEnd()
  }
}

Log Level

เป็นธรรมดาของ logger ที่จะต้องมี log level

สำหรับ console.log นั้นถือว่าเป็น DEBUG ในคอนโซล เรามารู้จัก level อื่นๆของ console กันครับ

  • console.error สำหรับพ่นข้อผิดพลาดเช่น runtime errors หรือเงื่อนไขที่ไม่ได้คาดคิดและส่งผลกระทบต่อการใช้งาน
  • console.warn ใช้สำหรับการแจ้งเตือนในระดับที่ไม่ใช่ข้อผิดพลาด แต่ถ้ายังวอนแบบนี้อีกเอ็งได้ตายแน่ ตัวอย่างการใช้งานเช่น แจ้งเตือนสำหรับ deprecated API เป็นต้น
  • console.info ใช้เพื่อให้ข้อมูลที่น่าสนใจ เช่น ตอนนี้คอมโพแนนท์ตัวนี้เริ่มทำงานแล้วนะ คอมโพแนนท์ตัวนั้นกำลังจะหยุดทำงานแล้วนะ คอมพิวเตอร์ไหม้แล้วนะ ดับซิ ดับ รอไร!
  • console.debug ให้ข้อมูลเชิงลึกถึงการทำงานต่างๆ พูดง่ายๆก็เหมือนเป็นการ log ระบบออกมาดูว่าทำอะไรอยู่ ดังนั้น console.debug จึงมีค่าเหมือน console.log ยังไงหละ
console.error('ERROR')
console.warn('WARN')
console.info('INFO')
console.debug('DEBUG')
console.log('LOG')

จากโค๊ดข้างบนเราจะได้ log สารพัดสี ตามแต่ความร้ายแรงของ level เช่นนี้ครับ

console log level

แสดงผลข้อมูลในตารางด้วย console.table

ถ้าเรามีข้อมูลเป็นอาร์เรย์ แล้วต้องการแสดงผลในรูปแบบตาราง เราสามารถใช้ console.table ได้ครับ

หมายเหตุ console.table ไม่ใช่ API มาตรฐาน อาจไม่สามารถใช้ได้ในบางเบราเซอร์ ผู้ใช้จึงควรหลีกเลี่ยงในกรณีที่ต้องการสันบสนุนในทุกเบราเซอร์

const students = [
  { id: 1, name: 'Somchai Haha', advisor: 'Somsree Hehe' },
  { id: 2, name: 'Somnumna Haha', advisor: 'Somsree Hehe' },
  { id: 3, name: 'Somtum Halo', advisor: 'Somsree Hehe' },
]

console.table(students)

ผลลัพธ์จากการพิมพ์อาร์เรย์ข้างต้นจะได้รูปแบบตารางดังนี้

console table

จับเวลาการทำงานด้วย console.time

บางครั้งเราก็อยากทราบว่าคำสั่งที่เราเขียนนั้นใช้เวลาประมวลผลไปเท่าไหร่ console.time ช่วยให้เพื่อนๆจับเวลาข้อคำสั่งได้ เสมือนมีนาฬิกาส่วนตัวแปะใน console

สมมติเราต้องการพิจารณาว่า กรณีที่มีอาร์เรย์มากช่อง คำสั่ง reduce หรือ for จะประมวณผลเพื่อบวกตัวเลขโดยใช้เวลาน้อยกว่ากัน เราสามารถออกคำสั่งได้ดังนี้

const nums = [...Array(10e5).keys()]

console.time()
nums.reduce((sum, item) => sum + item)
console.timeEnd()

console.time()
let sum = 0
for(const item of nums) {
  sum += item
}
console.timeEnd()

เราจะพบว่าในกรณีอาร์เรย์มากช่อง การใช้ reduce จะประหยัดเวลาในการประมวลผลเพื่อทำการบวกมากกว่า for นั่นเอง

console time

ยังมีรายละเอียดสำหรับการใช้งาน Console API อีกมากที่ผมไม่ได้เขียนไว้ เพื่อนๆที่สนใจเพิ่มเติมสามารถอ่านได้ที่เอกสารจาก MDN


แสดงความคิดเห็นของคุณ


No any discussions