javascript-Node.js模块范例的基础?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript-Node.js模块范例的基础?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4791字,纯文字阅读大概需要7分钟。
内容图文
我正在努力地真正掌握一些基本知识,而且我认为这不仅使我受挫,而且导致编写糟糕的代码,我不喜欢这样.
我了解将功能代码块分解为单独的模块(例如路由,数据库模型等)的概念,但是我很难理解如何正确地协调所有这些单独模块的相互依存功能.
让我举一个例子说明我的斗争所在.
例子1
我的ExpressJS’app’已在我的主程序模块中设置,就像您在每个教程中看到的一样.但是,我还需要访问其他模块中的应用程序实例.我怎么做?我从各种教程中学到的一种方法是,使整个模块导出一个将应用程序作为参数的函数,然后在该函数中执行我需要的操作.但这对我来说似乎增加了很多复杂性.现在,我不仅将整个模块封装在一个函数中,而且似乎无法从该模块中实际导出多个函数,对象或其他变量.
模块功能
module.exports = function(app) {
blah;
};
没有功能的模块
exports.func1 = function() {
}
exports.func2 = function() {
}
后者为我提供了更大的灵活性,但是我似乎经常不得不使用前者,因为我需要从其他地方传递诸如应用程序之类的东西.
例子2
我正在为我的REST API使用connect-rest.我API的所有代码都存放在一个单独的模块中,简称为“ api”.直到最近还不错.现在,我需要从我的路由模块内部访问api模块中的函数.目前,我的主要路由是在api之前定义的,因此我无法将api导出完全传递到route函数中.我可能会扭转它们,但这只是掩盖了更大的问题.
简而言之,这个问题是相互依存度不断提高的问题之一
随着我的代码库的增长,我发现各种模块之间需要相互协作的频率越来越高-保持它们完全同步是不可行的.有时可能,但是不干净.
我感觉好像缺少一些用于管理所有这些的基本Node.JS(或仅仅是Javascript)范例.
如果有人可以帮助我理解我,我将非常感激.如果我有其他帮助的话,我是其他语言(例如C和Python)的资深开发人员.
试图总结问题
我觉得我没有充分传达我的发帖意图,所以让我尝试总结一下我的问题和正在解决的问题.
server.js
var http = require('http'),
express = require('express'),
app = express();
// Bunch of stuff done with app to get it set up
var routes = require('routes.js')(app);
app.js
module.exports = function(app, express) {
var router = express.router();
// code for routes
app.use('/', router);
}
在上面的示例中,路由被分成了自己的模块,但是该模块需要app和来自server.js的对象才能运行.因此,以我目前的理解,将这些添加到route.js的唯一方法是使route.js导出一个大函数,然后使用所需的两个对象进行调用.
但是,如果我想让route.js导出可能在其他地方使用的多个函数呢?据我了解,我现在不能.如果我想做什么:
authentication.js
var routes = require('routes');
// setup auth
routes.doSomethingFunction(auth);
我不能这样做,因为路由仅导出该一个宏功能.
解决方法:
每个节点模块只是一个对象.该对象可用于外部的部分是module.exports对象,其中包含可以是函数或数据的属性.
require(“ xxx”)命令为您获取该模块的导出对象(从中央缓存或尚未加载的.js文件中加载).
因此,代码共享很简单.只需让每个模块在要共享代码的任何其他模块上执行require(),并确保那些模块可以通过其自己的导出对象访问共享函数.这使每个模块实际上都可以独立.它加载所需的任何其他代码,并使重用代码变得容易得多.模块是高速缓存的,因此从许多其他模块对同一模块执行大量的require()操作无非是缓存查找,因此无需担心.
数据共享(例如您的应用程序对象)可以通过几种不同的方式来完成.最常见的方法是在加载模块时仅调用该模块的某种初始化函数,然后将可能需要的任何数据传递给该函数.那就是推模型.或者,您也可以执行拉模型,其中一个模块向另一个模块询问某些数据.
正确的代码组织可以使所有这些工作变得容易得多.如果您开始觉得自己有意大利面条或相互依存关系,则可能是因为您没有正确的代码组织,或者只是对使用require()提取给定模块需要的所有内容有点sh.请记住,每个模块都会加载所需的内容,因此您只需要担心需要的内容.加载这些模块,它们将加载所需的模块.
您可能还想在对象方面进行更多思考,以便将大多数属性放在某种对象上,而不是大量散布的,单独共享的变量.然后,您可以共享一个对象,并且该对象将自动使该变量的所有属性可供共享对象使用.
关于与另一个模块共享应用程序对象的问题,可以这样进行:
// in your app module
var express = require('express');
var app = express();
var otherModule = require('otherModule');
otherModule.setApp(app);
// now otherModule has the singleton `app` object that it can use
// in this case, otherModule must be initialized this way before it can do its job
在此示例中,我仅使用一个方法.setApp()设置应用程序对象.这意味着所有其他方法都可用于对该模块的其他访问.
这也可以用类似构造函数的方法完成:
// in your app module
var express = require('express');
var app = express();
var otherModule = require('otherModule')(app);
这也是可行的,因为如果需要,构造函数随后可以返回带有其他方法的对象.如果您希望能够从其他模块中访问otherModule,但显然只希望一次初始化它而不在其他地方初始化它,则可以执行以下操作:
var otherModule = require('otherModule')();
从其他模块中获取并让构造函数检查是否没有任何内容传递给它,则它不是从此构造函数调用中获取应用程序对象,因此应仅使用其他方法返回一个对象.或者,您可以使用上面的第一个代码块,该代码块返回初始的require()中的所有方法.您完全可以决定从require()返回什么.它可以只是一个类似于构造函数的函数,然后在调用该函数时返回另一个对象.它可以只是一个具有方法的对象,或者(因为函数是也可以具有属性的对象),您甚至可以返回一个类似ALSO所具有方法的构造函数(尽管这不是标准方法)事情).
并且,您的构造函数可以根据传递给它的内容来决定要做什么,并根据传递给它的内容赋予它许多不同的行为.
内容总结
以上是互联网集市为您收集整理的javascript-Node.js模块范例的基础?全部内容,希望文章能够帮你解决javascript-Node.js模块范例的基础?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。