Javascript Node.js代码是如何编写的;“流动”;

Javascript Node.js代码是如何编写的;“流动”;,javascript,Javascript,我想了解HAP-Node.js是如何工作的,但我无法理解Node.js代码。我对Node.js非常陌生,但对编程并不陌生 在下面的示例中(这是HAP NodeJS项目,可以在GitHub上找到),我无法理解执行是如何开始的。我认为顶部的require函数只返回模块中导出的对象,而require()模块中的任何内容都不会执行。然后我还看到index.js文件也没有实际执行的内容。它似乎只定义了从某个神秘调用方调用的对象和init函数 作为比较,在C或Java程序中,有一个入口点函数Main(),可

我想了解HAP-Node.js是如何工作的,但我无法理解Node.js代码。我对Node.js非常陌生,但对编程并不陌生

在下面的示例中(这是HAP NodeJS项目,可以在GitHub上找到),我无法理解执行是如何开始的。我认为顶部的require函数只返回模块中导出的对象,而require()模块中的任何内容都不会执行。然后我还看到index.js文件也没有实际执行的内容。它似乎只定义了从某个神秘调用方调用的对象和init函数

作为比较,在C或Java程序中,有一个入口点函数Main(),可以调用它来启动一切。这个Node.js项目中的“流”是如何工作的?我可以寻找什么来了解这一点?是否存在某种Node.js预处理器,您可以将所有代码放入其中,以将其视为一个整体

请不要把这个问题记下来,建议我把它发布在GitHub上,因为我真的认为我在问一个Node.js一般性问题

var Accessory = require('./lib/Accessory.js').Accessory;
var Bridge = require('./lib/Bridge.js').Bridge;
var Camera = require('./lib/Camera.js').Camera;
var Service = require('./lib/Service.js').Service;
var Characteristic = require('./lib/Characteristic.js').Characteristic;
var uuid = require('./lib/util/uuid');
var AccessoryLoader = require('./lib/AccessoryLoader.js');
var StreamController = require('./lib/StreamController.js').StreamController;
var storage = require('node-persist');

// ensure Characteristic subclasses are defined
var HomeKitTypes = require('./lib/gen/HomeKitTypes');

module.exports = {
  init: init,
  Accessory: Accessory,
  Bridge: Bridge,
  Camera: Camera,
  Service: Service,
  Characteristic: Characteristic,
  uuid: uuid,
  AccessoryLoader: AccessoryLoader,
  StreamController: StreamController
}

function init(storagePath) {
  // initialize our underlying storage system, passing on the directory if needed
  if (typeof storagePath !== 'undefined')
    storage.initSync({ dir: storagePath });
  else
    storage.initSync(); // use whatever is default
}

在Node.js中,与所有JavaScript一样,流始终是自上而下的。没有
main()
或其他语言中的类似语言

特别是对于Node.js,要运行的第一个文件是您直接运行的文件(通常按惯例命名为
index.js,但不是必需的)

由于
节点
将自动运行一个
index.js
文件,如果您给它一个文件夹名,您也可以这样做:

node myApp
const setup = require('./setup.js'); // the file you have

setup.init(); // kick things off
它将运行
myApp/index.js

当我启动它时,该文件将被读取并自上而下运行。当我点击像
require
这样的内容时,它也会暂停从上到下读取这些文件

大多数请求将导出一个或多个对象,因此它们不会立即“执行”任何操作

但并非全部。我可以很容易地有一个只运行代码的require(这是polyfills这样的代码的常见情况,它在包含时覆盖全局对象)

在上面的特定示例中,该文件本身不做任何事情是正确的。该文件本身也只是导出某些内容(使用
module.exports

这意味着直接使用
节点运行该文件实际上不会做任何事情。取而代之的是,可能还有其他一些文件正在拉入该文件并调用
init()
函数来启动它。可能是这样的:

node myApp
const setup = require('./setup.js'); // the file you have

setup.init(); // kick things off
然后,如果我将该文件命名为
index.js
,我可以用以下内容开始整个过程:

node index.js

但是require()模块中没有任何内容被执行
不正确,模块被执行,否则将无法知道模块导出了什么<代码>然后我还看到index.js文件也没有实际执行的内容。它似乎只定义了一个对象和从某个神秘调用方调用的init函数。
我假设这与您用来启动服务器的命令有关。这种设置并不典型。有东西在调用
init
,它不是节点内置的东西。我没有做下一票。谢谢你的回答!如果需要()一个模块,在module.exports={}之后只有一个console.log();在某个地方,这真的会执行吗?我想我是问它是否编译/运行整个模块,然后将导出返回给调用函数。或者它只是“编译”(我知道这是一种JIT VM类型的东西)它并返回导出?它基本上是在执行完文件后“返回”模块。您有时会在顶部附近看到
模块。导出
,然后他们会对其进行修改。它基本上是在运行完可用代码后返回的。