Hướng dẫn dùng version. JavaScript
Đây là bài dịch, bài gốc mời các bạn xem ở đây: https://medium.com/the-node-js-collection/modern-javascript-explained-for-dinosaurs-f695e9747b70 Show Thời nay, việc học Javascript sẽ rất là khoai nếu như bạn không theo dõi từ đầu sự bùng nổ và phát triển của JS trong những năm gần đây. Hệ sinh thái của JS hiện vẫn đang tiếp tục phát triển và thay đổi một cách chóng mặt, khiến cho việc hiểu và và chọn đúng công cụ cho vấn đề cần giải quyết trở nên thực sự khó khăn. Tôi đã bắt đầu lập trình từ năm 1998 nhưng chỉ mới học Javascript một cách nghiêm túc kể từ năm 2014. Vào thời điểm đó tôi nhớ mình đã tiếp cận Browserify và nhìn chằm chằm vào định nghĩa của nó như sau:
Thú thực là tôi không hiểu bất cứ từ nào trong câu văn trên, và cũng hoàn toàn không hiểu được công dụng của Browserify sẽ giúp tôi thế nào trong việc lập trình JS. Do đó, bài viết này ra đời với mục tiêu là cung cấp cho người đọc một bối cảnh lịch sử về các công cụ JS đã tiến hoá như thế nào đến thời điểm năm 2017. Chúng ta sẽ bắt đầu bằng việc xây dựng một website ví dụ giống như những con khủng long - ko có tool gì cả, chỉ dùng HTML thuần và Javascript. Sau đó chúng ta sẽ lần lượt điểm qua và áp dụng dần các công cụ để biết được vấn đề mà chúng sẽ giải quyết được là gì. Với bối cảnh lịch sử này, bạn sẽ có khả năng học tập và đáp ứng tốt hơn với sự thay đổi của Javascript ở thời điểm hiện tại và trong cả tương lai nữa. Hãy cùng bắt đầu nào! Sử dụng Javascript theo cách "cổ điển"Hãy bắt đầu với một website theo phong cách "cổ điển" chỉ với HTML và Javascript, bao gồm cả việc download và link các file một cách thủ công. Đây là một file index.html đơn giản sử dụng một file Javascript:
Đoạn
Và đây là tất cả những gì bạn cần để làm ra một trang web! Giờ hãy xem nếu bạn muốn thêm một thư viện được viết bởi người khác ví dụ như là moment.js (một thư viện có thể giúp bạn format giá trị ngày tháng theo cách con người thường đọc). Lấy ví dụ, bạn có thể sử dụng hàm
Nhưng việc này chỉ có thể thực hiện được nếu bạn đã thêm file Hmm, có vẻ có hơi nhiều thứ trong phần Install ở bên tay phải. Nhưng tạm thời chúng ta cứ bỏ qua nó đã - chúng ta có thể thêm
Để ý rằng file
Và đso là cách chúng ta đã sử dụng để làm trang web với các thư viện Javascript! Phần tốt ở đây là nó rất đủ dễ để có thể hiểu. Phần không tốt là nó sẽ trở lên rất phiền phức để tìm và download các phiên bản mới của thư viện JS mỗi khi chúng được update. Sử dụng một bộ quản lý package Javascript (npm)Bắt đầu vào khoảng năm 2010, một vài bộ quản lý package JS khá cạnh tranh đã được nhiều người biết đến, với mục đích giúp lập trình viên thuận tiện hơn trong việc tải và nâng cấp các thư viện từ một repository tập trung. Bower được cho rằng là công cụ phổ biến nhất vào năm 2013, nhưng sau đó đã bị npm soán ngôi vào năm 2015. (Một công cụ khác cũng đáng được nhắc tới, được ra đời vào năm 2016, đó là yarn, đã thu hút rất nhiều sự chú ý dưới danh nghĩa là ứng viên thay thế cho interface của npm, nhưng vẫn dùng các package npm ở bên trong). Lưu ý rằng npm ban đầu là một chương trình quản lý các package được tạo ra chuyên cho node.js, một bộ biên dịch và chạy JavaScript dùng cho phía server, chứ không phải là bên phía frontend. Vì thế việc sử dụng một thư viện như npm cho việc quản lý các Javascript libraries ở phía frontend nghe có vẻ hơi kì cục.
Hãy cùng xem cách sử dụng npm để cài đặt thư viện
Sau khi trả lời vài câu hỏi (các option mặc định khá ổn, bạn có
thể ấn Enter để chọn giá trị mặc định), câu lệnh trên sẽ tạo ra một file có tên là
Để cài đặt
Câu lệnh này sẽ làm 2 việc - đầu tiên, nó download tất cả code từ package của
moment.js vào một thư mục có tên là
Việc này sẽ giúp ích khi chia sẻ dự án với người khác - thay vì chia sẻ thư mục Và giờ chúng ta
không cần phải download file
Điều tốt ở đây là chúng ta có thể sử dụng npm để download và update các packages cần thiết thông qua dòng lệnh. Điều không ổn ở đây là chúng ta phải đào sâu vào thư mục
Sử dụng công cụ đóng gói (bundle) các module Javascript (webpack)Rất nhiều ngôn ngữ lập trình cung cấp một cách để import code từ một file này sang file khác. Javascript ban đầu không được design để có tính năng năng này, vì JS được tạo ra với mục đích chỉ chạy trên trình duyệt, mà không có quyền truy cập đến các file hệ thống nằm trên máy tính của người sử dụng (vì lý do bảo mật). Vì thế trong một thời gian dài, tổ chức code Javascript đã từng được thực hiện bằng cách load từng file một vào các biến chia sẻ toàn cục (globally). Và các ở trên thực ra cũng là cách mà chúng ta đang sử dụng với ví dụ về moment.js - toàn bộ file Vào năm 2009, một dự án có tên là CommonJS đã được bắt đầu với mục đích là định nghĩa ra một hệ sinh thái cho Javascript mà không phụ thuộc vào trình duyệt web. Một kết quả khá to lớn của dự án là đã đưa ra được định nghĩa đặc tả về modules, cho phép Javascript được import và export code giữa các file giống như các ngôn ngữ lập trình khác, mà không cần thiết phải sử dụng biến toàn cục. Và node.js là implementation phần modules của CommonJS nổi tiếng nhất. Như đã mô tả ở trên, node.js là một trình biên dịch và thực thi Javascript được thiết kế để có thể chạy ở trên server. Thay vì phải load toàn bộ file
Một lần nữa, đây là
cách mà module được load ở trong node.js, và nó đã hoạt động khá tốt kể từ khi node.js được sử dụng dưới dạng ngôn ngữ phía server với khả năng truy cập đến các file hệ thống trên máy tính. Node.js cũng biết vị trí đường dẫn của từng module npm, vì thế thay vì phải viết Điều này rất tuyệt với node.js, nhưng nếu bạn thử đoạn code ở trên trong trình duyệt, bạn sẽ bắt gặp một lỗi với mô tả Và đây là lúc mà module bundler (bộ đóng gói module) phát huy tác dụng. Javascript module bundler là một công cụ giúp bạn thoát khỏi vấn đề ở trên với một bước build (có quyền truy cập đến file hệ thống) và tạo ra kết quả cuối cùng tương thích với browser (không
cần truy cập đến file hệ thống). Trong trường hợp này, công cụ chúng ta sẽ sử dụng sẽ phải tìm tất cả các dòng lệnh Công cụ module bundler phổ biến nhất đã từng là Browserify, được ra mắt vào năm 2011 và là tiên phong trong việc sử dụng câu
lệnh Hãy cùng xem cách cách webpack được sử dụng để làm cho dòng lệnh
Lưu ý tham số
Giờ chúng ta đã có webpack dưới dạng một package trong thư mục
Câu lệnh này sẽ chạy công cụ webpack đã được cài đặt trong thư mục
Nếu bạn mở trình duyệt, bạn sẽ thấy mọi thứ hoạt động như lúc trước! Lưu ý rằng chúng ta sẽ cần phải chạy dòng lệnh webpack mỗi khi chúng ta thay đổi file
Giờ mỗi khi thay đổi file
Chúng ta không cần thiết phải chỉ rõ các file Nói một cách tổng thể, mặc dù có thể không tác động nhiều, nhưng sẽ có một vài lợi ích đáng kể khi tuân theo workflow này. Chúng ta sẽ không cần phải load các đoạn script bên ngoài thông qua biến toàn cục. Bất kì thư viện Javascript nào sẽ được thêm vào thông qua câu lệnh Các chức năng biến đổi code sang ngôn ngữ mới (babel)Biển đổi (transpiling) code có nghĩa là thay đổi code từ một ngôn ngữ sang một ngôn ngữ khác tương tự.. Đây là một thành phần quan trọng trong việc phát triển phía frontend - từ khi trình duyệt thường chậm chạp trong việc thêm mới các tính năng, và các ngôn ngữ mới được tạo ra với các chức năng thử nghiệm mà có thể biến đổi về các ngôn ngữ tương thích với trình duyệt. Với CSS, chúng ta có vài cái tên tiêu biểu như là Sass, Less, và Stylus. Với Javascript, trình biến đổi code đã từng phổ biến nhất trong một khoảng thời gian đã từng là CoffeeScript (được phát hành vào khoảng năm 2010), trong khi babel và TypeScript là những ngôn ngữ được dùng thường xuyên trong thời gian gần đây. CoffeeScript là một ngôn ngữ tập trung vào việc cải thiện Javascript bằng cách thay đổi ngôn ngữ một cách đáng kể - các dấu ngoặc trở thành ko bắt buộc, các khoảng trắng có ý nghĩa,... Babel không phải là một ngôn ngữ mới nhưng là một trình biến đổi có tác dụng biến đổi các đoạn code Javascript ở thế hệ mới nhất với các chức năng chưa khả thi ở tất cả các trình duyệt (ES2015 và các phiên bản mới hơn) thành các đoạn code Javascript cũ hơn và tương thích với trình duyệt (ES5). Typescript là một ngôn ngữ khá độc lập và khác so với thế hệ Javascript kế tiếp, nhưng cũng có thêm phần tuỳ chọn kiểu dữ liệu tĩnh. Rất nhiều người chọn babel vì nó gần nhất với ngôn ngữ Javascript thuần tuý. Dưới đây là một ví dụ sử dụng babel với bước build thông qua webpack. Đầu tiên chúng ta cài đặt babel (là một package npm) thông qua câu lệnh:
Ở đây chúng ta đang cài 3 package riêng biệt cho development dependency -
Cú pháp trong file này có thể khiến chúng ta bối rối (rất may là chúng ta sẽ không phải chỉnh sửa những thứ này thường xuyên). Về cơ bản là chúng ta đang nói với webpack để tìm kiếm bất kì file nào có đuôi là .js (ngoại trừ các file nằm trong thư mực Giờ sau khi mọi thứ đã được cài đặt, chúng ta có thể bắt đầu viết các code theo style ES2015 trong Javascript code! Đây là một ví dụ áp dụng ES2015 template string trong file
Chúng
ta cũng có thể sử dụng câu lệnh import của ES2015 thay câu lệnh
Trong ví dụ này, câu lệnh
Giờ bạn có thể tải lại trang
Ở đây bạn có thể thấy babel đã biến đổi các đoạn code của phần template string trong ES2015 sang các đoạn code Javascript thông thường với các cú pháp nối string bằng dấu + để đảm bảo tính tương thích với trình duyệt. Mặc dù ví dụ cụ thể này có vẻ không thú vị lắm, nhưng khả năng biến đổi code là một tính năng thực sự mạnh mẽ. Có một vài tính năng thú vị đã được đưa vào JavaScript như là async/await, mà bạn có thể lập tức sử dụng để viết code một cách tốt hơn. Và trong khi việc biến đổi code trông có vẻ phiền phức và mệt mỏi, nhưng nó đã tạo ra sự thay đổi rất đáng để đến JS trong một vài năm gần đây, vì mọi người đã có thể test được những chức năng của ngày may ngay từ hôm nay. Chúng ta gần như đã điểm qua mọi tính nhưng, nhưng vẫn có một vài điểm chưa được trau chuốt lắm trong workflow của chúng ta. Nói về vấn đề performance, chúng ta có thể làm nhẹ/nén file bundle, mà có thể dễ dàng thực hiện thông qua bước build. Chúng ta cũng cần phải chạy lại lệnh webpack mỗi khi chúng ta thay đổi file JavaScript. Và tiếp theo đây sẽ là một số tool hỗ trợ giải quyết những công việc trên một cách tự động. Sử dụng một bộ chạy task - task runner (dùng npm scripts)Giờ sau khi đã sáng tạo ra một bước build để làm việc với Javascript module, thì việc sử dụng một bộ chạy task, với mục đích tự động hoá các thành phần trong quá trình build. Đối với việc phát triển frontend, các tasks sẽ bao gồm các việc làm gọn code, tối ưu hình ảnh, chạy test, ... Vào năm 2013, Grunt đã từng là một công cụ phổ biến nhất cho việc chạy task, theo sau ngay đó là Gulp. Cả hai đều phụ thuộc vào các plugins bao ngoài các công cụ command line. Ngày nay sự lựa chọn phổ biến nhất có vẻ là sử dụng khả năng tương thích với script được xây dựng trong chính npm, không sử dụng plugins nhưng thay vào đó hoạt động với các công cụ command line khác một cách trực tiếp. Hãy cùng viết một vài script npm để giúp cho việc sử dụng webpack dễ hơn. Việc này bao gồm vài thay đổi đơn giản trong file
Ở đây chúng ta có 2 đoạn script mới tên là
Việc này sẽ chạy webpack (sử dụng cấu hình từ file
Câu lệnh này sử dụng tuỳ chọn Lưu ý rằng các scripts trong file
Và sau đó thêm một đoạn script npm vào file
Và giờ chúng ta có thể khởi động server phát triển với câu lệnh:
Việc này sẽ tự động mở một website chứa file Những điều tôi trình bày ở trên chỉ là những thứ thô sơ bề mặt, còn rất nhiều tuỳ chọn với webpack và webpack-dev-server (mà bạn có thể tham khảo thêm ở đây). Bạn có thể tự tạo cho mình những đoạn script npm để chạy các công việc khác, như là conver từ SCSS về CSS, nén ảnh, chạy test - bất kì thứ gì hỗ trợ command line tool. Đồng thời cũng có rất nhiều tuỳ chọn nâng cao cùng với vài mẹo nho nhỏ hay ho với script về npm, mà bạn có thể tham khảo ở bài talk dưới đây của Kate Hudson Tổng kếtTrên đây là tổng quan về Javascript thời nay. Chúng ta đã đi từ thuần HTML và JS đến sử dụng một bộ quản lý package để tự động download các package cuả những bên thứ 3, dùng một công cụ bundle cho module để tạo ra một file script duy nhất, một bộ biến đổi để sử dụng các chức năng JS mới nhất, và một công cụ chạy task để tự hoá nhiều thành phần trong quá trình build. Đương nhiên là có rất nhiều thứ ở đây, đặc biệt là đối với người mới bắt đầu. Phát triển web đã từng là điểm bắt đầu rất tuyệt vời cho người mới học lập trình bởi nó rất dễ dàng để hiểu và phát triển; tuy nhiên ngày nay nó có thể trở nên khá là oải, đặc biệt trong tình trạng các công cụ thay đổi một cách chóng mặt hiện nay. Tuy nhiên mọi việc ko hẳn tệ đến mức như vậy. Nhiều thứ đang trở nên ổn định dần, đặc biệt với sự thích nghi của hệ sinh thái node trong việc hỗ trợ phát triển phía frontend. Việc sử dụng npm như một
công cụ quản lý package, các câu lệnh Một điều nữa cũng khiến các lập trình viên cảm thấy dễ thở hơn, đó là việc các framework thời nay đã có thêm các công cụ để làm cho quá trình phát triển trở nên dễ dàng hơn. Ember có ember-cli, là công cụ lấy cảm hứng phần lớn từ angular-cli của Angular, React thì có create-react-app, Vue thì có vue-cli,... Tất cả các công cụ sẽ giúp bạn khởi tạo một project với mọi thứ bạn cần - tất cả mọi thứ, để bạn có thể lập tức bắt tay vào viết code. Tuy nhiên các công cụ đó ko phải là phép thuật, nó chỉ đơn giản lại quá trình cài đặt dưới một tiêu chuẩn ổn định và theo phong cách chung. Cũng có những thời điểm bạn muốn thêm vào một vài tuỳ chỉnh với webpack, babel... nên việc hiểu được công dụng và khả năng của từng thành phần là rất quan trọng (đã được nói đến trong bài viết này). Javascript thời nay rất có thể trở nên bối rối khi phải làm việc cùng bởi sự thay đổi và tiến hoá chóng mặt của nó. Nhưng cùng với đó, vào nhưng thời điểm giống như lúc xây dựng lại cái bánh xe, sự phát triển nhanh chóng của Javascript đã thúc đẩy sự tiến bộ và cho ra đời những điều rất tuyệt vời như là hot reloading, linting (phân tích, tối ưu code) thời gian thực, debug code qua nhiều thời điểm - giống như du hành thời gian. Đây là thời gian rất thú vị để trở thành một lập trình viên, và tôi hy vọng những thông tin này có thể giúp bạn như một lộ trình trên con đường sự nghiệp của mình. |