Export Statement: Chia Sẻ Code Như Flex TikTok Trong Node.js
Nodejs

Export Statement: Chia Sẻ Code Như Flex TikTok Trong Node.js

Author

Admin System

@root

Ngày xuất bản

18 Mar, 2026

Lượt xem

40 Lượt

"export statement"

Chào các Gen Z tương lai của làng code! Anh Creyt đây, hôm nay chúng ta sẽ "bóc tách" một khái niệm mà nghe thì tưởng "sờ-oai" nhưng thực ra lại "chill" cực kỳ trong Node.js: export statement. Tưởng tượng thế này, bạn có một video TikTok triệu view, một "bí kíp" làm đẹp hay một "tutorial" chơi game đỉnh cao. Bạn muốn chia sẻ nó với cả thế giới (hoặc ít nhất là với bạn bè thân thiết). Làm sao để họ xem được mà không cần phải "copy-paste" nguyên cái điện thoại của bạn? Chính xác, bạn export (xuất) nó ra!

export statement là gì mà "làm mưa làm gió" trong Node.js?

Trong thế giới Node.js, export (cùng với require mà chúng ta sẽ nói sau) chính là "cánh cổng thần kỳ" giúp bạn chia sẻ code giữa các file với nhau. Nó giống như việc bạn đóng gói những "tuyệt chiêu" lập trình của mình (có thể là một hàm tính toán, một biến quan trọng, hay cả một class "xịn xò") vào một cái hộp, dán nhãn và để ở nơi mà các file khác có thể đến lấy về dùng.

Để làm gì ư? Đơn giản là để codebase của bạn không bị "toxic" vì lộn xộn! Thay vì nhồi nhét tất cả code vào một file duy nhất dài ngoằng như sớ Táo Quân, bạn có thể chia nhỏ chúng ra thành các module (các file riêng biệt) theo chức năng. Mỗi module là một "chuyên gia" trong lĩnh vực của nó: file này lo tính toán, file kia lo xử lý dữ liệu người dùng, file nọ lo kết nối database. Khi cần, bạn chỉ việc "gọi tên" module đó và dùng cái mà nó export ra.

Lợi ích "nhãn tiền" của việc này là:

  • Tái sử dụng (Reusability): Viết một lần, dùng nhiều nơi. Như mấy cái filter "hot hit" trên Instagram ấy.
  • Dễ bảo trì (Maintainability): Code ngắn gọn, phân chia rõ ràng giúp bạn dễ dàng sửa lỗi hoặc nâng cấp mà không làm "sập" cả hệ thống.
  • Sắp xếp gọn gàng (Organization): Codebase của bạn sẽ "thơm tho" và "sạch sẽ" như tủ quần áo của một fashionista.

Trong Node.js, chúng ta chủ yếu dùng hệ thống module CommonJS với cú pháp module.exportsrequire().

Code Ví Dụ Minh Hoạ: "Bóc phốt" cách export hoạt động

Hãy tưởng tượng bạn đang xây dựng một ứng dụng tính toán "siêu cấp vũ trụ".

1. Export một thứ duy nhất (Single Export): Bạn có một hàm add (cộng) rất "xịn". Bạn muốn chia sẻ nó.

  • File: math.js

    function add(a, b) {
      return a + b;
    }
    
    // "Đóng gói" hàm add và bảo Node.js rằng đây là thứ duy nhất mà file này muốn "export" ra ngoài.
    module.exports = add;
    
  • File: app.js (file muốn dùng hàm add)

    // "Gọi tên" file math.js và "lấy" cái mà nó đã "export" ra.
    const addFunction = require('./math');
    
    const result = addFunction(5, 3);
    console.log('5 + 3 =', result); // Output: 5 + 3 = 8
    

    Ở đây, module.exports = add; nghĩa là "file math.js này chỉ có một giá trị chính để xuất ra, và đó chính là hàm add."

2. Export nhiều thứ cùng lúc (Multiple Exports - Object): Giờ bạn có thêm hàm subtract (trừ) nữa. Bạn muốn xuất cả hai.

  • File: utils.js

    function add(a, b) {
      return a + b;
    }
    
    function subtract(a, b) {
      return a - b;
    }
    
    // "Đóng gói" cả hai hàm vào một object và "export" object đó.
    module.exports = {
      add: add, // Hoặc viết tắt là 'add' (ES6 shorthand property names)
      subtract: subtract
    };
    
    // Một cách khác, dùng 'exports' (là một reference tới module.exports):
    // exports.add = add;
    // exports.subtract = subtract;
    // LƯU Ý: Không gán trực tiếp 'exports = ...' vì nó sẽ phá vỡ reference.
    // Luôn dùng 'module.exports = ...' khi muốn gán một giá trị mới hoàn toàn.
    
  • File: app.js

    // "Lấy" các hàm add và subtract từ object đã được export bằng destructuring.
    const { add, subtract } = require('./utils');
    
    console.log('10 + 4 =', add(10, 4));     // Output: 10 + 4 = 14
    console.log('10 - 4 =', subtract(10, 4)); // Output: 10 - 4 = 6
    

3. Export một Class (Class Export): Bạn đang xây dựng một ứng dụng quản lý người dùng.

  • File: User.js

    class User {
      constructor(name, age) {
        this.name = name;
        this.age = age;
      }
    
      greet() {
        return `Hi, I'm ${this.name} and I'm ${this.age} years old.`;
      }
    }
    
    module.exports = User;
    
  • File: app.js

    const User = require('./User');
    
    const user1 = new User('Alice', 25);
    console.log(user1.greet()); // Output: Hi, I'm Alice and I'm 25 years old.
    
Illustration

Mẹo vặt của Creyt (Best Practices) để "cày cuốc" hiệu quả:

  1. "Keep it Tidy" (Giữ cho nó gọn gàng): Đừng export tràn lan. Chỉ xuất những gì thực sự cần thiết cho các module khác sử dụng. Như bạn chỉ khoe những bức ảnh "xịn" nhất trên Instagram thôi, chứ không phải cả album ảnh chụp màn hình meme đâu.
  2. "Name it Right" (Đặt tên chuẩn chỉnh): Tên file module và tên các hàm/biến được export phải rõ ràng, dễ hiểu. Ví dụ, file userController.js nên chứa các hàm xử lý logic liên quan đến người dùng.
  3. "Think Small" (Nghĩ nhỏ thôi): Chia nhỏ ứng dụng của bạn thành các module nhỏ, tập trung vào một nhiệm vụ cụ thể. Một module chỉ nên làm một việc, và làm thật tốt (Single Responsibility Principle). Điều này giúp code dễ đọc, dễ kiểm thử và dễ bảo trì hơn rất nhiều.
  4. module.exports vs. exports:
    • module.exports là đối tượng thực sự được trả về khi require() một module. Bạn nên dùng nó khi muốn gán một giá trị (hàm, object, class...) duy nhất làm "đầu ra" của module.
    • exports là một biến tham chiếu (reference) tới module.exports. Bạn có thể dùng exports.propertyName = value; để thêm các thuộc tính vào đối tượng được xuất. Tuy nhiên, đừng bao giờ gán exports = someValue; vì nó sẽ phá vỡ tham chiếu và module của bạn sẽ không xuất ra đúng thứ bạn muốn. Cứ nhớ: module.exports là "người chủ", exports là "người giúp việc". Người giúp việc có thể thêm đồ vào nhà (thuộc tính vào object), nhưng không thể đổi chủ nhà được.

Góc nhìn Harvard (dễ hiểu tuyệt đối): "Kiến trúc sư" của hệ thống code

Từ góc độ học thuật sâu sắc, export statement (cùng với cơ chế module của Node.js) không chỉ là một cú pháp đơn thuần mà còn là nền tảng của kiến trúc phần mềm modular. Nó hiện thực hóa nguyên tắc Separation of Concerns (SoC) – Tách biệt các mối quan tâm. Tức là, mỗi phần của hệ thống chỉ nên chịu trách nhiệm về một khía cạnh cụ thể, giảm thiểu sự phụ thuộc lẫn nhau (low coupling) và tăng tính gắn kết nội bộ (high cohesion).

Điều này đặc biệt quan trọng trong các dự án lớn, nơi hàng trăm, hàng ngàn file code cần phải phối hợp nhịp nhàng. Cơ chế module cho phép các nhà phát triển làm việc độc lập trên các phần khác nhau của ứng dụng mà không gây xung đột lớn, đồng thời tạo ra một "thư viện" các thành phần có thể tái sử dụng, đẩy nhanh tốc độ phát triển và cải thiện chất lượng phần mềm. Nó giống như việc xây dựng một thành phố: mỗi đội thợ xây chuyên trách một loại công trình (nhà ở, cầu đường, công viên), và tất cả đều sử dụng chung một kho vật liệu và thiết kế quy hoạch.

Lịch sử của JavaScript trên môi trường server (Node.js) đã chứng kiến sự ra đời của CommonJS để giải quyết bài toán module hóa khi mà trình duyệt chưa có cơ chế tương tự. Mặc dù sau này ES Modules (ESM) ra đời và trở thành tiêu chuẩn chung cho cả frontend và backend, CommonJS vẫn là "trái tim" của rất nhiều dự án Node.js hiện có.

Ứng dụng thực tế: "Nhà nhà, người người" đều dùng export

Bạn có thể thấy export ở khắp mọi nơi trong các ứng dụng/website dùng Node.js:

  • Framework Express.js: Khi bạn định nghĩa các route (đường dẫn API), middleware (các hàm xử lý trước khi request đến route chính) hay controller (logic xử lý request), tất cả đều được export từ các file riêng biệt và require vào file app.js chính.
    • routes/userRoutes.js export các router cho người dùng.
    • controllers/userController.js export các hàm xử lý logic cho người dùng.
  • Các thư viện tiện ích (Utility Libraries): Nếu bạn từng dùng lodash hay các thư viện tương tự, bạn sẽ thấy chúng export ra hàng loạt các hàm hữu ích để bạn dùng.
  • Microservices: Trong kiến trúc microservices, mỗi service nhỏ có thể là một ứng dụng Node.js riêng biệt, và các module bên trong mỗi service sẽ export/require lẫn nhau để hoạt động.
  • Bất kỳ dự án Node.js lớn nào: Từ các backend của mạng xã hội (Facebook, Instagram - dù họ dùng nhiều ngôn ngữ khác nhau nhưng nguyên lý module hóa là tương tự), các nền tảng thương mại điện tử (Amazon, Shopee), đến các ứng dụng chat realtime, game server... tất cả đều dựa vào cơ chế module để tổ chức code.

Thử nghiệm và Nên dùng cho case nào?

Nên dùng export khi nào?

  • Khi bạn muốn chia sẻ một hàm, biến, class hoặc đối tượng từ một file này sang file khác.
  • Khi bạn muốn tái cấu trúc (refactor) một file code lớn thành nhiều file nhỏ hơn, dễ quản lý hơn.
  • Khi bạn muốn tạo ra các thư viện tiện ích riêng cho dự án của mình.
  • Khi bạn xây dựng API với các tầng logic (routes, controllers, services, models) rõ ràng.

Thử nghiệm ngay:

  1. Tạo một "hộp công cụ" nhỏ: Viết một file utilities.js chứa các hàm như getRandomNumber(), formatDate(), capitalizeString(). export chúng ra và thử require vào file main.js để sử dụng.
  2. Xây dựng một Class và Export: Tạo file Vehicle.js với một class Vehicle có constructor và vài method. export nó ra và trong app.js, require và tạo một vài đối tượng Vehicle.
  3. Refactor một file "khổng lồ": Nếu bạn có một file index.js nào đó dài 500 dòng, hãy thử chia nó thành 3-4 file nhỏ hơn dựa trên chức năng, sau đó dùng export/require để kết nối chúng lại. Bạn sẽ thấy codebase của mình "thở phào nhẹ nhõm" ngay!

Nhớ nhé các Gen Z, export statement không chỉ là cú pháp, nó là một "superpower" giúp bạn xây dựng những ứng dụng Node.js mạnh mẽ, gọn gàng và dễ dàng mở rộng. Hãy "flex" sức mạnh này trong mọi dự án của mình!

Thuộc Series: Nodejs

Bài giảng này được tự động xuất bản ngẫu nhiên từ thư viện kiến thức. Đừng quên đón xem các Từ khoá Hướng Dẫn tiếp theo nhé!

#tech #cyberpunk #laravel
Chỉnh sửa bài viết

Bình luận (0)

Vui lòng Đăng Nhập để Bình luận

Hỗ trợ Markdown cơ bản
Nguyễn Văn A
1 ngày trước

Tính năng này đỉnh quá ad ơi, chờ mãi mới thấy một blog Tiếng Việt có UI/UX xịn như vầy!