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 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

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

ShinaBR2

10 bài viết.
88 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
54 16
Đây là một vấn đề kinh điển, và có rất nhiều bài viết về nó, tuy nhiên đa phần là dịch từ bản gốc ra và sao chép lại một vài câu lệnh, và câu hỏi t...
ShinaBR2 viết 8 tháng trước
54 16
White
32 9
Vào một ngày đẹp trời, khi bạn nhận được yêu cầu phải thiết kế database cho một hệ thống, câu hỏi đầu tiên được đặt ra, quy trình làm ra nó sẽ cụ t...
ShinaBR2 viết 8 tháng trước
32 9
White
30 8
Bàn về code thối Hãy tự đặt câu hỏi cho bạn, khi bắt đầu lập trình, bạn nghĩ tới điều gì? Đi phỏng vấn Điều đầu tiên tôi muốn nói về những câu hỏ...
ShinaBR2 viết 3 tháng trước
30 8
Bài viết liên quan
White
14 0
Javascript là một ngôn ngữ hết sức uyển chuyển,với một vấn đề bạn gặp phải có hàng tá cách để thực hiện. Với một người mới bắt đầu vào việc lập trì...
Quốc Cường viết hơn 2 năm trước
14 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
10 bài viết.
88 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!