Cách tạo module Node.js
Trong Node.js, một mô-đun là một tập hợp các hàm và đối tượng JavaScript được dùng bởi các ứng dụng bên ngoài. Việc mô tả một đoạn mã dưới dạng module đề cập ít hơn đến mã là gì và nhiều hơn đến chức năng của nó — các file Node.js nào hoặc tập hợp file nào cũng có thể được coi là module nếu các chức năng và dữ liệu của nó được sử dụng cho các chương trình bên ngoài.Bởi vì các module cung cấp các đơn vị chức năng được dùng lại trong nhiều chương trình lớn hơn, chúng cho phép bạn tạo các ứng dụng kết hợp lỏng lẻo với quy mô phức tạp và mở ra cánh cửa để bạn chia sẻ mã của bạn với các nhà phát triển khác. Việc có thể viết các module xuất các chức năng và dữ liệu hữu ích sẽ cho phép bạn đóng góp vào cộng đồng Node.js rộng lớn hơn — trên thực tế, tất cả các gói mà bạn sử dụng trên npm đều được đóng gói và chia sẻ dưới dạng module . Điều này làm cho việc tạo module trở thành một kỹ năng cần thiết cho một nhà phát triển Node.js.
Trong hướng dẫn này, bạn sẽ tạo một module Node.js gợi ý các nhà phát triển web nên sử dụng màu gì trong thiết kế của họ. Bạn sẽ phát triển module bằng cách lưu trữ các màu dưới dạng một mảng và cung cấp một hàm để lấy một cách ngẫu nhiên. Sau đó, bạn sẽ thực hiện nhiều cách khác nhau để nhập module vào ứng dụng Node.js.
Yêu cầu
- Bạn cần cài đặt Node.js và npm trên môi trường phát triển của bạn . Hướng dẫn này sử dụng version 10.17.0. Để cài đặt tính năng này trên macOS hoặc Ubuntu 18.04, hãy làm theo các bước trong Cách cài đặt Node.js và Tạo Môi trường Phát triển Cục bộ trên macOS hoặc phần Cài đặt Sử dụng PPA của Cách Cài đặt Node.js trên Ubuntu 18.04 . Bằng cách cài đặt Node.js, bạn cũng sẽ cài đặt npm; hướng dẫn này sử dụng version 6.11.3.
- Bạn cũng nên làm quen với file
package.json
và trải nghiệm với các lệnh npm cũng sẽ hữu ích. Để có được kinh nghiệm này, hãy làm theo Cách sử dụng Mô-đun Node.js với npm và package.json , đặc biệt là Bước 1 - Tạo filepackage.json
. - Nó cũng sẽ giúp bạn thoải mái với Node.js REPL (Đọc-Đánh giá-In-Vòng lặp). Bạn sẽ sử dụng điều này để kiểm tra module của bạn . Nếu bạn cần thêm thông tin về vấn đề này, hãy đọc hướng dẫn của ta về Cách sử dụng Node.js REPL .
Bước 1 - Tạo module
Bước này sẽ hướng dẫn bạn cách tạo module Node.js đầu tiên. Mô-đun của bạn sẽ chứa một tập hợp các màu trong một mảng và cung cấp một hàm để lấy ngẫu nhiên một màu. Bạn sẽ sử dụng thuộc tính exports
được tích hợp sẵn của Node.js để cung cấp hàm và mảng cho các chương trình bên ngoài.
Đầu tiên, bạn sẽ bắt đầu bằng cách quyết định dữ liệu nào về màu sắc mà bạn sẽ lưu trữ trong module của bạn . Mỗi màu sẽ là một đối tượng chứa thuộc tính name
mà con người có thể dễ dàng xác định và thuộc tính code
là một chuỗi chứa mã màu HTML. Mã màu HTML là các số thập lục phân có sáu chữ số cho phép bạn thay đổi màu của các phần tử trên trang web. Bạn có thể tìm hiểu thêm về mã màu HTML bằng cách đọc bài viết Tên và Mã màu HTML này.
Sau đó, bạn sẽ quyết định những màu nào bạn muốn hỗ trợ trong module của bạn . Mô-đun của bạn sẽ chứa một mảng được gọi là allColors
sẽ chứa sáu màu. Mô-đun của bạn cũng sẽ bao gồm một hàm có tên getRandomColor()
sẽ chọn ngẫu nhiên một màu từ mảng của bạn và trả về.
Trong terminal của bạn, hãy tạo một folder mới có tên là colors
và chuyển vào đó:
- mkdir colors
- cd colors
Khởi tạo npm để các chương trình khác có thể nhập module này sau trong hướng dẫn:
- npm init -y
Bạn đã sử dụng cờ -y
để bỏ qua các dấu nhắc thông thường để tùy chỉnh package.json
của bạn . Nếu đây là module bạn muốn xuất bản lên npm, bạn sẽ trả lời tất cả các dấu nhắc này với dữ liệu liên quan, như được giải thích trong Cách sử dụng module Node.js với npm và package.json .
Trong trường hợp này, kết quả của bạn sẽ là:
Output{ "name": "colors", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC" }
Bây giờ, hãy mở editor dòng lệnh chẳng hạn như nano
và tạo một file mới để làm điểm nhập cho module của bạn:
- nano index.js
Mô-đun của bạn sẽ thực hiện một số điều. Đầu tiên, bạn sẽ xác định một lớp Color
. Lớp Color
của bạn sẽ được khởi tạo với tên và mã HTML của nó. Thêm các dòng sau để tạo lớp:
class Color { constructor(name, code) { this.name = name; this.code = code; } }
Đến đây bạn đã có cấu trúc dữ liệu cho Color
, hãy thêm một số version vào module của bạn. Viết mảng được đánh dấu sau vào file của bạn:
class Color { constructor(name, code) { this.name = name; this.code = code; } } const allColors = [ new Color('brightred', '#E74C3C'), new Color('soothingpurple', '#9B59B6'), new Color('skyblue', '#5DADE2'), new Color('leafygreen', '#48C9B0'), new Color('sunkissedyellow', '#F4D03F'), new Color('groovygray', '#D7DBDD'), ];
Cuối cùng, nhập một hàm chọn ngẫu nhiên một mục từ mảng allColors
mà bạn vừa tạo:
class Color { constructor(name, code) { this.name = name; this.code = code; } } const allColors = [ new Color('brightred', '#E74C3C'), new Color('soothingpurple', '#9B59B6'), new Color('skyblue', '#5DADE2'), new Color('leafygreen', '#48C9B0'), new Color('sunkissedyellow', '#F4D03F'), new Color('groovygray', '#D7DBDD'), ]; exports.getRandomColor = () => { return allColors[Math.floor(Math.random() * allColors.length)]; } exports.allColors = allColors;
Từ khóa exports
tham chiếu đến một đối tượng toàn cục có sẵn trong mọi module Node.js. Tất cả các chức năng và đối tượng được lưu trữ trong đối tượng exports
của module sẽ được hiển thị khi các module Node.js khác nhập nó. Ví getRandomColor()
được tạo trực tiếp trên đối tượng exports
. Sau đó, bạn đã thêm allColors
tính allColors
vào đối tượng exports
tham chiếu đến mảng allColors
hằng số local được tạo trước đó trong tập lệnh.
Khi các module khác nhập module này, cả allColors
và getRandomColor()
sẽ được hiển thị và có sẵn để sử dụng.
Lưu và thoát khỏi file .
Lúc này, bạn đã tạo một module chứa một mảng màu và một hàm trả về một màu ngẫu nhiên. Bạn cũng đã xuất mảng và hàm để các chương trình bên ngoài có thể sử dụng chúng. Trong bước tiếp theo, bạn sẽ sử dụng module của bạn trong các ứng dụng khác để chứng minh tác dụng của việc export
.
Bước 2 - Kiểm tra Mô-đun của bạn với REPL
Trước khi bạn tạo một ứng dụng hoàn chỉnh, hãy dành một chút thời gian để xác nhận module của bạn đang hoạt động. Trong bước này, bạn sẽ sử dụng REPL để tải module colors
. Khi ở trong REPL, bạn sẽ gọi hàm getRandomColor()
để xem nó có hoạt động như bạn mong đợi hay không.
Khởi động Node.js REPL trong cùng folder với index.js
:
- node
Khi REPL đã bắt đầu, bạn sẽ thấy dấu nhắc >
. Điều này nghĩa là bạn có thể nhập mã JavaScript sẽ được đánh giá ngay lập tức. Nếu bạn muốn đọc thêm về điều này, hãy làm theo hướng dẫn của ta về cách sử dụng REPL .
Đầu tiên, nhập thông tin sau:
- colors = require('./index');
Trong lệnh này, require()
tải module colors
tại điểm nhập của nó. Khi bạn nhấn ENTER
bạn sẽ nhận được:
Output{ getRandomColor: [Function], allColors: [ Color { name: 'brightred', code: '#E74C3C' }, Color { name: 'soothingpurple', code: '#9B59B6' }, Color { name: 'skyblue', code: '#5DADE2' }, Color { name: 'leafygreen', code: '#48C9B0' }, Color { name: 'sunkissedyellow', code: '#F4D03F' }, Color { name: 'groovygray', code: '#D7DBDD' } ] }
REPL cho ta thấy giá trị của colors
, là tất cả các chức năng và đối tượng được nhập từ index.js
. Khi bạn sử dụng các require
từ khóa, Node.js trả về tất cả các nội dung trong exports
đối tượng của một module.
Nhớ lại rằng bạn đã thêm getRandomColor()
và allColors
để exports
trong module colors
. Vì lý do đó, bạn sẽ thấy cả hai trong REPL khi chúng được nhập.
Tại dấu nhắc , hãy kiểm tra hàm getRandomColor()
:
- colors.getRandomColor();
Bạn sẽ được yêu cầu với một màu ngẫu nhiên:
OutputColor { name: 'groovygray', code: '#D7DBDD' }
Vì index là ngẫu nhiên, kết quả của bạn có thể thay đổi. Đến đây bạn đã xác nhận module colors
đang hoạt động, hãy thoát khỏi REPL của Node.js:
- .exit
Thao tác này sẽ đưa bạn trở lại dòng lệnh terminal của bạn.
Bạn vừa xác nhận module của bạn hoạt động như mong đợi bằng cách sử dụng REPL. Tiếp theo, bạn sẽ áp dụng các khái niệm tương tự này và tải module của bạn vào một ứng dụng, giống như cách bạn làm trong một dự án thực.
Bước 3 - Lưu Mô-đun local của bạn dưới dạng Phụ thuộc
Trong khi kiểm tra module của bạn trong REPL, bạn đã nhập nó bằng một đường dẫn tương đối . Điều này nghĩa là bạn đã sử dụng vị trí của index.js
liên quan đến folder làm việc để lấy nội dung của nó. Mặc dù điều này hoạt động, nhưng trải nghiệm lập trình thường tốt hơn nếu nhập các module theo tên của chúng để quá trình nhập không bị hỏng khi ngữ cảnh bị thay đổi. Trong bước này, bạn sẽ cài đặt module colors
với tính năng install
module local của npm.
Cài đặt module Node.js mới bên ngoài folder colors
. Đầu tiên, hãy chuyển đến folder trước và tạo một folder mới:
- cd ..
- mkdir really-large-application
Bây giờ chuyển sang dự án mới của bạn:
- cd really-large-application
Giống như với module colors
, khởi tạo folder của bạn bằng npm:
- npm init -y
package.json
sau sẽ được tạo:
Output{ "name": "really-large-application", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC" }
Bây giờ, cài đặt module colors
của bạn và sử dụng cờ --save
để nó sẽ được ghi lại trong file package.json
của bạn:
- npm install --save ../colors
Bạn vừa cài đặt module colors
của bạn trong dự án mới. Mở file package.json
để xem phần phụ thuộc local mới:
- nano package.json
Bạn sẽ thấy rằng các dòng được đánh dấu sau đã được thêm vào:
{ "name": "really-large-application", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "colors": "file:../colors" } }
Thoát khỏi file .
Mô-đun colors
đã được sao chép vào folder node_modules
của bạn. Xác minh nó ở đó bằng lệnh sau:
- ls node_modules
Điều này sẽ cho kết quả sau:
Outputcolors
Sử dụng module local đã cài đặt của bạn trong chương trình mới này. Mở lại editor của bạn và tạo một file JavaScript khác:
- nano index.js
Chương trình của bạn trước tiên sẽ nhập module colors
. Sau đó, nó sẽ chọn một màu ngẫu nhiên bằng cách sử dụng hàm getRandomColor()
được cung cấp bởi module . Cuối cùng, nó sẽ in một thông báo đến bàn điều khiển để cho user biết màu gì nên sử dụng.
Nhập mã sau vào index.js
:
const colors = require('colors'); const chosenColor = colors.getRandomColor(); console.log(`You should use ${chosenColor.name} on your website. It's HTML code is ${chosenColor.code}`);
Lưu và thoát khỏi file này.
Ứng dụng của bạn bây giờ sẽ cho user biết một tùy chọn màu ngẫu nhiên cho một thành phần trang web.
Chạy tập lệnh này với:
- node index.js
Đầu ra của bạn sẽ tương tự như:
OutputYou should use leafygreen on your website. It's HTML code is #48C9B0
Đến đây bạn đã cài đặt thành công module colors
và có thể quản lý nó giống như bất kỳ gói npm nào khác được sử dụng trong dự án của bạn. Tuy nhiên, nếu bạn đã thêm nhiều màu và chức năng hơn vào module colors
local của bạn , bạn sẽ phải chạy npm update
trong các ứng dụng của bạn để có thể sử dụng các tùy chọn mới. Trong bước tiếp theo, bạn sẽ sử dụng colors
module local theo cách khác và nhận cập nhật tự động khi mã module thay đổi.
Bước 4 - Liên kết một module local
Nếu module local của bạn đang trong giai đoạn phát triển nặng, việc cập nhật liên tục các gói có thể rất tẻ nhạt. Một giải pháp thay thế sẽ là liên kết các module . Việc liên kết một module đảm bảo bất kỳ cập nhật nào đối với module đó được phản ánh ngay lập tức trong các ứng dụng sử dụng nó.
Trong bước này, bạn sẽ liên kết module colors
với ứng dụng của bạn . Bạn cũng sẽ sửa đổi module colors
và xác nhận những thay đổi mới nhất của nó hoạt động trong ứng dụng mà không cần phải cài đặt lại hoặc nâng cấp.
Đầu tiên, gỡ cài đặt module local của bạn:
- npm un colors
npm liên kết các module bằng cách sử dụng các softlink (hoặc softlink ), là các tham chiếu trỏ đến file hoặc folder trong máy tính của bạn. Liên kết một module được thực hiện theo hai bước:
- Tạo liên kết global đến module . npm tạo một softlink giữa folder
node_modules
global và folder module của bạn. Thư mụcnode_modules
toàn cục là vị trí trong đó tất cả các góinode_modules
trên toàn hệ thống của bạn được cài đặt (bất kỳ gói nào bạn cài đặt với cờ-g
). - Tạo một liên kết local . npm tạo một softlink giữa dự án local của bạn đang sử dụng module và liên kết global của module .
Đầu tiên, tạo liên kết chung bằng cách quay lại folder colors
và sử dụng lệnh link
:
- cd ../colors
- sudo npm link
Sau khi hoàn tất, shell của bạn sẽ xuất ra:
Output/usr/local/lib/node_modules/colors -> /home/sammy/colors
Bạn vừa tạo một softlink trong folder node_modules
của bạn đến folder colors
của bạn.
Quay lại folder really-large-application
và liên kết gói:
- cd ../really-large-application
- sudo npm link colors
Bạn sẽ nhận được kết quả tương tự như sau:
Output/home/sammy/really-large-application/node_modules/colors -> /usr/local/lib/node_modules/colors -> /home/sammy/colors
Lưu ý : Nếu bạn muốn nhập ít hơn một chút, bạn có thể sử dụng ln
thay vì link
. Ví dụ, các npm ln colors
sẽ hoạt động theo cùng một cách.
Như kết quả kết quả cho thấy, bạn vừa tạo một softlink từ folder node_modules
local của really-large-application
đến softlink colors
trong node_modules
toàn cục của bạn, liên kết này trỏ đến folder thực có module colors
.
Quá trình liên kết đã hoàn tất. Chạy file của bạn đảm bảo nó vẫn hoạt động:
- node index.js
Đầu ra của bạn sẽ tương tự như:
OutputYou should use sunkissedyellow on your website. It's HTML code is #F4D03F
Chức năng chương trình của bạn còn nguyên vẹn. Tiếp theo, kiểm tra xem các bản cập nhật có được áp dụng ngay lập tức hay không. Trong editor của bạn, hãy mở lại index.js
trong module colors
:
- cd ../colors
- nano index.js
Bây giờ, hãy thêm một chức năng chọn màu xanh lam tốt nhất hiện có. Nó không cần đối số và luôn trả về mục thứ ba của mảng allColors
. Thêm các dòng này vào cuối file :
class Color { constructor(name, code) { this.name = name; this.code = code; } } const allColors = [ new Color('brightred', '#E74C3C'), new Color('soothingpurple', '#9B59B6'), new Color('skyblue', '#5DADE2'), new Color('leafygreen', '#48C9B0'), new Color('sunkissedyellow', '#F4D03F'), new Color('groovygray', '#D7DBDD'), ]; exports.getRandomColor = () => { return allColors[Math.floor(Math.random() * allColors.length)]; } exports.allColors = allColors; exports.getBlue = () => { return allColors[2]; }
Lưu và thoát khỏi file , sau đó mở lại index.js
trong folder really-large-application
:
- cd ../really-large-application
- nano index.js
Thực hiện cuộc gọi đến hàm getBlue()
mới được tạo và in một câu có thuộc tính của màu. Thêm các câu lệnh này vào cuối file :
const colors = require('colors'); const chosenColor = colors.getRandomColor(); console.log(`You should use ${chosenColor.name} on your website. It's HTML code is ${chosenColor.code}`); const favoriteColor = colors.getBlue(); console.log(`My favorite color is ${favoriteColor.name}/${favoriteColor.code}, btw`);
Lưu và thoát khỏi file .
Đoạn mã bây giờ sử dụng hàm getBlue()
mới tạo. Thực thi file như trước:
- node index.js
Bạn sẽ nhận được kết quả như:
OutputYou should use brightred on your website. It's HTML code is #E74C3C My favorite color is skyblue/#5DADE2, btw
Tập lệnh của bạn đã có thể sử dụng chức năng mới nhất trong module colors
của bạn mà không cần phải chạy npm update
. Điều này sẽ giúp bạn dễ dàng áp dụng các thay đổi đối với ứng dụng này trong quá trình phát triển.
Khi bạn viết các ứng dụng lớn hơn và phức tạp hơn, hãy nghĩ về cách mã liên quan có thể được group thành các module và cách bạn muốn các module này được cài đặt . Nếu module của bạn chỉ được sử dụng bởi một chương trình, nó có thể nằm trong cùng một dự án và được tham chiếu bởi một đường dẫn tương đối. Nếu module của bạn sau này sẽ được chia sẻ riêng biệt hoặc tồn tại ở một vị trí rất khác với dự án bạn đang làm hiện tại, thì việc cài đặt hoặc liên kết có thể khả thi hơn. Các module đang trong quá trình phát triển tích cực cũng được hưởng lợi từ việc cập nhật liên kết tự động. Nếu module không được phát triển tích cực, sử dụng npm install
có thể là tùy chọn dễ dàng hơn.
Kết luận
Trong hướng dẫn này, bạn đã biết rằng module Node.js là một file JavaScript với các hàm và đối tượng được dùng bởi các chương trình khác. Sau đó, bạn tạo một module và gắn các chức năng và đối tượng của bạn vào đối tượng exports
toàn cục để cung cấp chúng cho các chương trình bên ngoài. Cuối cùng, bạn đã nhập module đó vào một chương trình, chứng minh cách các module kết hợp với nhau thành các ứng dụng lớn hơn.
Đến đây bạn đã biết cách tạo module , hãy nghĩ về loại chương trình bạn muốn viết và chia nó thành nhiều thành phần khác nhau, giữ từng tập hợp hoạt động và dữ liệu duy nhất trong module của riêng chúng. Bạn càng thực hành nhiều module viết, bạn càng có khả năng viết các chương trình Node.js chất lượng trên hành trình học tập của bạn . Để làm việc thông qua một ví dụ về ứng dụng Node.js sử dụng module , hãy xem hướng dẫn Cách cài đặt ứng dụng Node.js để production trên Ubuntu 18.04 của ta .
Các tin liên quan