0
0
Lập trình
Flame Kris
Flame Krisbacodekiller

Cách Làm Cho Lập Trình JavaScript Vui Nhộn Như Clojure

Đăng vào 6 tháng trước

• 4 phút đọc

Giới Thiệu

Trong lập trình, việc tìm kiếm niềm vui và sự hứng thú là điều rất quan trọng. Bài viết này sẽ hướng dẫn bạn làm cho việc lập trình JavaScript trở nên thú vị hơn, giống như cách mà các lập trình viên Clojure làm. Chúng ta sẽ khám phá REPL (Read-Eval-Print Loop) - một công cụ tuyệt vời giúp bạn tương tác với mã ngay lập tức.

REPL Là Gì?

REPL là viết tắt của Read-Eval-Print Loop, và trong Clojure, đây là cách mà các lập trình viên làm việc với mã. Nó cho phép bạn viết mã, chạy ngay lập tức và xem kết quả ngay lập tức. Điều này giúp cho quá trình phát triển trở nên nhanh chóng và thú vị hơn.

Những Vấn Đề Với REPL Mặc Định Của NodeJS

Mặc dù REPL của NodeJS có thể hữu ích, nhưng nó cũng có một số hạn chế:

  • Không thân thiện với người dùng: Bạn không thể thấy toàn bộ bức tranh khi chạy mã trong terminal.
  • Không kiểm tra mã trước: Mã không được lint hoặc kiểm tra trước khi chạy.
  • Chuyển đổi liên tục: Bạn phải liên tục chuyển đổi giữa trình soạn thảo và terminal, điều này có thể làm bạn mất tập trung.

Cách Làm Cho Lập Trình JavaScript Thú Vị Hơn

Cài Đặt Conjure Trong Neovim

Để mang lại trải nghiệm REPL cho JavaScript, bạn có thể sử dụng plugin Conjure trong Neovim. Dưới đây là các bước cài đặt:

  1. Cài đặt Neovim.
  2. Cài đặt Conjure.
  3. Cài đặt NodeJS.
  4. Cài đặt Treesitter và chạy :TSInstall javascript trong Neovim.
  5. Tạo một tệp mới có đuôi ".js" và mở nó trong Neovim (ví dụ: nvim repl-test.js trong terminal). Conjure sẽ tự động kết nối nếu mọi thứ được thiết lập đúng.

Tại Sao Nên Sử Dụng REPL?

Sử dụng REPL giúp bạn:

  • Giảm thiểu bug.
  • Cảm nhận được dòng chảy của mã.
  • Tinh chỉnh mã nhanh chóng.

Ví Dụ Thực Tế

javascript Copy
const mult = (a, b) => a * b;
mult(3, 4);  // (out) 12
mult(5, 3);  // (out) 15
mult(10, 8); // (out) 80

Bạn có thể kiểm tra giá trị của một biểu thức nhanh chóng bằng cách nhấn <localleader>ee.

Gỡ Lỗi Nhanh Chóng

REPL giúp kiểm tra các bước trung gian dễ dàng:

javascript Copy
[1, 2, 2, 3].reduce((acc, x) => { 
  console.log("acc", acc);
  console.log("x", x);
  console.log("val", acc[x]);
  return { ...acc, [x]: ++acc[x] || 1 }; 
}, {});

Bạn sẽ ngay lập tức thấy từng bước trong log buffer của Conjure.

Ví Dụ Clojure

Trong Clojure, các lập trình viên thường định nghĩa một hàm và ngay lập tức kiểm tra nó trong khối (comment ...):

clojure Copy
(defn name-extractor [m] (get m :name))
(comment 
   (name-extractor {:name "Kisha"}) ;; "Kisha"
   (name-extractor {:age 20}))      ;; nil

Nếu muốn trả về :noname khi trường bị thiếu, chúng ta chỉ cần điều chỉnh hàm:

clojure Copy
(defn name-extractor [m]
   (get m :name :noname))

Thực Hiện Tương Tự Trong JavaScript

javascript Copy
function nameExtractor({ name }) {
  return name || "noname";
}
nameExtractor({ name: "John" }); // 'John'
nameExtractor({ age: 15 });      // 'noname'
nameExtractor({ name: "" });     // 'noname'

Bạn có thể viết các trường hợp thử nghiệm nhỏ ngay bên trong mã và điều chỉnh từng bước.

Khám Phá RXJS

RXJS có thể cảm thấy trừu tượng lúc đầu, nhưng với REPL, bạn có thể thử nghiệm tương tác và thấy kết quả ngay:

javascript Copy
import { BehaviorSubject } from "rxjs"
import { combineLatestWith, map, tap } from "rxjs/operators"

let o1 = new BehaviorSubject({ a: 1 })
let o2 = new BehaviorSubject({ b: 6 })

o1.pipe(combineLatestWith(o2),
  tap(x => console.log("combined:", x)),
  map(([{ a }, { b }]) => a + b),
  tap(x => console.log("sum:", x))
).subscribe()

o1.next({ a: 2 })
o2.next({ b: 8 })

o1.unsubscribe()
o2.unsubscribe()

Bạn có thể điều chỉnh giá trị, chạy lại và ngay lập tức quan sát cách các biến đổi hoạt động.

Các Phím Tắt Hữu Ích

  • <localleader>ef - đánh giá toàn bộ tệp.
  • <localleader>ts - chuyển đổi chế độ Stray Out Mode (để xem các đánh giá bị trì hoãn như setTimeout).
  • <localleader>cr - khởi động lại REPL (xóa tất cả các đánh giá trước đó).
  • <localleader>E - đánh giá một khối văn bản đã chọn trong chế độ hình ảnh (tuyệt vời cho các ví dụ JSDoc).

Đặc Điểm Của NodeJS (Được Xử Lý Bởi Conjure)

  • Các hàm mũi tên không thể được định nghĩa lại trong REPL của NodeJS, nhưng Conjure chuyển đổi chúng thành các hàm thông thường.
  • import không được hỗ trợ trong REPL của NodeJS, nhưng Conjure chuyển đổi nó thành require.

Kết Luận

Những mẹo này có thể giúp quy trình làm việc của bạn trong JavaScript nhanh hơn, tương tác hơn và gần gũi hơn với phong cách REPL của Clojure. Một vòng phản hồi ngắn hơn không chỉ giúp lập trình trở nên thú vị hơn, mà còn giúp bạn viết mã sạch hơn và đáng tin cậy hơn.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào