3
Các mô-đun hầu hết giống nhau trong Node.js và AMD [1] : Một chuỗi các câu lệnh gán giá trị bên trong cho các biến và xuất giá trị cho một đối tượng. Bài đăng blog này cho thấy một số mẫu để làm sau này. Nó cũng giải thích cách ECMAScript.next xử lý xuất khẩu.

Node.js so với AMD

Sự khác biệt chính giữa Node.js và AMD là cách đối tượng có bản xuất được chuyển đến hệ thống: Trong Node.js, bạn gán cho một bản xuất biến có tính toàn cầu cho mô-đun:
    exports.value1 = ...;
Trong AMD, bạn trả về một đối tượng:
    define(function () {  // no imports
        return {
            value1: ...
        };
    });

Mẫu khai báo xuất khẩu

Phần này cho thấy một số mẫu để khai báo xuất khẩu. Một số ưu và nhược điểm của họ về việc bạn có nghĩ rằng phải tham chiếu khác nhau đến các giá trị nội bộ và xuất khẩu hay không là một điều tốt hay không. Ở đây, chúng tôi giả định rằng bạn sẽ thường thay đổi suy nghĩ về những gì được xuất và bạn không thích tiếng ồn cú pháp được thêm vào khi đề cập đến một giá trị được xuất qua một đối tượng. Tuy nhiên, người ta cũng có thể lập luận rằng rất mong muốn thấy các giá trị xuất khẩu được đánh dấu ở mọi nơi. Truy cập các giá trị trong một đối tượng so với các biến cục bộ có thể tạo ra sự khác biệt về hiệu suất, nhưng bạn sẽ phải lập hồ sơ để thực sự chắc chắn. Tôi hy vọng nó hiếm khi quan trọng trong thực tế.

Mẫu: điền đối tượng theo nghĩa đen

    function funcInternal(...) { ... }
    var e = {
        otherFuncExported: ...,
        funcExported: function (...) {
            funcInternal(...);
            e.otherFuncExported(...);
        }
    };
    module.exports = e;
    // AMD: return e;
Pro và nhược điểm:
  • Pro: Cú pháp nhỏ gọn.
  • Nhược điểm: Bạn cần phải thêm tiền tố vào e .v để tham khảo các giá trị được xuất. Giá trị nội bộ và xuất khẩu là riêng biệt; bạn không thể, ví dụ, đặt các hàm trợ giúp gần với nơi chúng được sử dụng.

Mẫu: đặt thuộc tính

    var e = exports;
    // AMD: var e = {};
    
    e.otherFuncExported = ...;
    
    function funcInternal(...) { ... }
    e.funcExported = function (...) {
        funcInternal(...);
        e.otherFuncExported(...);
    };
    
    // AMD: return e;
Chuyên nghiệp và con:
  • Pro: Bạn có thể tự do trộn các giá trị nội bộ và xuất khẩu.
  • Con: Bạn cần phải thêm tiền tố vào e .v để tham khảo các giá trị được xuất khác.

Mẫu: đề cập đến xuất khẩu trong một đối tượng theo nghĩa đen

    function otherFuncExported() { ... }
    
    function funcInternal(...) { ... }
    function funcExported(...) {
        funcInternal(...);
        otherFuncExported(...);
    };

    // AMD: return {
    module.exports = {
        otherFuncExported: otherFuncExported,
        funcExported: funcExported
    }
Chuyên nghiệp và con:
  • Pro: Có thể tham khảo các giá trị xuất và nội bộ theo cùng một cách.
  • Con: Đề cập dự phòng các định danh xuất khẩu (ba lần, ở hai vị trí khác nhau!).

Mẫu: đặt các biến và thuộc tính cục bộ

    var e = exports;
    // AMD: var e = {};
    
    var otherFuncExported = e.otherFuncExported = function () { ... };
    
    function funcInternal(...) { ... }
    var funcExported = e.funcExported = function (...) {
        funcInternal(...);
        otherFuncExported(...);
    };

    // AMD: return e
Chuyên nghiệp và con:
  • Pro: Có thể tham khảo các giá trị xuất và nội bộ theo cùng một cách.
  • Con: Một số dư thừa, nhưng không tệ như trong mẫu số 3.

ECMAScript.next

Đối với các mô-đun ECMAScript.next , có hai cách khai báo xuất. Cách tiếp cận 1: Tiền tố một tờ khai với xuất khẩu.
    export function otherFuncExported() { ... }
    
    function funcInternal(...) { ... }
    export function funcExported(...) {
        funcInternal(...);
        otherFuncExported(...);
    };
Cách tiếp cận 2: Tham khảo các giá trị xuất khẩu.
    function otherFuncExported() { ... }
    
    function funcInternal(...) { ... }
    function funcExported(...) {
        funcInternal(...);
        otherFuncExported(...);
    };

    export otherFuncExported, funcExported;
Sẽ thật tuyệt nếu người ta có thể mô phỏng cách tiếp cận sau trong các hệ thống mô-đun hiện tại, nhưng không có cách nào để truy cập vào các mục của môi trường trong JavaScript. Điều đó sẽ cho phép một người thực hiện các thao tác sau (sử dụng hàm pick () của Underscore để nhân bản một đối tượng, nhưng chỉ sao chép các thuộc tính có tên được đề cập):
    module.exports = _.pick(environmentToObject(),
        "otherFuncExported", "funcExported"
    );
ECMAScript.next cũng có một lối tắt cho các ký tự đối tượng sẽ hữu ích cho các mô-đun hiện tại:
    module.exports = { otherFuncExported, funcExported };
Đó là cú pháp đường cho:
    module.exports = {
        otherFuncExported: otherFuncExported,
        funcExported: funcExported
    };

Phần kết luận

Tôi thấy khó có thể cam kết với bất kỳ một trong các mẫu được hiển thị, vì mỗi mẫu đều có ưu điểm và nhược điểm. Yêu thích hiện tại của tôi là mẫu # 4. Bạn có sử dụng bất kỳ mẫu nào được mô tả ở đây (mẫu nào không?) Hoặc mẫu khác? Hãy cho chúng tôi biết trong các ý kiến ​​...

Tài liệu tham khảo

  1. Thu hẹp khoảng cách mô-đun giữa Node.js và trình duyệt
|