Node.js   发布时间:2022-04-24  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了node.js – 大型nodejs项目的结构 – 如何处理相互依赖性大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_944_1@
我有一个相当快的nodejs项目.由于我对模块的理解有限,并且要求我确信我可以做一些事情来清理代码和结构.

<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

我的app.js非常混乱,因为我的文件之间存在依赖关系. IE我想将我的模型和身份验证传递给我的路由,实用程序可以被一堆东西使用.

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

我现在知道我可以在每个文件夹中放置一个index.js来清理,但这仍然让我不得不保存像实用程序这样的东西并将其传递给其他需要的调用.

我可以将每个需求放在较低的模块中,仅在需要的地方,但最后我最终攀登目录结构,我的需求似乎也很混乱,即:

@H_75_5@model1.js:
var utility1 = require(‘../ utilities / utility1.js’);

基本上我认为我的问题是较低级别文件夹中的模块依赖于其他文件夹中的其他模块.我觉得我应该在app.js中引入所有依赖项并将它们传递给需要它们的require模块.

任何建议.我一直试图重新构建这几天,我只是不停地撞到墙上,因为我所做的一切都没有让它变得更好.

Best是一个很好的节点项目布局,它使用像mongoose,express,w / custom模块这样的东西.并显示处理模块之间相互依赖关系的好方法.

解决方法

编辑: https://github.com/gagle/node-getmod

我也很难正确构建我的第一个真实和BIG node.js项目.您遇到的最大问题是require()调用中使用的相对路径.这是一个痛苦,因为这些路径是相对于当前文件的,所以你要有这样的路径:

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

所有这些都指向同一个文件.这是不人道的.难以阅读,难以维护.

您不应将模块放在Node_modules目录中,只需要按名称(require(“a”))要求模块,因为此目录由第三方模块使用.如果您需要执行维护任务,例如执行所有模块的完全升级,删除它们并@R_383_10696@它们等,那么它们极其简单且安全.如果你把你的模块放在那里,如果你没有一份好的文档并且你在一个中等大的团队中工作,你就会遇到很大的问题.

几个小时后,我用这种技术结束了:

NodeJS local modules for complex application structures

使用mod()函数,您可以很好地控制模块.在我的真实和BIG项目中,我的mod函数如下:

"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);
};

如果我@L_51_7@mod(“api”)它会返回我的api模块,这是我网站的核心.

如果我@L_51_7@mod(“common / db”),它将返回db包装器.

如果我@L_51_7@mod(“build / …”),它将返回构建静态资产所需的模块(编译css和js)

等等

现在,您误解了必须如何使用模块.例:

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

在这里,您将实用程序模块传递给另一个模块,这是不需要的.您可以从model1和model2模块中获取实用程序模块.

很基本的例子:

A取决于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);
  }
};

你不需要这样做:

//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);
  }
};

这是你想要的?

大佬总结

以上是大佬教程为你收集整理的node.js – 大型nodejs项目的结构 – 如何处理相互依赖性全部内容,希望文章能够帮你解决node.js – 大型nodejs项目的结构 – 如何处理相互依赖性所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。