Node.js需要不将其存储到变量中

too*_*ool 13 javascript require node.js selenium-chromedriver

我有以下代码片段,它在其上下文中工作.

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

我不明白的是这条线:

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.
Run Code Online (Sandbox Code Playgroud)

所以它做了一些事情.

我明白了什么var chromedriver = require('chromedriver');,我到目前为止只看到过使用这种方式的require函数.

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

它为什么有效?

所需的chromedriver最终在哪里?

如果require()函数没有将其返回保存到变量中,那么在genereal中会发生什么?

Har*_*san 16

基本的require做法是它执行模块中编写的代码.最后,这个执行的代码可能会或可能不会返回一些东西.在您的情况下,此代码返回的内容无关紧要,重要的是此代码至少执行一次.

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

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


Pau*_*aul 11

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

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

在.js文件中,然后require在节点程序中的该文件中,您将获得100行添加到您的控制台,没有其他任何事情发生.


Joh*_*kel 6

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

例如,在 helper.js

global.timeout = 5000;

global.sayHello = function(e) {
    console.log('Hello',e);
}
Run Code Online (Sandbox Code Playgroud)

并在 main.js

require('./helper.js');

sayHello('fish');
Run Code Online (Sandbox Code Playgroud)

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