2013-06-22 64 views
7

Tôi có một dự án nodejs đang nhận được khá lớn khá nhanh. Do sự hiểu biết hạn chế của tôi về các mô-đun và yêu cầu tôi chắc chắn rằng tôi có thể làm một số việc để làm sạch mã và cấu trúc.Cấu trúc của dự án nodejs lớn - Cách xử lý các phụ thuộc lẫn nhau

<app dir> 
    -app.js 
    - <modules> 
    -module1.js 
    -module2.js 
    - <routes> 
    -route1.js 
    -route2.js 
    - <utilties> 
    -utility1.js 
    -utility2.js 
    - <authentication> 
    -local.js 
    -basic.js 
    -index.js 

Ứng dụng của tôi khá lộn xộn vì tôi có sự phụ thuộc giữa các tệp của mình. IE Tôi muốn truyền các mô hình và xác thực của mình đến các tuyến đường của mình, các tiện ích có thể được sử dụng bởi một loạt các thứ.

var app = express(); 
... // do express setup 

var authenticationStrategy = // get auth strategy from config 
var auth = require('./auth)(authenticationStrategy); 

var utility1 = require('./utilities/utility1.js'); 
var utility2 = require('./utilities/utility2.js'); 
var utilities = { 
    utility1: utility1, 
    utility2: utility2 
} 

var Model1 = require('./models/model1')(utilities); 
var Model2 = require('./models/model2')(utility1); 
var models = { 
    Model1: Model1, 
    Model2: Model2 
} 

// Dynamically import all routes 
fs.readdirSync('routes').forEach(function(file) { 
    if (file[0] == '.') return; 
    var route = file.substr(0, file.indexOf('.')); 
    require('./routes/' + route)(app, models, utilities); 
}); 

... 

etc 

bây giờ tôi biết rằng tôi có thể đặt một index.js trong mỗi thư mục để làm sạch mọi thứ lên nhưng vẫn để lại trong tôi với việc phải tiết kiệm tắt những thứ như các tiện ích và thông qua đó vào khác đòi hỏi các cuộc gọi.

tôi có thể đưa từng yêu cầu trong module thấp chỉ nơi cần thiết của nó nhưng sau đó tôi kết thúc leo cấu trúc thư mục với tôi yêu cầu mà cũng có vẻ lộn xộn, ví dụ:

model1.js: var utility1 = require (' ../utilities/utility1.js ');

Về cơ bản, tôi nghĩ rằng sự cố của tôi là các mô-đun trong thư mục cấp thấp hơn phụ thuộc vào các mô-đun khác trong các thư mục khác. Với tôi cảm thấy như tôi nên kéo tất cả các phụ thuộc trong app.js và chuyển chúng vào các mô-đun yêu cầu cần chúng.

Bất kỳ lời khuyên nào. Tôi đã cố gắng để tái cơ cấu này trong một vài ngày và tôi chỉ giữ đập đầu của tôi chống lại bức tường như không có gì tôi làm là thực sự làm cho nó bất kỳ tốt hơn.

Tốt nhất sẽ là bố cục nút dự án tốt sử dụng những thứ như mongoose, express, w/mô-đun tùy chỉnh. và hiển thị một cách tốt để xử lý các phụ thuộc lẫn nhau giữa các mô-đun.

Trả lời

2

Edit: https://github.com/gagle/node-getmod

Tôi cũng đã đau đầu để cấu trúc đúng dự án thực tế và Node.js BIG đầu tiên của tôi. Vấn đề lớn nhất bạn có là đường dẫn tương đối được sử dụng trong các cuộc gọi require(). Đó là một nỗi đau vì những đường dẫn này liên quan đến tệp hiện tại, do đó bạn có các đường dẫn như sau:

../../../a.js 
./a/b/c/a.js 
../../a/b/c/a.js 

Tất cả chúng đều trỏ đến cùng một tệp. Đây là vô nhân đạo. Khó đọc, khó duy trì.

Bạn không nên đặt mô-đun của mình bên trong thư mục node_modules và chỉ cần yêu cầu mô-đun theo tên của nó (require("a")) vì thư mục này được các mô-đun bên thứ ba sử dụng. Nếu bạn cần thực hiện các tác vụ bảo trì, như thực hiện nâng cấp đầy đủ tất cả các mô-đun, xóa chúng và cài đặt lại chúng, v.v. chúng cực kỳ dễ dàng và an toàn để thực hiện. Nếu bạn đặt các mô-đun của bạn ở đó, bạn sẽ gặp phải một vấn đề lớn nếu bạn không có tài liệu hay và bạn làm việc trong một nhóm lớn.

Sau một vài giờ tôi đã kết thúc với kỹ thuật này:

NodeJS local modules for complex application structures

Với mod() chức năng bạn có một kiểm soát tốt hơn các module của bạn. Trong dự án thực tế và BIG tôi chức năng mod của tôi là như sau:

"use strict"; 

var serverType = require ("./server-type"); 

global.mod = function (file){ 
    var dir = file.substring (0, file.search (/\/|\\/)); 
    if (!dir) dir = file; 
    if (dir === "browser" || dir === "common" || dir === "mobile" || 
      dir === "stream"){ 
     //Relative from the web directory 
     return require ("../" + file); 
    } 
    if (dir === "api"){ 
     //Relative from the api directory 
     return require ("../../" + (file === "api" || file === "api/latest" 
       ? file 
       : "api/" + APP.versions.api + "/" + file.substring (4))); 
    } 
    if (dir === "build"){ 
     //Relative from the build directory 
     return require ("../../" + file); 
    } 
    //Tries to load the module inside browser or mobile directories depending on 
    //the cwd 
    return require ("../" + serverType() + "/" + file); 
}; 

Nếu tôi gọi điện để mod("api") nó sẽ trả về mô-đun api của tôi, cốt lõi của trang web của tôi.

Nếu tôi gọi tới mod("common/db"), nó trả về trình bao bọc db.

Nếu tôi gọi điện để mod("build/...") nó sẽ trả về các module cần thiết để xây dựng tài sản tĩnh (biên dịch css và js)

vv


Bây giờ, bạn hiểu lầm như thế nào các module phải được sử dụng. Ví dụ:

var utility1 = require('./utilities/utility1.js'); 
var utility2 = require('./utilities/utility2.js'); 
var utilities = { 
    utility1: utility1, 
    utility2: utility2 
} 

var Model1 = require('./models/model1')(utilities); 
var Model2 = require('./models/model2')(utility1); 
var models = { 
    Model1: Model1, 
    Model2: Model2 
} 

Ở đây bạn đang chuyển mô-đun tiện ích đến mô-đun khác và điều này là không cần thiết. Bạn có thể lấy module tiện ích từ bên trong mô-đun model1 và model2.

dụ Rất cơ bản:

Một phụ thuộc vào B

//app.js 
require ("./a").a(); 

//a.js 
var b = require ("./b"); 
module.exports = { 
    a: function(){ 
    b.b ("I'm A"); 
    } 
}; 

//b.js 
module.exports = { 
    b: function (msg){ 
    console.log ("B says: " + msg); 
    } 
}; 

Bạn không cần phải làm điều này:

//app.js 
var b = require ("./b"); 
require ("./a").a (b); 

//a.js 
module.exports = { 
    a: function (b){ 
    b.b ("I'm A"); 
    } 
}; 

//b.js 
module.exports = { 
    b: function (msg){ 
    console.log ("B says: " + msg); 
    } 
}; 

Đây có phải là những gì bạn đang tìm kiếm?

+0

Nó giúp trong thực tế là không có 'hoàn hảo' hoặc xây dựng trong dung dịch. Về cơ bản, tôi bị mắc kẹt với yêu cầu ('../../ utilities/util1.js') trong các mô-đun chứa trong các thư mục. Hoặc là hoặc sử dụng một chức năng tùy chỉnh để ẩn mà bạn phải sử dụng đường dẫn tương đối. – lostintranslation

1

1- tạo ra một tập tin trong thư mục gốc dự án gọi nó settings.js

2- bên trong tập tin này thêm mã này

module.exports = { 
    POST_MAX_SIZE : 40 , //MB 
    UPLOAD_MAX_FILE_SIZE: 40, //MB 
    PROJECT_DIR : __dirname 
}; 

3- bên node_modules tạo một tên mô-đun mới nó " cài đặt "và bên trong mô-đun index.js viết mã này:

module.exports = require("../../settings"); 

4- và bất kỳ lúc nào bạn muốn thư mục dự án chỉ sử dụng

var settings = require("settings"); 
settings.PROJECT_DIR; 

theo cách này bạn sẽ có tất cả các thư mục dự án liên quan đến tập tin này;)

Các vấn đề liên quan