Lập trình iOS app bằng React Native – Lựa chọn của những kẻ “dại khờ”

1
1181

Lập trình iOS app bằng React Native – Lựa chọn của những kẻ “dại khờ”

Chương 1: Cơn ác mộng mang tên React Native

Lần đầu tiên nghe đến React Native, mình chỉ nhếch mép cười khẩy vì cho rằng đây chẳng khác gì một công cụ để dân web dev học về native mobile app. Mình thật sự thấy thích thú với ý nghĩ rằng những tay lập trình JavaScript có thể viết iPhone app bằng chính JavaScript.

Mình cũng có ý định sẽ thử làm theo cách đó nhưng mình đã từ bỏ ý định này lập tức ngay sau đó. Vì dù sao, suy cho cùng, mình đã dành nhiều năm phát triển các native iOS app như là một sở thích và làm việc một cách chuyên nghiệp với cả Chalk và Chisel (trước đây gọi là Bolster) trong suốt gần hai năm.

#1. React Native – một gia vị mới lạ

 

lap-trinh-ios-app-bang-react-native-10

Mình đã phát triển được hàng tá iOS app thật sự chất lượng và luôn tự hào về điều đó. Những app này mình đều phát triển bằng Xcode và viết bằng Objective-C như bao người khác từ muôn đời nay.

Đơn giản bởi vì đó là những gì mà Apple cung cấp cho chúng ta để phát triển riêng các iOS app. Không những vậy, hai năm tiếp theo, khi Apple tung ra ngôn ngữ lập trình Swift, mình cũng không hề ngần ngại tìm hiểu và sử dụng.

Ngôn ngữ này cũng không khác gì so với Xcode là mấy và cũng dùng để phục vụ cho việc phát triển các iOS app nên mình chẳng tốn nhiều thời gian và công sức là mấy để làm chủ nó. Có thể nói, mình rất tự tin khi nắm trong lòng bàn tay cả hệ sinh thái của Apple.

Trong khi đó, React Native chỉ giống như một chút gia vị mới lạ trong cuộc đời lập trình của mình vì mình luôn tin rằng mọi real native app phải được phát triển theo một cách thực nhất. Vì thế, mình nghĩ rằng thật phí thời gian khi phải vừa học về JavaScript (thứ mà mình chẳng có chút kinh nghiệm nào cả) vừa phát triển app theo một cách hoàn toàn mới trong khi mình đang làm chủ việc phát triển app theo một cách “thực hơn”.

Nhưng bạn biết không, đời không ai đoán trước chữ ngờ. Chỉ sau vài tháng, mình đã hoàn toàn thay đổi suy nghĩ trước đây và dám tự tin tuyên bố rằng mình có thể phát triển iOS app mà chẳng cần dùng đến Objective-C hay Swift. Bởi lẽ mình đã có thể làm chúng bằng chính React Native.

#2. Những bỡ ngỡ ban đầu với React Native

Chuyện là cách đây vài tháng, nhóm bọn mình nhận được một dự án. Sau khi xem những yêu cầu và mẫu thiết kế cho app, theo thói quen, mình lập tức mở ngay biểu tượng màu xanh xinh xắn của Xcode để bắt đầu công việc thì cha sếp tài năng nhưng xấu trai của mình đến và phán rằng: “Này các chú, dự án này chúng ta sẽ làm bằng React Native nhé.”

Cha ấy bảo rằng lần này khách hàng muốn đưa app lên cả iOS lẫn Android. Mặc dù React Native vẫn chưa hỗ trợ cho Android vào thời điểm đó nhưng team mình biết rằng Facebook đang cố gắng hiện thực hóa điều này. Nói một cách sách vở như trong trường học thì nếu bọn mình phát triển app bằng React Native cho iOS thì rất nhiều phần trong đó cũng sẽ hoạt động trên cả Android.

E hèm!

#3. Khó khăn chồng chất khó khăn

lap-trinh-ios-app-bang-react-native-4

Tất nhiên là mình chẳng vui tí xíu nào. Hãy thử tưởng tượng cuộc đời của một thằng dev đang ở đỉnh cao với một loạt iOS app nay lại bị quăng xuống vũng bùn đầy mùi hôi thối của React Native thì sẽ hiểu lúc đó mình cảm thấy như thế nào. Vào thời điểm đó, thật sự mình rất nghi ngờ về bản thân, về khả năng có thể tạo ra một sản phẩm chất lượng mà lại đúng deadline trong khi lại chẳng có chút mảy may kinh nghiệm nào về React Native.

Nhưng hơn hết, mình cũng rất nghi ngờ React Native có thể làm ra những sản phẩm tốt. Thậm chí bây giờ nhìn lại, mình cũng tin rằng những nghi ngờ đó hoàn toàn hợp lý. Vào thời điểm đó, React Native chỉ mới ra phiên bản Beta. Tài liệu về nó thì chẳng có nhiều trong khi các Open Source dành cho React Native lại rất ít và thậm chí là những mẫu code hay ví dụ trên Stack Overflow để tham khảo cũng chẳng hề có!

Mình đã bắt đầu dự án bằng một sự chán nản nhưng dù sao vẫn tốt hơn là không làm gì. Cục đá to đùng đầu tiên mình đối mặt chính là Flexbox –cách thức React Native dùng để làm layout cho UI. Xuất thân từ “xứ sở” của interface builder, việc làm layout cho UI bằng code thật sự khiến mình cảm thấy ngớ ngẩn và khó chịu. Mình thậm chí đã phải “lên bờ xuống ruộng” ngay cả khi chỉ làm những layout đơn giản nhất.

#4. Và rồi dần dần tình yêu lại đến

Nhưng vấn đề không đơn giản chỉ nằm ở UI. Vấn đề là tất cả mọi thứ của React Native hoàn toàn khác biệt. Đây chính là thứ khiến mình cảm thấy ức chế nhất.

Cứ mỗi lần gặp phải chỗ nào không hiểu thì mình luôn tự nhủ rằng “Nếu đây là Objective-C thì tao đã xơi tái mày trong 5 giây”. Hay những lúc mình phát hiện ra bug trong React Native (và chuyện này diễn ra thường xuyên) thì mình nghĩ ngay rằng “Những bug này không bao giờ có trên Objective-C và tại sao mình lại phải làm những thứ vô cùng ngớ ngẩn này?”

Sau gần 2 tuần, mình thật sự thảm bại với React Native. Mình cảm thấy bản thân thật ngu ngốc như một thằng nhóc mới học viết code lần đầu trong đời trong khi bản thân hiện tại đang là một chuyên gia về iOS app. Mọi thứ ngày càng tồi tệ hơn chỉ cho đến ngày cuối tuần khi mình có thời gian thư giãn. Khi đó, mình đã tìm đến một quán nằm trong một con hẻm khuất ở lòng thành phố và nhấm nháp chút cà phê.

#5. React Native là tương lai của lập trình di động

Ngẫm nghĩ lại thì thấy rằng cha sếp của mình cũng không hề đưa ra yêu cầu vô lý. Chắc chắn lão ấy đã nghiên cứu rất kỹ về React Native. Hơn thế nữa, mình tin rằng lão ấy cũng chẳng điên rồ tới mức khiến cho cả team bị “tạch” chỉ vì thích sự mới lạ. Vì thế, mình đã thề rằng vào ngày thứ 2, mình sẽ ngẩng cao đầu bước vào công ty, xem Objective-C và Swift như chưa từng tồn tại, và “hạ đo ván” React Native.

Chương 2: Bắt đầu tình yêu với React Native

Vài tuần sau đó, team mình đã đưa lên App Store ứng dụng đầu tiên được phát triển bằng React Native. Mình thật sự rất tự hào về điều này và cảm thấy háo hức để viết những app tiếp theo. Chỉ hơn 1 tháng, mình đã trở nên yêu React Native hơn. Điều gì đã khiến mình thay đổi? Đây là lý do.

#1. React Paradigm

Trong React Native, tất cả các điều kiện của UI đều phải đặt trong render(), và được kiểm soát bằng “state”. Các thành phần trong render() sẽ quy định UI trông như thế nào đối với từng state, và khi bạn chọn setState()thì React Native sẽ xác định những phần cần thay đổi và làm thay bạn. Ví dụ, bạn muốn tạo một view với label mang tên “Hello World” cùng với một nút nhấn. Mỗi một cú nhấp chuột vào nút thì sẽ thay đổi trạng thái từ “Hello World” sang “Goodbye World” và ngược lại. Trong Objective-C, mình sẽ phải viết code như sau:

if ([label.text isEqual:@”Hello World”]) {
    label.text = @”Goodbye World”;
} else {
    label.text = @”Hello World”;
}

Cách làm này thì vẫn ổn nhưng code UI này hoàn toàn tách biệt với chỗ mà mình đã tạo label trước đó (chỗ này có thể nằm trong code hoặc trong Interface Builder). Đối với React Native, chúng ta có thể quy định nút buttonClicked trong state và label trong render() như dưới đây:

<Text>
    {this.state.buttonClicked ? ‘Hello World’ : ‘Goodbye World’}
</Text>

Và Button handler thì đơn giản như sau:

this.setState({buttonClicked: !this.state.buttonClicked});

Bằng cách này, tất cả view code đều nằm chung một chỗ và state có thể kiểm soát tất cả. Điều này cũng giúp cho việc đọc và debug code dễ hơn.

#2. Flexbox

Công cụ layout UI mà mình ghét ban đầu giờ lại trở thành một trong những thứ mình thích nhất trong React Native. Mình phải thừa nhận rằng công cụ này rất khó để nắm bắt nhưng khi đã làm chủ nó rồi thì bạn có thể làm UI cho nhiều kích cỡ màn hình khác nhau một cách nhanh chóng và dễ dàng.

Mình đã từng mê mẩn visual aids của Interface Builder trong Xcode. Nhưng Autolayout giờ đây lại trở nên quá phức tạp so với Flexbox. CSS-esque mà Flexbox sử dụng giúp chúng ta có thể tái sử dụng các style một cách dễ dàng như copy paste vậy. Và điều tuyệt nhất của Flexbox chính là bạn có thể tweak style value đến mức hoàn hảo một cách nhanh chóng.

#3. Live/Hot Reload

Mỗi khi có sự thay đổi, bạn có thể nhìn thấy button của mình trông như thế nào thông qua chức năng Live/Hot Reload. Điều này dễ dàng như bạn đang sử dụng lệnh Command + S vậy. React Native sẽ được điều chỉnh để tự động re-render góc nhìn hiện tại trên iPhone Simulator mà bạn không phải đụng đến Xcode.

Đây là một lợi ích rất tuyệt vời vì bạn vừa có thể tiết kiệm thời gian khi không phải viết lại code vừa có góc nhìn sắc nét hơn trong app cũng như có thể tweak UI mà không cần điều chỉnh lại màn hình.

#4. Android

Mình đã từng do dự khi học React Native vì mình thích phát triển iOS native hơn và mình cũng chẳng có gì để phàn nàn về iOS native. Mặt khác, mình cũng đã từng làm Android native và nhận ra rằng nó chẳng tuyệt vời chút nào.

React Native có thể giải quyết bài toán này. React Native đã mang đến một cuộc cách mạng trong việc phát triển mobile app khi chúng ta có thể phát triển 2 platform trên cùng 1 code base.

Chương 3: Những mong chờ tiếp theo với React Native

#1. Nhớ về Xcode

Đến giờ, mình vẫn nhớ về Xcode hay rộng hơn là về IDE. Mình đã có một số bước phát triển rất tốt với React Native nhưng nó chẳng hề đơn giản. Sublime Text và những plugin sau này mình cũng đã thử qua và nhận thấy chúng chưa thật sự tốt. Sublime có thể autocomplete dựa trên các biến khác trong cùng một file nhưng vẫn thiếu đi một chút chất lượng của Xcode. Vì vậy mà mình vẫn phải luôn cần đến các tài liệu hướng dẫn react native để tham khảo.

Một số hạn chế như việc gõ React.PropTypes.fvà có IDE cũng không giúp mình biết được liệu mình đang tìm “‘func’ hay ‘function’ cũng cần phải nhắc đến. Mình cũng nhớ đến editor của Xcode – chức năng cho phép bạn so sánh từng file với nhau tại git commit cuối cùng và thậm chí là có thể undo lại những thay đổi cụ thể trước đó trên cơ sở mỗi dòng. Mình nhận ra rằng một chương trình thứ ba có thể giúp mình thực hiện điều này khi sử dụng React Native nhưng sẽ thật tuyệt vời nếu như nó có thể kết hợp tất cả lại với nhau như IDE.

Để có thể chạy một dự án React Native, mình cần phải launch một terminal để có thể bắt đầu npm packager, Chrome cho debugger, Sublime để chỉnh sửa code, và cuối cùng là Xcode để chạy dự án và khởi động simulator. Đó chỉ là những lời phàn nàn nho nhỏ cho một hệ thống khổng lồ nhưng với mình thì đây vẫn là những hạn chế khi sử dụng React Native. Mình hy vọng rằng Nuclide (IDE của Facebook) sẽ sớm khắc phục những vấn đề trên.

#2. Bridging

Facebook đã và sẽ không chuyển tất cả API từ iOS sang React Native, vì vậy đối với những file bị thiếu, họ sẽ “bridge” mọi thứ thông qua JavaScript. Mặc dù không muốn nhưng vẫn phải nhấn mạnh lại rằng lần đầu tiên sử dụng React Native, mình chẳng thể tìm ra tài liệu tham khảo nào ra hồn.

Mỗi lần cần bridge một thứ gì đó thì mình gần như muốn bỏ cuộc vì những thứ đó vốn đã có sẵn trên Objective-C. Sau này, khi Facebook giải thích cụ thể hơn cách thức bridge và đưa ra ví dụ thì mọi thứ không còn đáng sợ nữa. Mặc dù vẫn còn một chút rắc rối nhưng dần dần mình cũng nhìn thấy những bridge ảo được làm ra trong các Open Source và chúng cũng đã có sẵn trên npm. Thực tế thì hầu hết API của iOS đều đã có sẵn ở đó.

#3. Bug, Tài liệu và Cộng đồng Open Source

Hầu hết những phàn nàn của mình về React Native sẽ không bao giờ diễn ra nếu mình bắt đầu học về nó hôm nay. Bug được khắc phục mỗi ngày và những bản release mới được thông báo hàng tuần. Các tài liệu tham khảo đã tốt hơn nhưng vẫn cần phải tiếp tục cải thiện. Facebook và cộng đồng cũng đang rất nghiêm túc trong việc phát triển framework này. Thật tuyệt vời khi đã bắt đầu có nhiều người đề cập đến React Native trên GitHub và đặt câu hỏi trên Stack OverFlow.

Nếu bạn là một iOS dev và đang cân nhắc về React Native thì hãy nhớ rằng bạn không đơn độc. React Native rất tuyệt vời và bạn nên thử tìm hiểu nó với một tinh thần cởi mở. Đừng tự giam cầm mình trong những giới hạn thoải mái, dễ chịu của bản thân như mình đã trải qua.

Hãy bước ra khỏi vùng an toàn và bạn sẽ khám phá được những điều tuyệt vời mà bản thân chưa từng biết đến.

“Hãy khát khao, hãy dại ngờ”

1
Bình luận. Đặt câu hỏi cũng là một cách học

avatar
1 Bình luận
0 Trả lời
0 Theo dõi
 
Bình luận hay nhất
Bình luận hay nhất
1 Độc giả
Việt Coding Độc giả vừa bình luận
  Theo dõi bình luận  
Mới nhất Cũ nhất Nhiều voted nhất
Thông báo
Việt Coding
Guest

Hì hì, Bài này vui quá ! Mình có điểm thấy “kỳ kỳ”. 1. Trong suốt đoạn đầu của bài, tac giả luôn tự hào là có kinh nghiệm làm native code iOS với Obj-C và Swift. Vậy mà chưa từng viết code UI thì rất lạ. Mặc dù có thể dùng Storyboard để làm giao diện nhưng chưa bao giờ code UI thì rất lạ… 2.”Bằng cách này, tất cả view code đều nằm chung một chỗ và state có thể kiểm soát tất cả. Điều này cũng giúp cho việc đọc và debug code dễ hơn.” <— người… Đọc thêm »