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:
- Cài đặt Neovim.
- Cài đặt Conjure.
- Cài đặt NodeJS.
- Cài đặt Treesitter và chạy
:TSInstall javascripttrong Neovim. - Tạo một tệp mới có đuôi ".js" và mở nó trong Neovim (ví dụ:
nvim repl-test.jstrong 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
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
[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
(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
(defn name-extractor [m]
(get m :name :noname))
Thực Hiện Tương Tự Trong JavaScript
javascript
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
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.
importkhông được hỗ trợ trong REPL của NodeJS, nhưng Conjure chuyển đổi nó thànhrequire.
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.