var express = require('express');var app = express()

var express = require('express'); var app = express(), What is express()?? is it a method or a constructor? Where does it come from

本文关键字:express var app require      更新时间:2023-09-26
var express = require('express'); 
var app = express();

这就是我们创建快速应用程序的方式。但是这个"快递()"是什么?它是方法还是构造函数?它从何而来??

它是方法还是构造函数?

两者都不是;这是一个函数,尽管如果你说"方法",我认为没有人会让你为难。

方法是附加到对象的函数。在 JavaScript 中,方法只是通过对象属性引用的函数。(更新:从 ES2015 开始,如果您使用方法语法来创建它们,它们略多于此,因为它们可以访问super

在 JavaScript 中,构造函数是通过 new 运算符调用的函数。即使其他函数可能会创建事物,我们通常也不会称它们为"构造函数"以避免混淆。有时它们可能是"创建者"或"构建者"功能。

它从何而来?

ExpressJS是一个NodeJS模块; express是模块的名称,也是我们通常为变量指定的名称,该变量用于在代码中引用其主函数,例如您引用的内容。 NodeJS 提供了require函数,其工作是加载模块并让您访问它们的导出。(您不必调用变量 express ,您可以执行var foo = require('express');并使用foo,但惯例是您将使用模块的名称,或者如果只使用模块的一部分,则使用模块文档定义的该部分的名称。

express的默认导出有点不寻常,因为它是一个函数,上面也有属性,也是函数(方法)。这在 JavaScript 中完全有效¹,但在其他一些语言中相当不寻常。这就是为什么您可以通过 express() 创建 Application 对象,但也可以使用 express.static(/*...*/) 来设置服务静态文件。

<小时 />

¹ 事实上,这是完全正常的。函数默认有几个标准方法:例如callapplytoString

你将使用

Node 的 require 函数来使用快速模块。 require类似于其他语言中的import或include等关键字。 require 将包的名称作为字符串参数并返回包。返回的对象没有什么特别之处 - 它通常是一个对象,但它可以是函数、字符串或数字。

var express = require('express'); 

=> 需要 Express 模块,就像需要其他模块一样,并将其放入变量中。

var app = express(); 

=> 调用 express 函数 "express()" 并将新的 Express 应用程序放入 app 变量中(以启动新的 Express 应用程序)。这就像您正在创建一个类的对象。其中"express()"就像类和应用程序一样,是它新创建的对象。

通过查看下面的快速代码,您可以了解内部真正发生的事情。

文件 1:索引.js

'use strict';
module.exports = require('./lib/express');

文件 2 : lib/express.js

'use strict';
var EventEmitter = require('events').EventEmitter;
var mixin = require('merge-descriptors');
var proto = require('./application');
var Route = require('./router/route');
var Router = require('./router');
var req = require('./request');
var res = require('./response');
/**
 * Expose `createApplication()`.
 */
exports = module.exports = createApplication;
function createApplication() {
  var app = function(req, res, next) {
    app.handle(req, res, next);
  };
  mixin(app, EventEmitter.prototype, false);
  mixin(app, proto, false);
  app.request = { __proto__: req, app: app };
  app.response = { __proto__: res, app: app };
  app.init();
  return app;
}
exports.application = proto;
exports.request = req;
exports.response = res;    
exports.Route = Route;
exports.Router = Router;
});

要求如何工作

当你在节点中调用require('some_module')时,会发生什么:

  1. 如果当前文件夹节点中存在名为 some_module.js 的文件,则将加载该文件,否则:

  2. Node 在当前文件夹中查找包含some_module文件夹的node_modules文件夹。

  3. 如果找不到,它将上升一个文件夹并重复步骤2

这个循环重复,直到节点到达文件系统的根文件夹,此时它将检查任何全局模块文件夹(例如Mac OS上的/usr/local/node_modules),如果仍然找不到some_module它将抛出异常。

古代帖子。我认为原始海报对为什么调用模块表达式导出的函数的语法感到困惑

var app = express() 

而不是

var app = express.express()

澄清一下:require() 函数不会创建对该"模块"的引用。没有对模块的引用。仅引用模块导出的事物。

require('xxx.js'),其中可以省略.js扩展名,返回该 xxx.js 文件导出的任何内容。如果该 xxx.js 文件导出一个对象,require('xxx.js') 返回一个对象;如果导出函数,require('xxx.js') 返回一个函数;如果导出单个字符串,require('xxx.js') 返回一个字符串...

如果你检查文件express.js的源代码,你会看到它导出了一个函数。所以在

var express = require('express')

第一个表达式被分配由模块 express 导出的任何内容,在这种情况下,它恰好是单个函数。 Express 是一个函数,而不是对模块的引用。因此,在第二行,您只需调用该函数:

var app = express()

希望这有帮助!

让我用一个例子来回答这个问题。创建 2 个 JavaScript 文件。播放1.js和快递.js

//express.js
function createApplication(){
   var app = 'app';
    return app;
  }
module.exports = createApplication;
//keep in mind that we are not doing module.exports = {createApplication}

现在导入 Express.js在 Play1.js 文件中

//play1.js
  var express = require('./express);
   var app = express();
 // this will call createApplication function as app is referencing to it.
   console.log(app); // "app"

每当导入类似模块时

const express = require('express')

express是一个模块,其中分配了函数或对象或变量。看看/lib/Express

您可以访问快速模块中的函数createApplication作为express(),因为该函数直接分配给模块,例如

导出 = 模块。导出 = 创建应用程序;

function createApplication(){
    var app = function(req, res, next) {
    app.handle(req, res, next);
  };
//other codes
}

所以你可以访问函数createApplication,只需调用express()作为函数

现在,当您签出快速库的其他部分时,您可以看到一堆附加到导出特殊对象的其他对象。

/**
 * Expose the prototypes.
 */
exports.application = proto;
exports.request = req;
exports.response = res;
/**
 * Expose constructors.
 */
exports.Route = Route;
exports.Router = Router;
 // other exports

这些指定用于导出特殊对象的对象或函数可以使用"快速"作为对象从"导入"部分访问。

表达。{名称}

express.Route
express.Router etc

最后,您只是导出一堆附加到模块的方法或对象.export Express js文件中的特殊对象

要阅读有关模块的更多信息。导出特殊对象,请转到此处

1-  var express = require('express');

第一行需要快速包.js文件,而"require"它只返回在JS文件中导出的内容(module.exports)。所以我们只有指向这个函数的指针。

2- var app = express();

在第二行中,我们使用"app"作为请求持有者来接收来自 express() 函数的输出,这是一个对象,我们可以在我们的代码中使用它(通过像任何其他类一样访问他的方法和属性)

换句话说,我们使用从"

express()"函数生成的"app"对象,它是从"express.js"文件导入的。

注 1),当然,我们可以给出任何名称而不是"app",但是当您遵循大多数开发人员用来命名此包的内容时,这是一个很好的做法,当您在团队中工作时,更容易理解您的代码专业。

注2)在ES6之后,我们使用"const"而不是"var"。

当我们需要应用程序模块时,我们在 node js 中编写的内容很简单

const modue_need1=require('module_name'); 
const modue_need2=require('module_name2'); 
const modue_need3=require('module_name3'); 
const modue_need4=require('module_name4'); 
const modue_need....=require('module_name.....');

所以对于每个模块,我们都需要写这么大的代码,而且现在要费时地减少这些冗长的代码和时间片,我们做什么?我们需要像Express js这样的节点js框架这将克服这些问题意味着"写得更少,做得更多"我们只使用这两行,关于我们应用程序的所有需求(模块)将是他们的应用程序内对象,我们可以在需要时使用它,因此不需要为每个模块调用 require。"少写多做"

const express=require('express');
const app=express();
console.log(app);