Thử 🏃‍♀️ chạy chart.js trên web đơn giản

Thử 🏃‍♀️ chạy chart.js trên web đơn giản

👋 Giới thiệu

Chart.js là thư viện dành cho JavaScript thuần để vẽ các loại đồ thị phổ biến.

Bên cạnh các Chart lib dành cho riêng các Framework/lib như React, Angular, Vue, Svelte..., thì chart.js có thể dùng được ở mọi nơi mà không cần Framework nào cả.

Cũng chính điều này là điểm yếu của chart.js khi không tận dụng được sức mạnh của các Framework/lib hiện đại.

Ngoài ra source-code của Chart.js không được viết bằng TypeScript.

Web trong bài viết này sẽ chạy thử đoạn source-code giới thiệu của chart.js.

🎒 Chuẩn bị

Cài đặt NodeJs có thể dùng nvm - Node Version Manager.

Cài pnpm - NodeJs package manager tiết kiệm dung lượng ổ cứng, tương tự như yarn, npm:

npm install -g pnpm

Khởi tạo package.json:

pnpm init -y
cat package.json

Ta thấy file package.json trống không. Ta tiếp tục cài npm - chart.js:

pnpm i chart.js

Output:

Packages are hard linked from the content-addressable store to the virtual store.
  Content-addressable store is at: /home/{your-username}/.pnpm-store/v3
  Virtual store is at:             node_modules/.pnpm
Progress: resolved 1, reused 0, downloaded 1, added 1, done

dependencies:
+ chart.js 3.5.0

Trong file package.json đã có:

"dependencies": {
  "chart.js": "^3.5.0"
}

Phiên bản chart.js ta đang dùng ở đây là 3.5.0.

Khởi tạo index.html:

touch index.html
code index.html

💅 Vẽ 1 chart đơn giản

Copy đoạn code dưới đây vào index.html:

<!DOCTYPE html>
<html>
  <style>
    .wrapper {
      width: 400px;
      height: 400px;
    }
  </style>
  <body>
    <h1>My First Chart.js web!</h1>

    <div class="wrapper">
      <canvas id="myChart" width="400" height="400"></canvas>
    </div>

    <script src="node_modules/chart.js/dist/chart.js"></script>

    <script>
      const ctx = document.getElementById('myChart').getContext('2d');
      const myChart = new Chart(ctx, {
        type: 'bar',
        data: {
          labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange'],
          datasets: [
            {
              label: '# of Votes',
              data: [12, 19, 3, 5, 2, 3],
              backgroundColor: [
                'rgba(255, 99, 132, 0.2)',
                'rgba(54, 162, 235, 0.2)',
                'rgba(255, 206, 86, 0.2)',
                'rgba(75, 192, 192, 0.2)',
                'rgba(153, 102, 255, 0.2)',
                'rgba(255, 159, 64, 0.2)',
              ],
              borderColor: [
                'rgba(255, 99, 132, 1)',
                'rgba(54, 162, 235, 1)',
                'rgba(255, 206, 86, 1)',
                'rgba(75, 192, 192, 1)',
                'rgba(153, 102, 255, 1)',
                'rgba(255, 159, 64, 1)',
              ],
              borderWidth: 1,
            },
          ],
        },
        options: {
          scales: {
            y: {
              beginAtZero: true,
            },
          },
        },
      });
    </script>
  </body>
</html>

Mở trực tiếp file html này bằng browser như Chrome, ta thấy biểu đồ đã được vẽ:

Screenshot from 2021-08-10 15-38-16.png

🕵️‍♀️ Giải thích source-code

Ta để ý tham số đầu tiên sẽ là ctx - CanvasRenderingContext2D lấy từ DOM element của thẻ canvas thông qua id="myChart".

CanvasRenderingContext2D là 1 phần của bộ Canvas API, cung cấp nội dung 2D được render (vẽ) ra trên bề mặt thẻ canvas.

Thử tưởng tượng thằng này nó cũng giống như 1 khung tranh mà ta có thể vẽ và xóa đi bất cứ cái gì mà ta muốn.

type: 'bar' mô tả loại đồ thị là các cột thẳng đứng có độ cao thấp phụ thuộc vào số liệu.

labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange'] là tên của các loại data, được ghi bên dưới cột.

label: '# of Votes' là phần chú thich trên cùng.

backgroundColor, borderColor, borderWidth là style của từng cột theo thứ tự array.

Phần options.scales.y, beginAtZero: true tức là các cột sẽ được vẽ từ mốc data từ 0.

Nếu set là false thì các cột sẽ được vẽ từ mốc data của cột thấp nhất, và cũng vì thế nên cột thấp nhất có độ cao là 0.

Như vậy là ta đã dùng thử xong ví dự cơ bản của chart.js.

📖 Tham khảo


Photo by Nicholas Cappello on Unsplash