Trong lập trình, mô-đun là thành phần của chương trình có một hoặc nhiều chức năng hoặc giá trị.
Những giá trị này cũng có thể được chia sẻ trên toàn bộ chương trình và có thể được sử dụng theo những cách khác nhau.
Trong bài viết này, tôi sẽ chỉ cho bạn cách chia sẻ các hàm và giá trị bằng cách xuất và nhập các mô-đun trong Node.js.
Tại sao xuất mô-đun?
Bạn sẽ muốn xuất các mô-đun để có thể sử dụng chúng trong các phần khác của ứng dụng.
Các mô-đun có thể phục vụ các mục đích khác nhau. Họ có thể cung cấp các tiện ích đơn giản để sửa đổi chuỗi. Họ có thể cung cấp các phương thức để thực hiện các yêu cầu API. Hoặc thậm chí chúng có thể cung cấp các hằng số và giá trị nguyên thủy.
Khi bạn xuất một mô-đun, bạn có thể nhập nó vào các phần khác của ứng dụng và sử dụng nó.
Node.js hỗ trợ Mô-đun CommonJS và Mô-đun ECMAScript.
Đối với phần còn lại của bài viết này, chúng ta sẽ tập trung vào CommonJS Modules, cách tiếp cận ban đầu để đóng gói các mô-đun trong Node.js.
Nếu bạn muốn tìm hiểu thêm về Mô-đun ES (cùng với các mô-đun CommonJS), bạn có thể xem hướng dẫn chuyên sâu này.
Cách xuất các mô-đun trong nút
Node.js đã xuất các mô-đun dựng sẵn bao gồm fs, đường dẫn và http để đặt tên cho một số. Nhưng bạn có thể tạo các mô-đun của riêng mình.
Node.js coi mỗi tệp trong dự án Node là một mô-đun có thể xuất các giá trị và chức năng từ tệp.
Ví dụ: bạn có một tệp tiện ích utility.js
với đoạn mã sau:
// utility.js
const replaceStr = (str, char, replacer) => {
const regex = new RegExp(char, "g")
const replaced = str.replace(regex, replacer)
return replaced
}
utility.js
là một mô-đun mà các tệp khác có thể nhập nội dung từ đó. Nhưng mà utility.js
hiện tại không xuất bất cứ thứ gì.
Bạn có thể xác minh điều này bằng cách kiểm tra toàn cầu module
đối tượng trong mỗi tập tin. Khi bạn in module
đối tượng chung trong tệp tiện ích này, bạn có:
console.log(module)
// {
// id: ".",
// path: "...",
// exports: {},
// parent: null,
// filename: "...",
// loaded: false,
// children: [],
// paths: [
// ...
// ],
// }
Các module
đối tượng có một exports
như bạn có thể thấy, là một đối tượng trống.
Vì vậy, mọi nỗ lực nhập bất kỳ thứ gì từ tệp này sẽ gây ra lỗi.
Các utility.js
tập tin có một replaceStr
phương thức thay thế các ký tự trong một chuỗi bằng một số ký tự khác. Chúng ta có thể xuất hàm này từ mô-đun này để sử dụng cho các tệp khác.
Đây là cách:
// utility.js
const replaceStr = (str, char, replacer) => {
const regex = new RegExp(char, "g")
const replaced = str.replace(regex, replacer)
return replaced
}
module.exports = { replaceStr }
// or
exports.replaceStr = replaceStr
Hiện nay, replaceStr
có sẵn để sử dụng trong các phần khác của ứng dụng. Để sử dụng nó, bạn nhập nó như thế này:
const { replaceStr } = require('./utility.js')
// then use the function anywhere
module.exports so với xuất trong Node
Bạn có thể xuất các hàm và giá trị từ một mô-đun bằng cách sử dụng module.exports
:
module.exports = { value1, function1 }
hoặc bằng cách sử dụng exports
:
exports.value1 = value1
exports.function1 = function1
Có gì khác biệt?
Những phương pháp này là khá giống nhau. Về cơ bản, exports
phục vụ như một tài liệu tham khảo để module.exports
. Để hiểu điều này tốt hơn, chúng ta hãy điền vào exports
đối tượng bằng cách sử dụng hai cách xuất giá trị:
const value1 = 50
exports.value1 = value1
console.log(module)
// {
// id: ".",
// path: "...",
// exports: { value1: 50 },
// parent: null,
// filename: "...",
// loaded: false,
// children: [],
// paths: [
// ...
// ],
// }
const function1 = function() {
console.log("I am a function")
}
module.exports = { function1, ...module.exports }
console.log(module)
// {
// id: ".",
// path: "...",
// exports: { function1: [Function: function1] },
// parent: null,
// filename: "...",
// loaded: false,
// children: [],
// paths: [
// ...
// ],
// }
Có hai điều cần chú ý ở đây:
- Các
exports
từ khóa là một tham chiếu đếnexports
đối tượng trongmodules
vật. bằng cách làmexports.value1 = value1
nó đã thêmvalue1
tài sản chomodule.exports
đối tượng, như bạn có thể thấy trong nhật ký đầu tiên. - Nhật ký thứ hai không chứa
value1
xuất khẩu nữa. Nó chỉ có chức năng được xuất bằng cách sử dụngmodule.exports
. Tại sao cái này rất?
module.exports = ...
là một cách gán lại một đối tượng mới cho exports
tài sản. Đối tượng mới chỉ chứa chức năng, vì vậy value1
không còn được xuất khẩu.
Vậy sự khác biệt là gì?
Xuất giá trị chỉ với exports
từ khóa là một cách nhanh chóng để xuất các giá trị từ một mô-đun. Bạn có thể sử dụng từ khóa này ở trên cùng hoặc dưới cùng và tất cả những gì nó làm là điền vào module.exports
vật. Nhưng nếu bạn đang sử dụng exports
trong một tệp, hãy kiên trì sử dụng nó trong suốt tệp đó.
sử dụng module.exports
là một cách chỉ định rõ ràng xuất khẩu của mô-đun. Và lý tưởng nhất là điều này chỉ tồn tại một lần trong một tệp. Nếu nó tồn tại hai lần, khai báo thứ hai sẽ gán lại module.exports
thuộc tính và mô-đun chỉ xuất nội dung khai báo thứ hai.
Vì vậy, như một giải pháp cho mã trước đó, bạn có thể xuất như thế này:
// ...
exports.value1 = value1
// ...
exports.function1 = function1
hoặc như thế này:
// ...
module.exports = { value1, function1 }
Gói (lại
Mỗi tệp trong dự án Node.js được coi là một mô-đun có thể xuất các giá trị để các mô-đun khác sử dụng.
module.exports
là một đối tượng trong tệp Node.js chứa các giá trị và hàm đã xuất từ mô-đun đó.
Khai báo một module.exports
đối tượng trong một tệp chỉ định các giá trị sẽ được xuất từ tệp đó. Khi được xuất, một mô-đun khác có thể nhập các giá trị này với require
phương pháp toàn cầu.