Ghi chép về Advent of Code 2023

Viết bởi @kcjpop

Đăng ngày

Cập nhật ngày

Dài 490 từ. Đọc trong 3 phút.

Lịch mùa Vọng bằng gỗ dành cho trẻ em
Lịch mùa Vọng bằng gỗ dành cho trẻ em. Nguồn ảnh: Elena Mozhvilo @ Unsplash

Đến hẹn lại lên, chương trình Advent of Code năm nay lại bắt đầu từ ngày 1.12 kéo dài đến 25.12. Mọi năm mình hay thử giải bằng một ngôn ngữ mới nhưng năm nay quyết định quay lại với JavaScript để xem có cần phải sử dụng tính năng gì đặc biệt của ngôn ngữ hay không.

Ngoài ra mình cũng sẽ thử học qua Parsing Expression Grammar (PEG) bằng cách dùng thư viện peggy. Mọi người nếu thấy mình viết chưa chuẩn thì để lại bình luận nhe.

Ngày 01

Giữ chỗ thôi chứ chưa viết xong 😀

Ngày 05

Sau mấy ngày viết đại viết đùa thì tới ngày 05 mình quyết định tạo project bằng pnpm và Node.js v18, và sắp xếp mọi thứ lại cho ngăn nắp hơn.

Để bắt đầu, mình chạy lệnh sau để tạo tập tin package.json.

$ pnpm init

Sau đó mình thêm thuộc tính "type": "module" vào package.json:

{
  "type": "module",
  "engines": {
    "node": ">= 18"
  }
}

Khai báo này là để sử dụng ES Modules (cú pháp import / export) cho tất cả tập tin có đuôi *.js.

Dự án được sắp xếp như sau:

src/
├── day05.js
├── day05.test.js
├── helpers.js
└── input
    ├── day05.sample.txt
    └── day05.txt

Cũng khá dễ hiểu đúng không? Tập tin helpers.js chứa các hàm hỗ trợ như đọc tập tin, hay các tác vụ hay dùng.

Sử dụng ES Modules trong Node.js

Mình nghĩ viết như vầy là được rồi, nhưng không 😱

import { readFile } from './helpers'

const sample = readFile('./input/day05.sample.txt')
const input = readFile('./input/day05.txt')

Chạy thử thì văng lỗi.

$ node --watch src/day05.js

Error [ERR_MODULE_NOT_FOUND]: Cannot find module
'/Users/an/code/advent-of-code/src/helpers'
imported from /Users/an/code/advent-of-code/src/day05.js

Ủa alô? Vô lý hết sức. File helpers.js rành rành ra đó mà báo “cannot find module” là sao. Thì ra nếu dùng ES Modules trong Node.js bạn phải kèm theo phần mở rộng khi import nữa.

-import { readFile } from './helpers'
+import { readFile } from './helpers.js'

Hơi mắc công một chút nhưng cũng không tới nỗi nào.

Watch mode trong Node.js v18

Từ phiên bản 16, Node.js đã có chế độ theo dõi và chạy lại dòng lệnh khi tập tin thay đổi.

$ node --watch src/day05.js

Tính năng này hiện vẫn đang được thử nghiệm và chưa đạt được mức độ ổn định cấp độ 2, nhưng mình thử qua thấy khá ổn. Không cần thiết phải cài nodemon nữa rồi.

Chạy tests trên Node.js v18

Cũng từ v16, Node.js có có đi kèm một chương trình chạy test. Ví dụ bạn có tập tin day05.test.js như sau:

import test from 'node:test'
import assert from 'node:assert'

import { p1, p2, sample } from './day05.js'

test('Day 05', (t) => {
  assert.strictEqual(p1(sample), 35)
  assert.strictEqual(p2(sample), 46)
})

Bạn có thể chạy lệnh:

$ node --test

Ngon lành ở chỗ test runner sẽ tự động scan và chạy các tập tin có đuôi là .test.(c|m)js, hoặc có chữ test- trong tên, hoặc tất cả tập tin trong thư mục test. Các trường hợp này là thường gặp nhất rồi, chi tiết hơn bạn có thể đọc ở đây.

Bản tin Ehkoo hàng tuần 💌

Đăng ký ngay để nhận những tin và bài viết mới nhất về lập trình frontend, cũng như các thủ thuật hay thư viện mới…

Powered by Buttondown

Gửi tặng cà phê ☕️

Nếu thấy bài viết này hữu ích, bạn có thể gửi tặng Ehkoo một ly cà phê theo link bên dưới 👇

Cám ơn bạn rất nhiều 🤗