11/08/2018, 20:31

Module trong NodeJS - viết một lần thôi

Như những bài viết khác của mình, trước khi bắt tay vào, mình đã tìm kiếm trên kipalog và không thấy bài viết nào nói về vấn đề này. Trọng tâm của bài viết này là cách làm sao viết một module chạy được trên cả client lẫn server với nodejs , và bài viết này chỉ phù hợp cho những ai mới làm quen ...

Như những bài viết khác của mình, trước khi bắt tay vào, mình đã tìm kiếm trên kipalog và không thấy bài viết nào nói về vấn đề này. Trọng tâm của bài viết này là cách làm sao viết một module chạy được trên cả client lẫn server với nodejs, và bài viết này chỉ phù hợp cho những ai mới làm quen nodejs như mình :)

Ứng dụng thực tế

Mình luôn đặt câu hỏi này đầu tiên. Ứng dụng của cách làm này đó chính là tận dụng, khỏi viết đi viết lại những đoạn code giống nhau, đơn giản vậy thôi. Chắc các bạn đã quen với việc validate form người dùng nhập, ở cả server lẫn client. Nếu như server và client dùng hai ngôn ngữ khác nhau, chẳng hạn PHP và javascript, bạn sẽ phải viết đi viết lại (ít nhất là 2 lần) để kiểm tra những giá trị của người dùng nhập vào. Không phải bàn cãi về sự phiền phức khi thay đổi điều kiện validate. Và ở đây, nếu chúng ta dùng nodejs ở phía server, thì có cách để chỉ viết một lần thôi, vì cả hai phía đều là ngôn ngữ javascript cả mà :))

Giả sử như bạn đã biết cách tạo module trong nodejs, chúng ta sử dụng hàm requiremodule.exports để import một module và xuất một module. Ví dụ một module kiểm tra giá trị form người dùng nhập vào, đoạn code này nằm trong file bar.js:

//bar.js
var bar = {};

//Others variables and functions

module.exports = bar;

Thật là tuyệt vời nếu như chúng ta có thể đơn giản chèn file bar.js vào trình duyệt như những file js khác, đồng nghĩa với việc bạn muốn sử dụng những đoạn code nằm trong chỗ Others variables and functions ở chỗ xử lý sự kiện nút submit chẳng hạn (dĩ nhiên không phải là copy paste lại). Tuy nhiên, mọi thứ không tươi đẹp như vậy, trình duyệt sẽ không thể hiểu được require là hàm ở đâu ra và module.exports cũng thế và sẽ báo lỗi undefined, vâng, lỗi kinh điển của javascript. Dĩ nhiên về phía server, nó hiểu vì nodejs nó hỗ trợ hai cái này. Nếu vậy, cốt lõi ở đây chính là, hiện tại trình duyệt chưa hỗ trợ hàm require và module, cũng như module.exports.

Không lẽ anh em dev chúng ta bó tay chỉ vì một lý do như thế? Dĩ nhiên là không, và đây là giải pháp, rất dễ, đó chính là xài if else, nếu như là ở trình duyệt thì gắn vào một biến global, ví dụ window, còn nếu là phía server thì require, exports bình thường.

(function() {
  var bar = (function() {
        //Others variables and functions
  })();

  if (typeof module !== 'undefined' && typeof module.exports !== 'undefined')
        module.exports = bar;
  else
        window.bar = bar;
})();

Và để sử dụng trên phía server, ta chỉ việc gọi hàm require bình thường, còn phía trình duyệt, bạn có thể đơn giản dùng thẻ script

<script src="bar.js"></script>

Xong. Cá nhân mình thấy đây là một điều khiến nodejs ghi điểm thêm với mình, và cực kỳ hữu ích, bảo sao cộng đồng javascript ngày càng phát triển. Còn một cách nữa là dùng tới RequireJS, hẹn ở bài viết khác. Hi vọng bài viết có ích cho tất cả mọi người. Cảm ơn tất cả các bạn đã đọc :)

Nguồn

http://www.matteoagosti.com/blog/2013/02/24/writing-javascript-modules-for-both-browser-and-node/
https://stackoverflow.com/questions/3225251/how-can-i-share-code-between-node-js-and-the-browser

0