0
0
Lập trình
Admin Team
Admin Teamtechmely

Khám Phá Deno: Từ Python Đến Thế Giới Mới

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

• 9 phút đọc

Khám Phá Deno: Từ Python Đến Thế Giới Mới

Tôi bắt đầu học Python một cách nghiêm túc vào năm 2020 khi làm việc trên một công cụ tạo ghi chú phát hành cho một ngân hàng hợp tác. Python rất dễ hiểu, thú vị để làm việc và là một lý do hoàn hảo để học hỏi điều gì đó mới mẻ. Nếu bạn giống như tôi, bạn sẽ yêu thích việc thử nghiệm, khám phá những điều mới và không ngừng cải thiện bản thân.

Từ đó, Python trở thành ngôn ngữ mặc định của tôi cho hầu hết mọi thứ. Tôi đã xây dựng API REST với FastAPI và Flask, phân tích dữ liệu với Jupyter, tạo ứng dụng CLI với Click—bạn có thể gọi tên nó. Tôi thực sự sử dụng Python như bữa sáng hàng ngày.

Một điều thú vị là, vào thời điểm đó, tôi chỉ sử dụng TypeScript và Node.js. Dù không hoàn hảo cho công việc DevOps của tôi, nhưng nó vẫn hoàn thành nhiệm vụ.

Và rồi một ngày, tôi quyết định hoàn toàn đắm mình vào Python. Tôi không biết nhiều về nó lúc đầu, nhưng tôi bắt đầu học trong khi xây dựng công cụ tạo ghi chú phát hành—và từ đó, tôi đã bị cuốn hút.

Vậy chuyện gì đã xảy ra? Tại sao lại thay đổi?

Để rõ ràng, tôi không nói rằng Python là một ngôn ngữ tồi. Tôi vẫn sẽ sử dụng nó cho những trường hợp cụ thể—nó là một công cụ tuyệt vời để xây dựng phần mềm nhanh chóng.

Các vấn đề tôi gặp phải không phải lúc nào cũng liên quan đến bản thân Python. Một số đến từ hệ sinh thái xung quanh nó, trong khi những vấn đề khác đến từ sự kiệt sức mà tôi trải qua khi cố gắng đẩy Python vào những nhiệm vụ mà nó không được thiết kế để thực hiện. Theo thời gian, sự ma sát đó bắt đầu vượt qua niềm vui khi sử dụng ngôn ngữ này.

Pin không bao gồm

Quản lý gói của Python… thực sự, nó khá lộn xộn. Theo mặc định, bạn có pip. Cài đặt một gói, và nó sẽ được cài đặt toàn hệ thống mà không tạo ra tệp phụ thuộc như package.json của Node. Bạn muốn chạy ứng dụng của mình trên một môi trường khác với tất cả các gói phù hợp? Chúc bạn may mắn—bạn cần nhớ từng gói và phiên bản của nó. Chắc chắn, pip freeze > requirements.txt có đó, nhưng nó không tự động. Mỗi lần bạn thêm một gói mới, bạn phải chạy lại nó. Và đừng nghĩ đến việc quên kích hoạt một môi trường ảo—nếu chạy nó toàn cầu, bạn sẽ đổ hết tất cả các gói Python của hệ thống vào requirements.txt.

Bạn có thể sử dụng Poetry, pyenv hoặc các công cụ khác, nhưng khi tôi bắt đầu một dự án mới, tôi mong ngôn ngữ đi kèm với một trình quản lý gói tích hợp, sử dụng được. Tôi không muốn phải lắp thêm một công cụ nữa chỉ để có được chức năng cơ bản mà các hệ sinh thái khác cung cấp ngay từ đầu.

Chạy ứng dụng của bạn trong Python cũng không tốt hơn. Trong Node.js, bạn có npm run start; trong Spring, mvn spring-boot:run. Python? Bạn chỉ có thể hy vọng ai đó đã tài liệu hóa nó trong README hoặc thêm một Makefile. Cả hai đều không phải là bản địa, rõ ràng, hoặc nhất quán.

Và các môi trường ảo… đừng để tôi bắt đầu. Chúng là di sản của quá khứ, gây thêm ma sát hơn là giải quyết vấn đề. Các kịch bản kích hoạt cồng kềnh hoạt động khác nhau giữa các shell và hệ điều hành, quản lý thủ công dễ mắc lỗi, và khả năng tái sản xuất yếu. Trong thế giới ngày nay—nơi mà các container, Poetry, và thậm chí venv tích hợp của Python tồn tại—virtualenv cảm thấy lỗi thời, dễ gãy và không hiệu quả. Chúng khiến những gì lẽ ra đơn giản trở thành một công việc khó nhọc.

Đặt một khối vuông vào lỗ hình tam giác (hoặc Cách Tôi Bị Kiệt Sức)

Bạn có biết món đồ chơi cổ điển với các lỗ hình dạng khác nhau và các khối tương ứng không? Bạn đã bao giờ cố gắng ép một khối vuông vào lỗ hình tam giác chưa? Tất nhiên, nó không vừa. Lựa chọn hiển nhiên là lỗ hình vuông, được thiết kế hoàn hảo cho khối vuông. Nhưng nếu bạn cứng đầu như tôi, bạn có thể xoay, lật, thậm chí cầm một cái cưa để thay đổi hình tam giác—chỉ để nhận ra rằng bạn đã tái tạo lại lỗ hình vuông. Bạn đã có thể chỉ cần sử dụng lỗ hình vuông ban đầu từ đầu.

Tôi đang đi đến đâu với điều này? Các ngôn ngữ lập trình cũng tương tự—mỗi ngôn ngữ nổi bật trong những lĩnh vực cụ thể. Java xuất sắc trong lập trình hướng đối tượng, TypeScript giữ cho các kiểu dữ liệu của bạn luôn chính xác, và COBOL vẫn thống trị thế giới ngân hàng với các hệ thống ổn định. Vấn đề của tôi không phải là với chính Python—mà là cách mà đôi khi nó được sử dụng.

Python là ngôn ngữ đa mô hình: bạn có thể viết mã hướng đối tượng, thủ tục, hàm, hoặc hỗn hợp. Nhưng đa mô hình không có nghĩa là hoàn hảo cho mọi thứ. Tôi từng làm việc trên một API REST với FastAPI. Ban đầu, nó rất đơn giản và dễ theo dõi. Sau đó, đến giai đoạn “hãy làm cho nó hướng đối tượng hơn để dễ bảo trì”. Đột nhiên, mỗi tính năng yêu cầu các mẫu thiết kế phức tạp, biến mã thành spaghetti. Việc hiểu nó trở thành một công việc toàn thời gian, và các thay đổi cảm thấy như leo núi. Nó thậm chí còn góp phần vào sự kiệt sức—tôi bắt đầu ghét Python và FastAPI hoàn toàn.

Từ trải nghiệm đó, tôi đã học được: sự phức tạp xâm nhập nhanh chóng nếu đội ngũ của bạn không đồng ý về những nguyên tắc cốt lõi như KISS (Giữ cho nó đơn giản, ngốc nghếch) và DRY (Đừng lặp lại chính mình). Tập trung quá nhiều vào mã “hoàn hảo” thay vì cung cấp giá trị là một cái bẫy. Khách hàng quan tâm đến kết quả, chứ không phải cách mà phần mềm của bạn được kiến trúc đẹp đẽ ra sao.

Bài học rút ra: Đừng ép một khối vuông vào lỗ hình tam giác. Hãy sử dụng công cụ phù hợp cho công việc, và hãy cứu chính bạn khỏi những cơn đau đầu.

Deno: Từ một loài bò sát đến loài khác

Bạn có thể đã đoán được—tiến tới, tôi sẽ sử dụng Deno với TypeScript cho các dự án của mình. Tôi đã quen thuộc với TypeScript và Node.js, nhưng Deno là một lãnh thổ mới với tôi. Vậy Deno là gì? Deno là một môi trường chạy JavaScript hiện đại được tạo ra bởi Ryan Dahl, người cũng đã xây dựng Node.js.

Mục tiêu chính của nó rất đơn giản: cung cấp một cách thức không phức tạp để phát triển phần mềm với JavaScript và TypeScript, mà không gặp phải nhiều rắc rối như Node.js.

Tôi đã làm việc với Deno một thời gian và trở thành một fan hâm mộ lớn. Tôi sẽ không đi sâu vào mọi lợi thế mà Deno có so với Node.js hoặc Python—chỉ những điều quan trọng nhất với tôi.

Hỗ trợ TypeScript một cách tự nhiên

Không còn những cơn đau đầu với tsconfig hay lãng phí thời gian tinh chỉnh hàng loạt tùy chọn biên dịch. Quên việc phải điều chỉnh các bước xây dựng và chuyển đổi riêng biệt, hoặc kết nối một bundler bổ sung chỉ để chạy mã. Và tốt nhất là, không còn vở kịch CommonJS so với ESM—bạn cuối cùng có thể ngừng tìm kiếm lỗi import/export vào lúc 2 giờ sáng và chỉ cần viết mã hoạt động.

Pin bao gồm

Deno đi kèm với một bộ công cụ tích hợp: một trình chạy thử nghiệm, một trình phân tích mã, một trình định dạng mã, và một trình quản lý gói. Điều này có nghĩa là bạn có thể bỏ qua những rắc rối thông thường của việc cấu hình từng công cụ riêng lẻ. Đối với tôi, hai điều nổi bật thực sự là trình chạy thử nghiệm và trình quản lý gói—chúng giúp việc viết, chạy và quản lý mã của bạn trở nên dễ dàng ngay từ đầu.

Trình quản lý gói

Một trong những tính năng nổi bật của Deno là trình quản lý gói của nó. Khi bạn cài đặt một gói mới, Deno tự động thêm tham chiếu vào tệp deno.json của bạn—không cần phải chạy npm install riêng biệt khi bạn chuyển dự án sang máy tính khác. Tạm biệt sự hỗn loạn pip freeze hoặc việc phải quản lý các môi trường ảo chỉ để chạy ứng dụng của bạn.

Chạy phần mềm của bạn cũng đơn giản như vậy. Deno cung cấp một cách rõ ràng và nhất quán để thực thi mã của bạn, và bạn thậm chí có thể cấu hình các tác vụ trực tiếp trong tệp deno.json của mình để đơn giản hóa quy trình làm việc.

Dưới đây là một ví dụ về cấu hình deno.json:

json Copy
{
  "imports": {
    "@hono/swagger-ui": "jsr:@hono/swagger-ui@^0.5.2",
    "@hono/zod-openapi": "npm:@hono/zod-openapi@^1.1.0",
    "hono": "jsr:@hono/hono@^4.9.5",
    "hono-openapi": "npm:hono-openapi@^0.4.8",
    "mongoose": "npm:mongoose@^8.0.0",
    "zod": "npm:zod@^4.1.5"
  },
  "tasks": {
    "start": "deno run --watch -A src/main.ts"
  },
  "compilerOptions": {
    "jsx": "precompile",
    "jsxImportSource": "hono/jsx"
  }
}

Trình chạy thử nghiệm

Deno đi kèm với một trình chạy thử nghiệm tích hợp, có nghĩa là không còn phải vật lộn với Jest hay các khuôn khổ kiểm thử đơn vị nặng nề khác. Việc chạy thử nghiệm thật đơn giản và không rắc rối. Đây là cách bạn thực hiện trong Deno—thực sự rất đơn giản.

typescript Copy
// idOdd_test.ts
Deno.test("isEven", () => {
  const result = (4 % 2) == 0;
  console.assert(result);
});

// Và bạn chạy nó như thế này
// deno test idOdd_test.ts

Tương thích với Node.js và npm

Nếu bạn giống như tôi, bạn có thể có một vài gói npm yêu thích đã trở thành công cụ không thể thiếu của bạn—Next.js là một trong số đó. Tin tốt là? Với Deno, bạn có thể chạy các gói npm yêu thích của mình cũng giống như bạn đã làm trong Node.js.

Để xem điều này trong hành động, hãy tạo một ứng dụng Express.js đơn giản:

bash Copy
# Khởi tạo dự án
deno init dinosaur-express
cd dinosaur-express

# Cài đặt express.js
deno add npm:express

Bây giờ chúng ta sẽ tạo một tệp main.ts trong thư mục và thêm mã sau:

typescript Copy
// @ts-types="npm:@types/express@4.17.15"
import express from "express";

const app = express();

app.get("/", (req, res) => {
  res.send("Chào mừng đến với Dinosaur Express!");
});

app.listen(8000);
console.log(`Máy chủ đang chạy tại http://localhost:8000`);

Cuối cùng, chúng ta sẽ thêm đoạn mã sau vào tệp deno.json của bạn:

json Copy
{
  "scripts": {
    "dev": "deno run --allow-net --allow-env main.ts"
  }, 
  ...
}

Và chạy nó:

bash Copy
deno run dev

Đây là những gì bạn sẽ nhận được trên terminal.

Và đây là những gì API của bạn sẽ trả về:

Python vẫn mạnh mẽ, nhưng đối với tôi, Deno + TypeScript cảm giác như công cụ đúng đắn cho chương tiếp theo. Bạn nghĩ sao—hãy ở lại với những điều cổ điển hay thử nghiệm các môi trường mới?

“Không phải loài nào mạnh nhất trong số các loài sinh tồn, cũng không phải loài thông minh nhất, mà là loài thích nghi tốt nhất với sự thay đổi.” — Charles Darwin


Hình banner được lấy từ bài viết thông báo Deno 1. Nó có thể được tìm thấy tại đây.
Bài viết gốc được xuất bản trên trang web của tôi tại đây.

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