Node.js sử dụng kiến trúc module để chia tách code thành các thành phần riêng rẽ để giúp cho việc bảo trì và tái sử dụng code được tốt hơn. Mỗi module là 1 tập hàm có chức năng liên quan tới một đối tượng và được khai báo ở một file.
Note: đây là format của CommonJS.
Export & Import module:
- Export module với
module.exports
- Import module với
require
function.
Có 2 cách để export và import module:
- Cách 1: export và require trực tiếp hàm từ module:
1 |
|
1 | const add = require('./add'); |
- Cách 2: export và require module dưới dạng object:
1 |
|
1 | const util = require('./util'); |
Với cách này, khuyến nghị combine với destructuring assignment:
1 | const { add } = require('./util'); |
Có 2 đặc tính của hàm require
mà mình nghĩ bạn cần lưu ý: resolving & caching.
Resolving
Đây là bước Node.js tiến hành tìm ra đường dẫn tuyệt đối của file để import. Các giá trị mà hàm require
chấp nhận là:
- Core module. VD:
require('http')
- 3rd module. VD:
require('express')
- JS file, NODE file, đường dẫn tuyệt đối hoặc tương đối. VD:
require('./foo.node')
,require('./foo.js')
hoặcrequire('/lorem/ipsum.js')
- JSON file, tương tự như JS file. VD:
require('./foo.json')
- Folder. VD:
require('./foo')
(chính là require tới file index.js trong thư mục foo:require('./foo/index.js')
)
Đối với trường hợp không phải là đường dẫn tương đối hay tuyệt đối, Node.js sẽ tìm trong thư mục node_modules
và tiếp tục truy ngược lên thư mục cha (cho tới lúc chạm root thì dừng) nếu không tìm thấy. VD: giả dụ bạn đang đứng ở thư mục /home/duc/Projects/nodejs
và sử dụng require('foo.js')
thì thứ tự tìm sẽ là:
- /home/duc/Projects/nodejs/node_modules/foo.js
- /home/duc/Projects/node_modules/foo.js
- /home/duc/node_modules/foo.js
- /home/node_modules/foo.js
- /node_modules/foo.js
Và tất nhiên nếu không tìm được kết quả thỏa mãn, Node.js sẽ throw ra Error.
Note:
- Ngoài ra Node.js còn tìm trong các thư mục được define ở biến môi trường
NODE_PATH
. - Có thể xem Node.js sẽ tìm kiếm module trong những thư mục nào bằng việc log ra
path
củamodule
1 | console.log(module); |
1 | Module { |
Caching
Require là tiến trình đồng bộ, việc cache module sẽ giúp giảm thiểu thời gian load ứng dụng. Trong lần đầu tiên module được load, nó sẽ được cache lại, trong các lần require
tiếp theo, bản cache của module sẽ được trả về. Xét VD:
1 | console.log(123); |
1 | require('foo.js'); |
Và khi chạy file index.js
, kết quả xuất hiện sẽ là:
1 | 123 |
Conclusion
Note: Hiện tại bạn có thể sử dụng ES6 với Babel. Babel sẽ convert cụm import
/export
sang require
/module.exports
.
Trên đây là giới thiệu về hàm require
trong kiến trúc module của Node.js và một số đặc tính của nó. Thanks for reading!