我无法理解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)
我不理解什么?
答案 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
。