Tin được không, JavaScript sắp có type!?

Tin được không, JavaScript sắp có type!?

Những mẩu tin ngắn hàng ngày dành cho bạn
  • Hẳn là nhiều người ở đây đã nghe đến kiểu tấn công bảo mật Clickjacking rồi nhỉ. Kẻ tấn công thường nhúng một website (thường là mục tiêu) vào trong một iframe trên website của chúng, sau đó làm mờ hoặc ẩn nó đi rồi đặt vào vị trí các nút bấm trên web, ví dụ "Bấm vào để nhận quà". Đâu ai ngờ rằng phía trên nút bấm đó là một nút bấm khác trong iframe. Khá nguy hiểm!

    Nhưng trình duyệt đã có cách ngăn chặn kiểu tấn công này bằng các quy tắc như tiêu đề X-Frame-Options, frame-ancestors của CSP và SameSite: Lax/Strict của Cookies...

    Mới đây, đã xuất hiện thêm kiểu tấn công mới - "DoubleClickjacking" 😨. Đại ý là "hắn" lợi dụng hành động double click để lừa người dùng bấm vào một nút mà hắn muốn. Chi tiết hơn trong bài viết này: DoubleClickjacking: A New Era of UI Redressing.

    » Xem thêm
  • Mọi người đã nghe nói đến Jujutsu - jj - một dạng quản lý phiên bản cho mã nguồn (version control system) chưa? Có vẻ như nó đang nhận được nhiều sự quan tâm.

    Chờ xíu! Chẳng phải git đã quá tốt rồi sao? Thế thì chế ra thằng jj để làm gì nữa? Cũng hơi khó trả lời nhỉ? Mỗi công cụ sinh ra chắc chắn phải cải thiện hoặc khắc phục được nhược điểm của cái trước. Cho nên jj ắt hẳn phải làm được điều gì đó mà git chưa làm được nên mới nổi lên như vậy.

    Thật ra mình đã nghe nói đến jj từ vài tháng trước rồi, nhưng vào đọc thì toàn kiến thức cao siêu. Hoặc là đang mang nặng cái lối suy nghĩ của git vào trong đầu rồi nên chưa lĩnh hội ra được điều gì cả.

    Mình hay có kiểu cái gì đọc lần 1 mà không hiểu thì đọc tiếp lần 2, lần 2 không hiểu thì đọc tiếp lần 3... đến lần thứ n mà vẫn không hiểu thì bỏ. Cơ mà không phải là từ bỏ mà một thời gian sau đó quay lại đọc tiếp. Đến một lúc nào đó khả năng mình sẽ hiểu ra một ít vấn đề, thế mới tài 😆.

    Thì cái jj này có vẻ như nó đang mở ra được tính linh hoạt trong việc "cam kết" mã. Tưởng tượng bạn đang làm việc trên một dự án, đang ở nhánh này, muốn sang nhánh khác để sửa, nhưng mà lại đang viết dở ở nhánh này, thế là phải stash, rồi checkout, rồi commit, rồi merge hoặc rebase lại vào nhánh cũ... nhìn chung quá trình làm việc với git nghiêm ngặt đến mức cứng nhắc, cần nhiều thao tác để giải quyết một vấn đề, chưa kể cái cây commit (commit-tree) nữa thì ôi thôi, khỏi xem cho đỡ nhức mắt. Thế nên ông jj này đang làm cách nào đó để bạn khỏi cần phải quan tâm đến các nhánh luôn, sửa trực tiếp vào commit. Nghe ảo nhỉ 😂.

    Đấy mới lĩnh hội được đến đấy, hy vọng sau n lần đọc lại nữa mình sẽ viết được một bài chi tiết hơn về công cụ này.

    » Xem thêm
  • Gòi gòi tới công chiện gòi 🤤🤤🤤

    » Xem thêm

Vấn đề

Một trong những điều tôi thấy ấn tượng khi bắt đầu làm việc với JavaScript là nó không có type (dynamically typed). Có nghĩa là không cần khai báo kiểu dữ liệu cho tất cả mọi thứ tạo ra. Điều đó giúp cho thời gian viết mã nhanh hơn và thoải mái hơn. Ngược lại, việc không xác định trước kiểu dữ liệu cũng gây ra nhiều rắc lỗi trong việc gỡ lỗi và bảo trì dự án sau này.

Giữa lúc đó, TypeScript ra đời mang đến "statically typed" cho Javascript. Nghĩa là giờ đây bạn đã có thể khai báo kiểu cho hầu hết mọi thứ, tránh được nhiều lỗi khi viết mã hơn và mã trông có vẻ tường minh hơn rất nhiều. Về bản chất, TypeScript là một công cụ hỗ trợ kiểu cho JavaScript, sau đó nó biên dịch cú pháp của ts thành js để cho trình duyệt, Node.js... có thể hiểu và thực thi.

Gần đây TC39 đang ấp ủ một kế hoạch gọi là Type Annotations. Một bước tiến giúp cho JavaScript có thể khai báo kiểu. Đặc biệt hơn là cú pháp kiểu gần như là "cóp nhặt" từ TypeScript. Vậy điều gì đang xảy ra? Có phải JavaScript đang muốn "lấn sân" để trở thành một ngôn ngữ định kiểu? Điều đó có làm cho cộng đồng giận giữ khi giờ đây viết mã trở nên phức tạp và gò bó hơn? Hãy cùng tôi tìm hiểu qua bài viết dưới đây nhé!

TC39 và quy trình phát triển tính năng cho JavaScript

Trước tiên, hãy nói về TC39 và cách mà TC39 phát triển một tính năng mới cho JavaScript.

Ủy ban Ecma TC39 chịu trách nhiệm phát triển ngôn ngữ lập trình ECMAScript (JavaScript) và soạn thảo thông số kỹ thuật. TC39 hoạt động theo sự đồng thuận và có toàn quyền thay đổi thông số kỹ thuật khi thấy phù hợp. Tuy nhiên, có một quy trình chung để thực hiện các thay đổi thông số kỹ thuật.

Các thay đổi được hình thành từ mức ý tưởng cho đến khi chúng được thực sự triển khai thông qua nhiều bước nghiêm ngặt. Có năm giai đoạn: giai đoạn ý tưởng ban đầu và 4 giai đoạn tiếp sau đó. TC39 phải thông qua và nghiệm thu từng giai đoạn.

Type Annotations là một trong những nỗ lực đưa JavaScript đến gần với ngôn ngữ được định kiểu. Bước vào giai đoạn 1, nghĩa là Type Annotations đã vượt qua được vòng gửi xe. Ở giai đoạn này, nó phải mô tả được nhiều hơn những điều cần làm cũng như xác định được những thách thức tiềm tàng để đi tiếp vào các vòng tiếp theo. Khoảng thời gian này có lẽ còn dài nhưng hãy điểm lại xem với đặc tả này mang lại cho chúng ta điều gì nhé.

Type Annotations hoạt động như thế nào?

Đề xuất này nhằm mục đích cho phép các nhà phát triển thêm định kiểu vào mã JavaScript của họ, để cho các công cụ kiểm tra kiểu như TypeScript vẫn có thể hoạt động bình thường. Khi chạy, công cụ JavaScript bỏ qua các kiểu dữ liệu, coi đó chỉ như là chú thích. Type Annotations sinh ra không phải để thay thế TypeScript hay khác công cụ định kiểu khác. Nó sinh ra đề trả lời cho câu hỏi "JavaScript nên hoạt động như thế nào khi có type".

Cụ thể hơn là cho phép các nhà phát triển chạy các chương trình được viết bằng TypeScript, Flow... và các công cụ định kiểu khác cho JavaScript mà không cần dịch mã, với điều kiện các ngôn ngữ định kiểu này phải nằm trong tập con của định nghĩa Type Annotation hỗ trợ.

Ví dụ:

let str:string = "hello world";
str = 5;

Nếu chạy trong môi trường JavaScript, đoạn mã khi vẫn chạy bình thường, JavaScript không quan tâm đến type của str nên nó vừa có thể là string nhưng gán lại bằng một số vẫn không sao. Tuy nhiên, nếu compile bằng TypeScript một lỗi sẽ xuất hiện cảnh báo việc gán một kiểu number cho string là không hợp lệ.

Hiện tại, có nhiều đề xuất cho Type Annotations. Chúng cố gắng làm sao cho giống với TypeScript nhất có thể, vì điều này là cách tốt nhất để hỗ trợ "kiểu" cho JavaScript mà vẫn tương thích với TypeScript.

Một số ví dụ có thể kể đến như:

Biến kiểu:

let x: string;

Type:

type CoolBool = boolean;

Interface:

interface Person {
    name: string;
    age: number;
}

Export:

export interface Person {
    name: string;
    age: number;
}
export type { SomeLocalType };
export type { SomeType as AnotherType } from "some-module";

Và còn nhiều định nghĩa khác. Để xem chi tiết, bạn đọc có thể truy cập vào trang mô tả của Type Annotations.

Nếu TypeScript đã đủ tốt vậy tại sao phải sinh ra Type Annotations?

Thứ nhất, phải nói rằng TypeScript không phải là JavaScript, vì thế nó không chịu sự quản lý của TC39.

Thứ hai, điều mà cộng đồng yêu cầu nhiều nhất ở JavaScript là khả năng hỗ trợ kiểu. Theo các cuộc khảo sát về Javascript trong năm 20202021 thì nó luôn nằm trong top đầu về điều mà các nhà phát triển muốn nhất.

khảo sát JavaScript

Tuy nhiên, TypeScript đã làm rất tốt việc định kiểu này - nó đã được sử dụng rất rộng rãi với nhiều tín hiệu cho thấy mọi người muốn tiếp tục sử dụng nó. Nếu TC39 làm một thứ hoàn toàn mới thì liệu có gây khó dễ cho cộng đồng phát triển?

Vì lẽ đó, có thể họ muốn tìm một giải pháp để dung hòa giữa cộng đồng và các ngôn ngữ định kiểu dựa trên JavaScript. Vốn đã phát triển rất mạnh mẽ, JavaScript không thể tự ý thay đổi tất cả mọi thứ để đưa nó thành ngôn ngữ định kiểu, cũng như không muốn phải tự mình "phát minh lại bánh xe".

Nếu điều đó thành hiện thực, giờ đây TypeScript có thể chạy trực tiếp trong trình duyệt mà không cần qua bước "build" thành JavaScript nữa, giúp tối ưu hóa đáng kể trải nghiệm của nhà phát triển.

Đồng thời, đây cũng là cơ sở tiêu chuẩn để định kiểu cho Javascript. Bằng cách tiêu chuẩn hóa kiểu dữ liệu, nó sẽ làm cơ sở cho tất cả các trình biên dịch kiểu, giúp mọi việc trở nên dễ dàng hơn đối với các nhà phát triển.

Tổng kết

TC39 chịu trách nhiệm phát triển ngôn ngữ lập trình JavaScript. Những tính năng mới phải vượt qua 5 vòng để đi vào triển khai trong thực tế. Gần đây, Type Annotations như một nỗ lực nhằm mang lại định kiểu dữ liệu cho JavaScript, nhưng với một cách "thoải mái" hơn chứ không phải gò bó. Các bạn nghĩ sao về vấn đề này, còn tôi thì thấy đây là một điều rất đáng để chờ đợi. Vì vẫn còn nhiều thay đổi cho đến khi Type Annotations được đưa vào chính thức, chỉ mong sao nó đủ tốt để giảm bớt sự phức tạp của các công cụ định kiểu.

Cao cấp
Hello

Bí mật ngăn xếp của Blog

Là một lập trình viên, bạn có tò mò về bí mật công nghệ hay những khoản nợ kỹ thuật về trang blog này? Tất cả bí mật sẽ được bật mí ngay bài viết dưới đây. Còn chờ đợi gì nữa, hãy bấm vào ngay!

Là một lập trình viên, bạn có tò mò về bí mật công nghệ hay những khoản nợ kỹ thuật về trang blog này? Tất cả bí mật sẽ được bật mí ngay bài viết dưới đây. Còn chờ đợi gì nữa, hãy bấm vào ngay!

Xem tất cả

Đăng ký nhận thông báo bài viết mới

hoặc
* Bản tin tổng hợp được gửi mỗi 1-2 tuần, huỷ bất cứ lúc nào.

Bình luận (1)

Nội dung bình luận...
Avatar
Trịnh Cường1 năm trước
java is da bet@gif [MVDPX3gaKFPuo]
Trả lời
Bấm hoặc cuộn mạnh để sang bài mới