Nhân dịp Sài Gòn quay trở lại sau đợt cách ly thì mình cũng ra một bài viết mới. Frontend Du Ký kì này sẽ kể về quá trình lựa chọn công nghệ để phát triển ứng dụng Cross-platform Apps.
Nếu bạn chưa đọc tập trước, bạn có thể đọc tại đây.
Cross-platform Apps sẽ được viết tắt bằng CPA để thuận tiện cho người viết bài
Khi mình còn là một chàng dev trẻ trâu trung, năng động, thích khám phá và thử thách, mình được sếp tin tưởng giao trọng trách lựa chọn công nghệ để phát triển CPA vì công ty ai cũng bận sếp tin tưởng vào khả năng của mình. Không phụ lòng tin của sếp, mình tìm hiểu và lựa chọn những công nghệ hay nhất, mới nhất lúc bấy giờ để thực hiện.
Kế hoạch phát triển bao gồm 2 thành phần chính:
Tuy TypeScript đã khá thịnh hành tại thời điểm hiện tại nhưng mình vẫn chọn JavaScript để phát triển. Lý do khiến mình chọn JavaScript:
Dĩ nhiên là JavaScript không phải là lựa chọn hoàn hảo. Do không có static type-checking nên khi làm việc với JavaScript, team phải hết sức cẩn thận với việc quản lý dữ liệu để tránh các trường hợp gọi sai tên hoặc gán sai kiểu (ví dụ: gán number
vào một biến string
). Ngoài ra thì hỗ trợ từ code editor cũng bị hạn chế và không mạnh bằng việc sử dụng TypeScript.
Để đáp ứng được các nhu cầu của bộ bundler (đề cập ở bài viết trước) thì mình quyết định chọn Svelte. Lý do:
class
và className
hoặc for
và htmlFor
ở React{#await expression}...{:then name}...{:catch name}...{/await}
và {#each expression as name}...{:else}...{/each}
. So với với các thư viện khác thì khá tiện dụng, không cần phải tạo biến isLoading
hoặc kiểm tra array.length === 0
bằng tay nữaThoạt nhìn thì Svelte cũng có vẻ hoàn hảo nhưng thực sự thì vẫn có một số điểm cần lưu ý khi lựa chọn Svelte:
Phần này thì tùy thuộc đặc thù app mà sẽ thay đổi tương ứng, tuy nhiên mình cũng đề cập thêm để các bạn có thể tham khảo
Vậy là xong phần app. Vì nhu cầu chưa có gì nhiều và phức tạp nên mình chỉ lựa chọn trước các thư viện như trên. Tiếp theo mình sẽ nói tới phần app admin, nơi mà tinh hoa công nghệ bắt đầu xuất hiện.
Cũng giống như các lý do đã đề cập phía trên. Mình vẫn ưu tiên sử dụng JavaScript ở thời điểm hiện tại vì sự linh động của nó.
Team mình tiếp tục sử dụng NextJS để làm UI, cụ thể là NextJS 9. Phiên bản này có các thay đổi khá đáng giá như:
[id].jsx
là đã có thể có được dynamic route rồi. Đây là thay đổi đáng chú ý nhất ở phiên bản lần nàyKhi vừa ra mắt thì NextJS 9 xuất hiện lỗi hot-reload code. Mình nhớ lúc đó code xong lưu lại có khi phải chờ 1 đến 2 giây mới có phản hồi trên giao diện. Lỗi này đã được khắc phục ở các bản nâng cấp sau đó nhưng trải nghiệm ban đầu khi sử dụng khá là khó chịu.
Nếu các bạn có nhớ thì team mình trước giờ vẫn deploy bằng tay, tức là sẽ có người đảm nhận công việc merge code, build và push lên server. Quá trình này tiêu tốn khá nhiều nguồn lực của team nên khi phát triển CPA, team quyết định sử dụng luôn hệ thống Vercel (trước đây là Zeit Now) để tự động deploy mỗi khi code được push lên GitHub.
NextJS là một trong những sản phẩm của Vercel nên nó được hỗ trợ khá tốt, không cần tinh chỉnh gì nhiều ngoài việc thiết lập biến môi trường (Environment Variable). Nhờ việc dự án được tự động deploy nên team cũng có nhiều thời gian hơn để tập trung vào việc phát triển tính năng và cũng không còn lo sợ khi người phụ trách deploy vắng mặt ở công ty nữa.
Rút kinh nghiệm của EGANY Apps, lần này team quyết định sẽ sử dụng một bộ component có sẵn để tiết kiệm thời gian phát triển. Được sếp gợi ý Shopify Polaris nên mình cũng dùng thử. Sau vài ngày trải nghiệm thì mình quyết định chọn Shopify Polaris luôn, lý do:
Điểm duy nhất mình không thích ở Polaris là không custom được nhiều. Cũng dễ hiểu vì Polaris phát triển tập trung cho hệ thống e-commerce của Shopify. Mọi thứ đều được "đóng gói" và "chốt đơn". Dĩ nhiên là bạn vẫn có thể custom về màu sắc (theme) hoặc ngôn ngữ (locale) nhưng nếu bạn muốn thay đổi layout thì quả thật là hơi khó khăn.
Đa số các component kit như Ant Design, Material Design hay cụ thể là Shopify Polaris đều không hỗ trợ rich-text editor nên mình phải tìm thư viện thay thế.
Để tiết kiệm thời gian thì mình sử dụng lại CKEditor có sẵn ở EGANY Apps. Vì đa số các thư viện rich-text editor đều không hỗ trợ chế độ SSR (Server Side Rendering) nên việc tích hợp cũng mất chút thời gian.
Đánh giá sơ bộ về CKEditor:
Có lẽ từ khóa state management không còn xa lạ với các bạn nếu các bạn từng tiếp xúc với React, Vue, Svelte hoặc các thư viện/framework hỗ trợ làm Single Page Application.
State management thì mình sẽ chia làm 2 dạng:
Ở client thì mình có thử qua Recoil, một thư viện mới ra mắt của Facebook. So với Redux và MobX thì Recoil dễ sử dụng hơn, ít rườm rà hơn. Tuy nhiên, do Recoil mới chỉ ở trạng thái beta và tài liệu lúc này cũng chưa đầy đủ nên mình không dùng.
Sau khi cân đo đong đếm nhu cầu của dự án thì mình quyết định sử dụng React Context (sử dụng useContext
hook). Thời gian đầu thì team không gặp vấn đề gì khi làm việc với React Context. Tuy nhiên, sau khi dự án phát triển lớn hơn thì một số vấn đề liên quan tới hiệu năng phát sinh, cụ thể là vấn đề về việc render của component. Chi tiết như thế nào hẹn các bạn ở bài sau nhé!
Client state management trước giờ làm nhiều và cũng sử dụng nhiều thư viện rồi nên mình có kinh nghiệm. Server State Management thì thật sự mà nói thì ngay tại thời điểm tìm hiểu công nghệ thì mình mới biết tới từ khóa này. Lúc bấy giờ có React Query và SWR. Mình có dùng thử cả hai, về công dụng thì cả hai đều đáp ứng tốt, React Query có phần nhỉnh hơn về tính năng có vẻ vì vậy mà nó hơi phức tạp. Cuối cùng thì mình chọn SWR, lý do:
Mình thật sự hài lòng với trải nghiệm mà SWR mang lại. Ngay chính sếp mình khi trực tiếp sử dụng trong quá trình điều chỉnh nội dung trang (lấy từ API ở dạng JSON) cũng khá bất ngờ với tính năng "real-time" này. Mình nhớ sếp còn hỏi: "Ủa em làm API nội dung real-time luôn à?". Mình chỉ cười và gật đầu. #cú-lừa
Ngoài lodash và dayjs thì mình còn sử dụng thêm các thư viện sau:
error
trả về của axios khá rườm rà. Nếu xử lý chung với các lỗi thông dụng thì sẽ phải qua nhiều bước kiểm tra để xác định là lỗi của axios hay lỗi runtime bình thườngNguồn ảnh: https://dribbble.com/shots/10565800-Black-Caution-Sign
Một ngày đẹp trời sau khi hoàn thành mọi tính năng, trong khi chờ phản hồi từ tester thì mình có đọc qua một bài viết nói về việc lựa chọn license phù hợp cho dự án của mình. Đọc xong thấy khá thú vị, tò mò vào đọc license của Shopify Polars thì mới nhận ra vấn đề:
CPA chắc chắn sẽ khác về tính năng nhưng rất tiếc là phần admin của CPA khá giống so với phần admin của Shopify. Ngoài ra thì team cũng có điều chỉnh component để phù hợp hơn với design của team. Điều này đồng nghĩa với việc team đang có nguy cơ vi phạm license của phía Shopify.
Nhận được tin thì team cũng có họp lại với nhau và đưa ra quyết định là sẽ tiếp tục sử dụng Polaris cho tới khi sản phẩm hoàn thiện và đến được tay của một số người dùng beta. Sau khi nhận được phản hồi của người dùng thì team sẽ tiến hành chuyển đổi qua một component kit khác, hay nói cách khác là đập bỏ toàn bộ giao diện hiện tại và thay thế bằng một giao diện khác.
Như các bạn đã thấy, công sức vài tháng trời xem như công cốc chỉ vì vài dòng chữ license. Đúng như lời ông bà ta nói: "Sai một ly, đi một dặm". Đây quả thật là một bài học đắt giá cho cá nhân mình cũng như các thành viên trong team trong việc lựa chọn công nghệ để sử dụng trong dự án, đặc biệt là những dự án thương mại.
Quá trình chuyển đổi diễn ra như thế nào? Công nghệ nào sẽ được sử dụng cho phiên bản tiếp theo? Hẹn gặp các bạn ở tập tiếp theo nhé.
Bài thuộc chuyên mục Engineering và cả chuyên mục Culture vì công ty mình rất chú trọng văn hóa chia sẻ và học hỏi. Các bạn có thể đọc "sương sương" về EGANY để biết vì sao.
Còn các cơ hội để làm "Bug Contributor" cùng mình thì ở đây 😆.
Cám ơn các bạn đã đọc bài. Happy hacking! 👌
Trong phần trước, mình đã chia sẻ với mọi người những khó khăn khi team…
Xin chào, tiếp tục loạt bài về trải nghiệm của mình trong việc xây dựng…
Cắm đầu cắm cổ dọn dẹp deadline và dọn nhà trước Tết nên ngâm bài…
Nếu bạn yêu thích phát triển sản phẩm với nhiều thử thách và cơ hội…
Trong phần 1, mình đã giải thích lý do tại sao EGANY chọn AWS làm…
Trong giới công nghệ hiện nay, Amazon Web Service không còn là một cái gì…