Node.js代码如何“流动”

时间:2018-01-23 20:51:48

标签: javascript

我想了解HAP-Node.js的工作原理,但我无法遵循Node.js代码。我对Node.js很新,但不是编程新手。

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

作为比较,在C或Java程序中,有一个入口点函数Main()被调用以启动所有内容。 “flow”如何在这个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
}

1 个答案:

答案 0 :(得分:1)

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

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

node index.js

如果您为node提供文件夹名称,index.js会自动运行node myApp 文件,您也可以这样做:

myApp/index.js

将运行require

当我启动它时,该文件将被读取并从上到下运行。当我点击module.exports之类的内容时,它会暂停从上到下阅读这些文件。

大多数要求会导出一个或多个对象,因此他们不会做出这样的事情。什么都行。

但不是全部。我可以轻松地拥有一个只运行代码的需求(这是代码的常见问题,如polyfills,它会在包含时覆盖全局对象)。

在上面的特定示例中,您确定该文件没有对其执行任何操作。该文件本身也只是导出一些东西(node)。

这意味着直接使用init()运行该文件并不会做任何事情。相反,可能有一些其他文件正在拉入该文件并调用const setup = require('./setup.js'); // the file you have setup.init(); // kick things off 函数来启动。可能是这样的:

index.js

然后,如果我将该文件命名为node index.js ,我可以用以下方式解决所有问题:

  $(window).resize(function () {
            top1 = $('#home').offset().top;
            top2 = $('#profile').offset().top;
            top3 = $('#portfolio').offset().top;
            top4 = $('#contact').offset().top;
        });