如何正确地在同一目录中要求JS文件?

时间:2018-01-25 02:02:45

标签: javascript node.js require

我无法理解require()在JS中的工作原理。

以下是我遇到的问题:

我的文件夹结构如下所示:

test

  ->test

    ->a.js

    ->b.js

    ->c.js

以下是我在每个文件中的代码:

c.js

function c() {
  console.log("c")
}

module.exports = c;

b.js

let c = require("./c");

function b() {
  c();
  console.log("b");
}

exports.b = b;

a.js

let b = require("./test/b")

当我在a.js中执行代码时,它运行正常。

但是当我执行b.js中的代码时,它会抛出一个错误:

module.js:472
    throw err;
    ^

Error: Cannot find module './c'
    at Function.Module._resolveFilename (module.js:470:15)
    at Function.Module._load (module.js:418:25)
    at Module.require (module.js:498:17)
    at require (internal/module.js:20:19)
    at [stdin]:3:9
    at ContextifyScript.Script.runInThisContext (vm.js:23:33)
    at Object.runInThisContext (vm.js:95:38)
    at Object.<anonymous> ([stdin]-wrapper:6:22)
    at Module._compile (module.js:571:32)
    at evalScript (bootstrap_node.js:391:27)

但是当我将b.js的内容更改为:

let c = require("./test/c");

function b() {
  c();
  console.log("b");
}

module.exports = b;

现在a.js会抛出错误:

module.js:472
    throw err;
    ^

Error: Cannot find module './test/c'
    at Function.Module._resolveFilename (module.js:470:15)
    at Function.Module._load (module.js:418:25)
    at Module.require (module.js:498:17)
    at require (internal/module.js:20:19)
    at Object.<anonymous> (/Users/sp/Desktop/test/test/b.js:1:71)
    at Module._compile (module.js:571:32)
    at Object.Module._extensions..js (module.js:580:10)
    at Module.load (module.js:488:32)
    at tryModuleLoad (module.js:447:12)
    at Function.Module._load (module.js:439:3)

我不理解什么?

2 个答案:

答案 0 :(得分:0)

节点从文件module中查找require()对象。特别关注module.exports

// File a.js
const foo = "Hello"
module.exports = foo

// File b.js
const bar = "World"
module.exports = bar

// File index.js
const a = require('./a')
const b = require('./b')

console.log(a, b) //Hello World

您还可以导出对象

module.exports = { foo, bar }

您可以像这样导入

const { foo, bar} = require("./file")

如果您未指定位置,则会在node_modules

中查找
const express = require('express') // Looks inside node_modules for express

答案 1 :(得分:0)

我假设您从/test/根目录运行它们。

从root:a.js运行./test/b指向/test/test/b

从root:b.js运行./c指向不存在的/test/c

当您从root运行a.js时,它需要来自b.js的{​​{1}},然后需要./test/b通过c.js从其自己的目录开始相对路径 - 这就是为什么如果你运行./c,它的工作原理。

现在从a.js目录开始运行b.js会导致/test/b.js而不是c.js中寻找/test/c

/test/test/c更改为b.js会导致以下内容:

let c = require("./test/c");仍然需要来自a.js又名b.js的{​​{1}}。现在./test/b尝试要求/test/test/b指向不存在的b.js