Web Components vẫn ổn
(nolanlawson.com)- Tranh luận về web components không phải là vấn đề phải chọn duy nhất giữa hiệu năng cao nhất và tiêu chuẩn nền tảng, và ngay từ tiền đề rằng chúng phải thay thế mọi JavaScript framework đã là một giả định quá mức
- Custom Elements dùng DOM làm giao diện nên có overhead, nhưng trong sản phẩm thực tế cần đánh giá cùng lúc không chỉ hiệu năng mà còn khả năng bảo trì, bảo mật, tính dễ dùng và khả năng truy cập
- Chi phí hỗ trợ web components trong framework có thể được hấp thụ bằng một vài kiểm tra đơn giản, và việc là tính năng chuẩn không có nghĩa mọi framework bắt buộc phải chấp nhận
- Web components có điểm yếu ở server-side rendering (SSR), khả năng truy cập và một phần tính tương tác liên vận hành, nên vẫn còn những tình huống React, Solid và Svelte phù hợp hơn
- Trong những môi trường như Salesforce, nơi ứng dụng render phía client, có marketplace cho component và cần tương thích ngược lâu dài, web components có thể là một lựa chọn thực tế
Điểm khởi đầu của cuộc tranh luận và vị trí của tác giả
- Cuộc tranh luận gần đây tiếp nối từ bài “Web Components Are Not the Future” của Ryan Carniato và “Web Components Are Not the Future — They’re the Present” của Cory LaViska
- Trọng tâm không phải là công kích phe đối diện, mà gần hơn với câu hỏi liệu các lập trình viên có những ràng buộc khác nhau có thể tìm được điểm chung hay không
- Ryan Carniato được đánh giá rất cao nhờ Solid cùng công việc thiết kế framework và hiệu năng thể hiện qua
js-framework-benchmark - Bản thân web components cũng có phạm vi sử dụng thực tế gắn với việc triển khai framework, tạo component, Web Components Community Group, nhóm Accessibility Object Model, cùng các công việc về shadow DOM, custom elements và khả năng truy cập
Hiệu năng: chi phí của DOM là có thật, nhưng không phải là tất cả
- Điểm yếu cơ bản của web components nằm ở chỗ chúng dựa trên Custom Elements
- Mọi giao diện đều phải đi qua DOM nên phát sinh overhead hiệu năng
- Nếu mục tiêu là framework nhanh nhất một cách tuyệt đối thì cần giảm số DOM node nhiều nhất có thể, và theo tiêu chí này web components ở thế bất lợi
- Tuy vậy, hiệu năng không phải là tiêu chí duy nhất trong phát triển phần mềm
- Cần cân nhắc cả khả năng bảo trì, bảo mật, tính dễ dùng và khả năng truy cập
- Không render các thuộc tính
aria-*có thể giúp DOM render nhanh hơn đôi chút, nhưng chúng có thể cần thiết cho giao diện có khả năng truy cập - Những vi tối ưu hóa như
forloop nhanh hơn.forEach()hoặcvarnhanh hơnconst/letthường không đáng để đánh đổi nhiều
- Việc tối thiểu hóa DOM node là ý tưởng cốt lõi của virtualization
- Dù không phải lựa chọn nhanh nhất, đôi khi một cách tiếp cận đơn giản hơn đã là đủ
components as elementscũng không phải tối ưu nhất, nhưng mục tiêu không phải lúc nào cũng phải là tối ưu tuyệt đối
- Cách dùng chung custom elements được tạo bởi các framework khác nhau cũng có ý nghĩa trong thực tế
- Có thể cần chuyển dần từ Framework A sang Framework B
- Cũng có trường hợp phải kết hợp nhiều micro frontend
- Đây không phải giao diện nhanh nhất, nhưng có thể là đánh đổi cần thiết
- Trong hiệu năng web thực tế, những điểm cải thiện chi phí thấp như layout thrashing, network waterfall hay rerender không cần thiết thường phổ biến hơn
- Những cuộc so tài như
js-framework-benchmarkthú vị với tác giả framework, nhưng không phải lúc nào cũng mang tính quyết định trong bối cảnh sản phẩm thông thường - Nếu ở môi trường tài nguyên hạn chế mà từng mili giây đều quan trọng, lựa chọn bỏ web components cũng là hợp lý
- Những cuộc so tài như
Chi phí hỗ trợ của framework và quyền lựa chọn
- Tác giả không đồng ý với lập luận rằng hỗ trợ web components là chi phí quá lớn với người viết framework
- Việc phát hiện props và attributes có thể xử lý bằng kiểm tra
prop in element - Việc xuất ra web components có thể gây đau đầu, nhưng không phải việc mọi framework đều bắt buộc phải làm
- Vue 2 dùng riêng một web component wrapper library, còn Remount tồn tại mà không cần đầu vào từ team React
- Việc phát hiện props và attributes có thể xử lý bằng kiểm tra
- Framework vẫn có thể rất tốt dù bỏ qua các tính năng được thêm vào web platform từ sau năm 2011
- jQuery v1 vẫn còn chạy trên nhiều website
- Khi đội ngũ hiệu năng trình duyệt tối ưu cho các mẫu hành vi của lập trình viên web trong quá khứ, mã cũ đôi khi còn chạy nhanh hơn trên trình duyệt mới
- Việc tiếp nhận các tính năng mới của web platform kéo theo những cân nhắc mới
- Các tính năng như
Symbol,Proxy, Promises cũng thuộc cùng nhóm này - Nhờ tính tương thích ngược của web, mã đã viết vẫn có thể tiếp tục chạy sau 10 năm nữa
- Các tính năng như
- Hoàn toàn có thể có những framework không quan tâm hoặc không muốn hỗ trợ web components
- Có thể xây toàn bộ UI bằng web components
- Cũng có thể chỉ trộn một phần HTML web components
- Hoặc chọn không dùng chúng chút nào
- Một framework “no web components” vẫn có thể có người hâm mộ
Tiêu chuẩn là điểm tham chiếu, không phải nghĩa vụ
- Khi một tính năng trở thành tiêu chuẩn, lập trình viên sẽ tự nhiên coi đó là mốc so sánh mặc định
- Người viết component cần quyết định liệu
<slot>của mình có nên hoạt động như<slot>native hay không - Họ cũng phải chọn sẽ dùng
IntersectionObserverhay<img loading="lazy">, hoặc tự tạo abstraction riêng
- Người viết component cần quyết định liệu
- Tiêu chuẩn cung cấp điểm tham chiếu chung và từ vựng chia sẻ
- Nhờ đó có cơ sở để so sánh và đối chiếu những cách tiếp cận khác nhau
- Nhưng không phải cứ là tiêu chuẩn thì bắt buộc phải dùng
- Trên web luôn tồn tại song song các tính năng có thể không dùng tới và các API cũ
- Những API deprecated như
document.domain,with,<frame>vẫn tiếp tục được hỗ trợ - Các tính năng của web platform có thể được chọn dùng hoặc bỏ qua
- Những API deprecated như
Nơi web components phù hợp và không phù hợp
- Web components làm tốt nhiều việc, nhưng không phải công cụ để thay thế mọi JavaScript framework
- Các điểm yếu gồm server-side rendering (SSR), khả năng truy cập và một phần tính tương tác liên vận hành
- Vẫn còn rất nhiều tình huống mà các framework như React, Solid hay Svelte tỏa sáng hơn
- Câu nói “web components không phải là tương lai” có thể đúng với một số lập trình viên hoặc dự án nhất định
- Cốt lõi của cuộc tranh luận là thực tế rằng những con người khác nhau đang xây những thứ khác nhau dưới các ràng buộc khác nhau
Trường hợp Salesforce và đánh giá mang tính thực dụng
- Salesforce cho thấy một môi trường mà web components có thể rất phù hợp
- Họ xây ứng dụng render phía client
- Họ có marketplace cho component
- Họ cần đảm bảo tương thích ngược nghiêm ngặt
- Thời gian hỗ trợ được tính bằng nhiều năm, trong một số trường hợp là hàng chục năm
- Nếu không có những điều kiện đó, có thể không cần xây toàn bộ UI bằng web components, shadow DOM và toàn bộ cấu hình liên quan
- Trên web platform, game, dự án nghệ thuật và ứng dụng SaaS doanh nghiệp được tạo nên bằng nhiều tính năng khác nhau như WebGL, Wasm và Service Workers vẫn cùng tồn tại
- Khi nền tảng có thêm tính năng mới, sự sáng tạo không bị giới hạn đi mà cơ hội biểu đạt theo những cách trước đây chưa thể tưởng tượng lại tăng lên
- Có thể đọc thêm bài của Lea Verou tại đây và bài của Baldur Bjarnason tại đây
1 bình luận
Ý kiến trên Hacker News
Tôi đã cố hiểu bài viết được tham chiếu “Web Components Are Not the Future”, nhưng không thấy có nhiều lập luận thuyết phục
Tình trạng hiện nay của framework frontend khá hỗn loạn, và tôi không muốn học những thứ ma thuật (
useState,createSignal, v.v.) không thể hiểu được nếu chưa đọc tài liệu hay các framework phức tạpNếu bắt đầu từ Web Components thì cảm giác trực quan hơn, và còn có những khả năng không nơi nào khác có như cách ly Shadow DOM
Tôi cho rằng thứ duy nhất đáng giữ lại từ thời React là JSX, nên đã tạo một thư viện dùng Web Components cùng với JSX: https://webjsx.org
Không rõ là người đó không muốn học bản thân framework, hay muốn thứ gì đó có cảm giác ma thuật đến mức không cần học, hay có muốn đọc tài liệu hay không
Tôi chủ yếu dùng Vue, và dù hệ sinh thái SPA phức tạp, tôi cũng không rõ còn hệ thống nào khác khả thi để quản lý các ứng dụng client có trạng thái phức tạp
Mẫu cơ bản của jQuery là tập trung vào hiệu ứng phụ, chọn phần tử rồi thay đổi nó, còn React hay Vue.js cho phép tạo các component mà trạng thái UI được quyết định bởi dữ liệu
Khi dữ liệu thay đổi, UI được cập nhật với số thay đổi DOM tối thiểu; cách này khiến các widget UI theo từng vị trí dễ đọc và dễ bảo trì hơn nhiều
Website và ứng dụng desktop dựa trên web ngày nay phức tạp hơn nhiều so với 20 năm trước, nên nếu không chỉ làm UI đơn giản thì đổi mới ở khía cạnh quản lý trạng thái là rất quan trọng
useStatehoạt động bên trong như thế nào, và cách áp dụng nó khá trực quanNgược lại, thư viện được đưa ra có vẻ ngay từ đầu đã đòi hỏi một mô hình tư duy phức tạp hơn
Hiểu sâu chi tiết của framework tất nhiên là lý tưởng, nhưng React đã thành công ở chỗ cho phép tạo các ứng dụng khá tinh vi dù gần như không biết mô hình nội bộ của nó
Có lẽ cũng vì tôi là lập trình viên đã làm từ thời beta của C#, từ những ngày đầu của HTML/JS/CSS, nhưng tôi hiểu nó khá nhanh
Khi thay thế một cổng quản trị hạ tầng lõi cũ kỹ và phức tạp, chúng tôi chọn Angular, và nó ổn định, nhanh, đẹp mắt, mọi người đều hài lòng
“Đường cong học tập dốc” có vẻ chủ yếu đến từ những lập trình viên bước vào ngành chỉ biết JavaScript và một chút React; nếu có nhiều kinh nghiệm hơn thì có thể nắm bắt ngay
useState, bạn có thể đi đến câu trả lời hợp lý và đúng chỉ trong vài giâyNó không phức tạp hay ma thuật, và một triển khai tối thiểu tương tự React hook có thể làm trong vài trăm dòng
Việc triển khai
useStatevàrunFunctionComponentcơ bản còn dễ hơn hầu hết bài tập học kỳ 3 ngành khoa học máy tính ở đại họcNếu chừng đó đã là tiêu chuẩn của ma thuật, thì xung quanh ta toàn là những Warlock cấp 20 có thể tạo ra Eldritch Invocation mới ngay trong bữa sáng
Tôi nghĩ một lý do khiến hai bên trong cuộc tranh luận này lệch pha là vì họ đang tối ưu cho những đối tượng khác nhau
Nếu bạn đang ở một startup được VC đầu tư, cần di chuyển nhanh và xây dựng sản phẩm cốt lõi sẽ được bảo trì liên tục, framework có thể rất phù hợp
Nhưng trong phòng thí nghiệm học thuật, thường không có nhiều tiền để bảo trì ứng dụng đã làm, và nó vẫn phải tiếp tục hoạt động sau khi khoản tài trợ chuyển sang dự án mới
Tôi gần như đã hoàn tất việc viết lại một ứng dụng Vue bằng Web Components, vì các dependency đã mục nát đến mức không thể cập nhật
Trước đây tôi đã tốn thời gian sửa địa ngục dependency, và có lẽ sau này cũng sẽ tiếp tục như vậy; nhưng khi thử Web Components thì thấy tốt ngay nên đã chuyển sang
Số dependency giảm từ khoảng 15 xuống còn khoảng 1 (d3js), và tôi không hối tiếc
Ứng dụng cũ https://bam.iobio.io/, ứng dụng mới https://bam2.iobio.io/
Không ai ép phải nâng framework lên phiên bản mới nhất, nên lẽ ra cứ ở nguyên phiên bản Vue đang dùng cũng được
Nếu không có lý do đặc biệt, có thể dùng cùng một phiên bản đến cùng cũng ổn
Điều này không có nghĩa là ngay từ đầu trường hợp đó không cần Vue, hay việc loại bỏ dependency là lựa chọn tệ; nhưng nếu thích Vue thì dường như không có sức ép bắt buộc phải ở phiên bản mới nhất
Tôi tò mò liệu lý do Vue cần thêm dependency có nằm ở phía hệ thống build hay không
Vì vậy tôi không rõ vì sao hệ sinh thái VC lại không thể trụ được nếu không có framework
Tôi thích việc Svelte hỗ trợ tạo Web Components thông qua Custom Elements API
Vì Svelte biên dịch thành JS/HTML/CSS thông thường, nên việc tạo component tái sử dụng chạy được trong bất kỳ framework nào hoặc vanilla JS là điều tự nhiên: https://svelte.dev/docs/custom-elements-api
Tôi đã theo dõi các cuộc thảo luận về Web Components suốt vài năm, nhưng với tư cách là một full-stack developer, tôi vẫn chưa rõ nó có thể làm gì để cuộc sống tốt hơn
Hầu hết các ví dụ này chỉ ở mức đưa dữ liệu vào HTML dưới dạng template, mà việc đó thì đã có thể làm bằng handlebars
Có phải tôi đang bỏ sót điều gì không
Nếu dùng HTML như tài liệu, Web Components có thể thêm các tính năng tương tác thời gian thực hấp dẫn hơn
Ví dụ như trình giả lập terminal kết nối với WebSocket, bộ chọn ngày, phần tử form tùy chỉnh, bản đồ, bảng dữ liệu, widget tab, hay các component tùy chỉnh mà jquery-ui ngày xưa cung cấp
Không có Web Components vẫn làm được, nhưng nếu biến chúng thành component tùy chỉnh thì HTML sẽ gọn gàng hơn nhiều và vẫn giữ được chất “tài liệu”
Sẽ tốt nếu có một thư viện Web Components nhất quán, và với HTMX cùng server-sent events thì có vẻ cũng có thể làm chat thời gian thực khá ổn
Trình duyệt cách ly toàn bộ HTML, CSS, JS mà không cần thủ thuật riêng
Điểm hay là bạn có thể tạo Web Component, định nghĩa rõ API JS, HTML, CSS theo biến, rồi đưa vào bất kỳ môi trường nào cũng không bị vỡ, hoặc không phải tạo ra mê cung namespace CSS phức tạp và phụ thuộc framework
Ví dụ, có thể thêm các tính năng như lọc hoặc sắp xếp kéo-thả bằng một Web Component bọc quanh bảng, và nếu JS bị tắt hoặc tải thất bại thì người dùng vẫn nhận được bảng và nội dung cơ bản
Trước đây cách này tốt hơn nhiều so với màn hình trắng của frontend framework, nhưng giờ server-side rendering đã phổ biến nên lợi thế này giảm đi
Việc đóng gói style cũng tốt, nhưng ngày nay các thư viện headless UI và scoped styles của framework đã phổ biến, nên nó có vẻ không còn cấp thiết như 10 năm trước
Tuy nhiên, để dùng slot thì phải chọn Shadow DOM, nên khi tạo component tái sử dụng nội bộ, việc không thể style bằng cách đưa một stylesheet vào trang là điều khá khó chịu
Nếu demo trình bày 200 dòng điều chỉnh DOM thủ công thì khó mà nói Web Components là tương lai
Chỉ có vậy thôi, và với hầu hết các mục đích khác thì nó khá tệ
Ngoài ra, có thể phát hành UI component để chạy trên mọi framework mà không phải làm 7 phiên bản
Phần tệ nhất của Web Components và Shadow DOM là nó có thể khiến browser extension hoạt động không đúng hoặc hoàn toàn không hoạt động
Các nhà cung cấp trình duyệt cũng không vội sửa tình trạng này
Tôi cho rằng một trong những “sai lầm” lớn nhất của Web Components là trong đầu mọi người, nó bị gắn liền với Shadow DOM
Trong phát triển ứng dụng, nếu bám vào live DOM thì Web Components trở thành một lựa chọn rất nhẹ và dễ
Bạn vẫn có thể tiếp tục dùng các công cụ CSS mình muốn như bootstrap, tailwind, đồng thời gần như không tốn chi phí mà có được khả năng đóng gói chức năng rất tốt; đặc biệt ổn nếu dùng thứ như lit-html làm renderer
Các đội nhìn chung thấy việc làm việc với Web Components native khá mới mẻ, và developer đến từ thế giới framework sau khoảng một tuần thích nghi thì không muốn quay lại nữa
Chỉ với các thuộc tính class đơn giản và việc gọi thủ công hàm render trong
set(), bạn đã có được lợi ích của reactivity mà không phải chịu sự rườm rà của frameworkVấn đề là không có nhiều tài liệu chỉ cách bắt đầu ở “chế độ dễ”
Hầu hết tài liệu nhập môn đẩy người ta thẳng vào các kỹ thuật đau đầu như Shadow DOM, CSS parts, vốn phù hợp với tác giả thư viện hơn là developer ứng dụng
Có lẽ cần viết một hướng dẫn kiểu “The Good Parts” về cách làm Web Components giúp cuộc sống dễ hơn
Một lựa chọn thay thế là “HTML web components”, chỉ dùng live DOM, ưu tiên server-side rendering và phù hợp để thay thế kiểu “rắc thêm jQuery”: https://adactio.com/journal/20618
Ngoài ra còn có “Shadow gristle”, dùng Shadow DOM ít nhất có thể, và nếu cần styling hoặc composition thì để ở live DOM: https://glazkov.com/2023/03/02/shadow-gristle/
Công nghệ này có vẻ vừa là phước lành vừa là lời nguyền tùy theo cách dùng, nên tôi đang thu thập tài liệu và bình luận liên quan
Điểm tuyệt nhất là không rơi vào địa ngục phụ thuộc mỗi hai tuần
Khả năng tương tác là lợi thế lớn nhất từ góc nhìn người dùng, nhưng có vẻ mọi người đang đánh giá thấp việc cái giá phải trả là chi phí hiệu năng: mỗi component được dùng có thể kéo theo runtime không cần thiết
Cách được khuyến nghị là dùng các framework như Lit cùng với Web Components; theo thời gian khi framework mới xuất hiện và component bị khóa vào phiên bản cũ, chi phí này sẽ tích lũy
Tôi không muốn khuyên ai đi theo hướng có nhiều thư viện trùng lặp trên một trang, và nếu điều đó được đưa vào best practice thì về dài hạn là không tốt
Tôi đã theo dõi bài viết, mạng xã hội và video của những người ủng hộ Web Components trong nhiều năm, và đáng lẽ tôi chính là nhóm người dùng mục tiêu, nhưng ngoài “thuế khả năng tương tác” ra thì nó còn đầy những nhược điểm mà các framework chủ đạo không có
Trong từng hệ sinh thái framework, khả năng tương tác hoạt động tốt; chính những động lực khiến developer tìm đến khả năng tương tác cũng khiến họ tụ lại quanh một số ít framework chủ đạo
Tôi cho rằng Web Components không theo kịp về mặt công nghệ, và thêm nhiều độ phức tạp vào web platform vì một thiết kế từ đầu thập niên 2010: https://x.com/Rich_Harris/status/1840116730716119356
Cũng có nhiều framework có runtime nhỏ như Svelte; tôi không nói là đưa 100 cái lên một trang, nhưng 5–6 cái thì tôi nghĩ vẫn ổn
Không có nghĩa đó là lý tưởng, nhưng nó có thể hữu ích cho migration từng bước hoặc micro-frontend
Nhân tiện, React 17 cũng đã giới thiệu khả năng đặt nhiều phiên bản React trên cùng một trang: https://nolanlawson.com/2021/08/01/why-its-okay-for-web-components-to-use-frameworks/, https://bundlephobia.com/package/svelte@4.2.19, https://legacy.reactjs.org/blog/2020/10/20/react-v17.html
React cộng với react-dom đã hơn 100KB, còn Svelte và Lit chỉ ở mức vài KB
Có thể nhét vào khá nhiều framework mới tiệm cận được mức phình to mà mọi người hằng ngày vẫn vô tư dùng
Những tín hiệu tôi liên tục thấy đến nay không tốt; cộng đồng đó ở trên X, và Web Components không giải quyết được vấn đề của họ, ngay cả trong tình huống tối ưu cũng không được dùng tốt
Tôi hy vọng việc thuyết phục sẽ thành công, nhưng nhìn chung họ thường nói Web Components đã thất bại và xét tổng thể là có hại cho web
Phần lớn runtime khá nhỏ, và việc hai runtime chạy đồng thời không tạo overhead hiệu năng lớn
Các web framework hiện đại đều reactive, nên nếu không có gì cần phản hồi thì chúng không làm gì cả
Một phần của trang dùng React, phần khác dùng Lit, phần khác nữa dùng Svelte thì tôi không thấy lý do gì khiến trải nghiệm người dùng hay mức tiêu hao pin tệ đi đáng kể so với một trang dùng một framework duy nhất
Tweet được trích dẫn nói về việc Web Components có phải là “primitive hữu ích để tạo framework” hay không, và ngay cả các fan từng dùng thực tế cũng thường sẽ không nói là có
Web Components là cơ chế phân phối, và nếu lựa chọn thay thế chỉ là tạo cùng một thư viện 7 lần cho React, Preact, Svelte, Solid, Vue và vanilla JS, thì điều đó thật kinh khủng
Tôi thích Web Components và lạc quan về khả năng chúng giúp chúng ta thoát khỏi địa ngục frontend hiện tại do chính mình tạo ra
Gần đây tôi có một bài trình bày ngắn về tương lai của frontend, và có vẻ những người khác cũng đang mong chờ một lối thoát
Tôi đã tạo một data table cho GUI cơ sở dữ liệu, và dù tải hàng trăm nghìn dòng thì cuộn vẫn rất mượt
Tôi cũng sắp công bố thư viện Web Component; nó còn sớm và thô, nhưng tôi mong có thêm nhiều người xem: www.astra-ui.com
Có lẽ nên cân nhắc responsive design cho màn hình nhỏ bằng cách bố trí lại sidebar, và đặt max-width cho body thay vì width
Nút “explore components” ở cuối trang chủ dường như không liên kết tới đâu cả
Bạn nói “hãy học từ các triển khai component có cấu trúc tốt và có khả năng truy cập”, nhưng tôi không tìm thấy link tới phần triển khai trong tài liệu
Bạn nói “không có dependency nào cần quản lý hay cập nhật”, nhưng chẳng phải bản thân astra-ui cũng là một dependency sao, và còn có cả changelog nữa: https://www.astra-ui.com/changes/
Bạn cũng nói “toàn quyền kiểm soát code và styling”, nhưng tôi không hiểu làm sao có thể kiểm soát hoàn toàn trong khi vẫn phụ thuộc vào triển khai do thư viện cung cấp
Tôi tò mò vì sao bạn quyết định công bố thư viện này. Open source phần mềm nội bộ có thể hữu ích khi công ty có mục tiêu cụ thể, nhưng thường dễ trở thành việc tốn thời gian mà không có bù đắp
Thư viện component phải chiến đấu để được hệ sinh thái chấp nhận; nếu không, sẽ không có khán giả và lý do công bố cũng không nhiều
Nó trông như một giải pháp tuyệt vời
Vài tháng trước, ở công ty mới, tôi tiếp quản một codebase JS khoảng 250.000 dòng
Một class khổng lồ cùng vài subclass làm mọi việc, và có file dài tới 30.000 dòng
Không có framework cũng không có tính phản ứng, nên khi bấm nút phải dùng event listener để cập nhật thủ công mọi thứ trên màn hình
Code trông như thể ai đó chỉ cầm một cuốn sách JavaScript cơ bản rồi bị nhốt trong phòng tu viện vài năm để viết ra
Vì phải làm từng chút một, tôi bắt đầu refactor bằng Web Components, việc này giúp ích rất nhiều và đến nay đã giảm được 50.000 dòng
Tuy nhiên mục đích thật sự là học hết những gì code hiện tại đang làm trước khi viết lại
Làm lại bằng Web Components là một cách để đạt mục tiêu đó, và điểm hay là không vứt bỏ toàn bộ để bắt đầu lại từ đầu
Tuy vậy, nếu làm được một mức nào đó rồi chuyển sang dự án khác, có rủi ro là người tiếp theo sẽ đến và bắt đầu refactor theo phong cách của họ, khiến nó trở thành một codebase khó hiểu với ba phong cách khác nhau
Dù vậy vẫn tốt hơn là viết lại toàn bộ 250.000 dòng trong một lần
Một điểm tôi thích ở Web Components là ít nhất về lý thuyết, chúng vẫn có thể hoạt động ngay cả khi JS bị tắt
Tôi đã làm như vậy vài lần để cải tiến lũy tiến
Nhìn chung tôi đồng ý với Nolan. Web Components còn đủ nhiều góc cạnh thô ráp nên khó có thể thống trị thế giới ở trạng thái hiện tại, nhưng khá tốt cho một số trường hợp sử dụng cụ thể
Tuy nhiên tôi không rõ nhận định rằng chúng không hợp với server-side rendering, vì tôi vẫn làm mà không gặp vấn đề gì
Theo tôi thấy, để đăng ký template cho một tag cụ thể thì có vẻ cần JavaScript: https://developer.mozilla.org/en-US/docs/Web/API/Web_components/Using_templates_and_slots
Với ReactJS, bạn có thể render component hoặc template ở server, và tôi xem JSX là một ngôn ngữ template khá tốt
Theo tôi hiểu, Web Components không có sẵn một ngôn ngữ template tốt tích hợp, nên bạn phải tự mang vào
Tôi không biết có cơ chế chuẩn nào để lấy phần JS component gắn với một tag rồi render HTML cần thiết mà không chạy JS hay không
Nếu trong tương lai có thể render 3 framework Web Component khác nhau trên server, chúng kết hợp được với nhau, và hydrate sạch sẽ, thì có thể xem là vấn đề đã được giải quyết: https://nolanlawson.com/2023/08/23/use-web-components-for-what-theyre-good-at/