Solución:
¿Es un método o un constructor?
Ninguno; es un función, aunque si dijeras “método” no creo que nadie te lo haga pasar mal.
A método es una función adjunta a un objeto. En JavaScript, los métodos son solo principalmente funciones a las que hace referencia a través de propiedades de objeto. (Actualización: a partir de ES2015, si utiliza la sintaxis del método para crearlos, levemente más que eso porque tienen acceso a super
.)
A constructor, en JavaScript, es una función que se llama a través del new
operador. Aunque otras funciones pueden crear cosas, normalmente no las llamamos “constructores” para evitar confusiones. A veces pueden ser funciones de “creador” o “constructor”.
¿De dónde viene?
ExpressJS es un módulo NodeJS; express
es el nombre del módulo y también el nombre que normalmente le damos a la variable que usamos para referirnos a su función principal en el código, como lo que citó. NodeJS proporciona el require
función, cuyo trabajo es cargar módulos y darle acceso a sus exportaciones. (Tu no tengo llamar a la variable express
, tu puedes hacer var foo = require('express');
y use foo
en su lugar, pero la convención es que usaría el nombre del módulo, o si solo usa una parte de un módulo, usar el nombre de esa parte como se define en la documentación del módulo).
Utilizará la función require de Node para usar el módulo express. require es similar a palabras clave como importar o incluir en otros idiomas. require toma el nombre de un paquete como argumento de cadena y devuelve un paquete. No hay nada especial en el objeto que se devuelve; a menudo es un objeto, pero podría ser una función, una cadena o un número.
var express = require('express');
=> Requiere el módulo Express al igual que necesita otros módulos y lo coloca en una variable.
var app = express();
=> Llama a la función express “express ()” y coloca una nueva aplicación Express dentro de la variable de la aplicación (para iniciar una nueva aplicación Express). Es como si estuvieras creando un objeto de una clase. Donde “express ()” es como clase y aplicación es su objeto recién creado.
Al mirar el código de expreso a continuación, está listo para ver lo que realmente está sucediendo dentro.
Archivo 1: index.js
'use strict';
module.exports = require('./lib/express');
Archivo 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;
});
¿Cómo funciona require?
Cuando llama a require (‘some_module’) en el nodo, esto es lo que sucede:
-
si existe un archivo llamado some_module.js en la carpeta actual, el nodo lo cargará, de lo contrario:
-
El nodo busca en la carpeta actual una carpeta node_modules con una carpeta some_module en ella.
-
Si no lo encuentra, subirá una carpeta y repetirá el paso 2
Este ciclo se repite hasta que el nodo llega a la carpeta raíz del sistema de archivos, momento en el que verificará las carpetas del módulo global (por ejemplo, / usr / local / node_modules en Mac OS) y si aún no encuentra algún_módulo, lanzará una excepción. .
Puesto antiguo. Creo que el póster original estaba confundido acerca de por qué la sintaxis para llamar a la función exportada por module express es
var app = express()
en lugar de
var app = express.express()
Para aclarar: la función require () no crea una referencia a ese ‘módulo’. No existe la referencia a un módulo. Solo hay una referencia a las cosas exportadas por un módulo.
require (‘xxx.js’), donde se puede omitir la extensión .js, devuelve lo que sea exportado por ese archivo xxx.js. Si ese archivo xxx.js exporta un objeto, require (‘xxx.js’) devuelve un objeto; si se exporta una función, require (‘xxx.js’) devuelve una función; si se exporta una sola cadena, require (‘xxx.js’) devuelve una cadena …
Si comprueba el código fuente del archivo express.js, verá que exporta una única función. Entonces en
var express = require('express')
Al primer expreso se le asigna lo que sea exportado por el módulo expreso, que en este caso pasa a ser una sola función. express es una función, no una referencia a un módulo. Por lo tanto, en la segunda fila, simplemente invoca esa función:
var app = express()
¡Espero que esto ayude!