Node.js require 而不将其存储到变量中

Node.js require without storing it into a variable

我有以下代码片段,它在其上下文中有效。

"use strict"; 
require('chromedriver');
var selenium = require('selenium-webdriver');
var driver = new selenium.Builder()
  .forBrowser('chrome')
  .build();

我不明白的是:

require('chromedriver');

如果我删除它,我会得到一个错误:

Error: The ChromeDriver could not be found on the current PATH. Please download the latest version of the ChromeDriver from http://chromedriver.storage.googleapis.com/index.html and ensure it can be found on your PATH.

所以它做了一些事情。

我明白 var chromedriver = require('chromedriver'); 的作用,到目前为止我只看到 require 函数是这样使用的。

所以我关于这条线的问题:require('chromedriver');

为什么有效?

所需的 chromedriver 在哪里结束?

如果 require() 函数没有将其 return 保存到变量中,通常会发生什么情况?

调用模块上的 require 实际上会执行模块中的任何代码。在大多数情况下,模块导出一个或多个函数或一个对象,您希望将其存储在变量中。但是如果你要写这样的东西:

for (var i = 0;i < 100; i++){
   console.log("I've been called %d times", i);
}

在 .js 文件中,然后 require 在节点程序中的那个文件,你会在你的控制台中添加 100 行,没有其他任何事情发生。

require 做的基本事情是执行模块中编写的代码。最后,这个执行的代码可能会或可能不会 return 东西。在您的情况下,这段代码 returns 并不重要,重要的是这段代码至少执行一次。

同样重要的是要注意require的结果被缓存了。这意味着即使您多次需要该模块,"code" 也只会执行一次。

整个模块和需求的范例来自 CommonJS 模式,我建议您阅读它。

该模块可能不会导出任何内容,但它可能会将一些内容分配给 global

例如,在helper.js

global.timeout = 5000;

global.sayHello = function(e) {
    console.log('Hello',e);
}

并在 main.js

require('./helper.js');

sayHello('fish');

有些人可能不喜欢它,因为您会污染全局命名空间。但对于小型应用程序,您可以摆脱它。