sre*_*enu 23 javascript node.js express
var express = require('express');
var app = express();
Run Code Online (Sandbox Code Playgroud)
这就是我们创建快速应用程序的方式.但这是什么'快递()'?它是方法还是构造函数?它从何而来??
T.J*_*der 30
它是方法还是构造函数?
无论; 这是一个功能,虽然如果你说"方法",我认为没有人会给你一个艰难的时间.
甲方法是附加到一个对象的功能.在JavaScript中,方法是只需大多是你通过对象属性引用功能.(更新:从ES2015开始,如果您使用方法语法创建它们,它们会比那些稍微多一点,因为它们可以访问super.)
JavaScript中的构造函数是您通过new运算符调用的函数.尽管其他函数可能会创建东西,但我们通常不会将它们称为"构造函数"以避免混淆.有时它们可能是"创造者"或"建设者"的功能.
它从何而来?
ExpressJS是一个NodeJS模块 ; express是模块的名称,也是我们通常给变量的名称,我们用它来引用代码中的主函数,例如你引用的内容.NodeJS提供了该require功能,其功能是加载模块并允许您访问其导出.(你不会有打电话给变量express,你可以做var foo = require('express');,并使用foo替代,但惯例是,你使用模块的名称,或者如果只使用一个模块的一部分,使用由定义那部分的名称该模块的文档.)
Raj*_*tam 15
您将使用Node的require函数来使用express模块.require类似于import等关键字或包含在其他语言中.require将包的名称作为字符串参数并返回包.返回的对象并没有什么特别之处 - 它通常是一个对象,但它可以是一个函数,一个字符串或一个数字.
var express = require('express');
Run Code Online (Sandbox Code Playgroud)
=>需要Express模块,就像您需要其他模块一样,并将其放入变量中.
var app = express();
Run Code Online (Sandbox Code Playgroud)
=>调用express函数"express()"并将新的Express应用程序放入app变量中(以启动一个新的Express应用程序).这就像你正在创建一个类的对象.其中"express()"就像类,app是新创建的对象.
通过查看下面的快递代码,您可以很好地了解内部真实情况.
文件1:index.js
'use strict';
module.exports = require('./lib/express');
Run Code Online (Sandbox Code Playgroud)
文件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;
});
Run Code Online (Sandbox Code Playgroud)
如何工作
当您在节点中调用require('some_module')时,会发生以下情况:
如果当前文件夹节点中存在名为some_module.js的文件将加载该文件,否则:
Node在当前文件夹中查找node_modules文件夹,其中包含some_module文件夹.
如果找不到,它将上升到一个文件夹并重复步骤2
这个循环重复,直到节点到达文件系统的根文件夹,然后它将检查任何全局模块文件夹(例如Mac OS上的/ usr/local/node_modules),如果它仍然没有找到some_module,它将抛出异常.
小智 13
古帖。我认为原始海报对为什么调用模块 express 导出的函数的语法是
var app = express()
Run Code Online (Sandbox Code Playgroud)
代替
var app = express.express()
Run Code Online (Sandbox Code Playgroud)
澄清一下:require() 函数不会创建对该“模块”的引用。没有引用模块这样的东西。只有对模块导出的事物的引用。
require('xxx.js'),其中 .js 扩展名可以省略,返回该 xxx.js 文件导出的任何内容。如果 xxx.js 文件导出一个对象,则 require('xxx.js') 返回一个对象;如果一个函数被导出,require('xxx.js') 返回一个函数;如果导出单个字符串,则 require('xxx.js') 返回一个字符串...
如果您检查文件 express.js 的源代码,您将看到它导出单个函数。所以在
var express = require('express')
Run Code Online (Sandbox Code Playgroud)
第一个 express 被分配了模块 express 导出的任何内容,在这种情况下恰好是单个函数。express 是一个函数,而不是对模块的引用。因此,在第二行,您只需调用该函数:
var app = express()
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
21826 次 |
| 最近记录: |