nodejs需要模块的解析顺序

时间:2013-05-07 20:08:22

标签: node.js module coffeescript require

假设我在同一目录中拥有所有foo.jsfoo.coffeefoo.json,并且我在该位置的另一个(coffeescript)文件中说require './foo',规则管理哪一个将被加载?

一个简短的实验(使用require.resolve './foo')似乎表明javascript文件胜过其他两个。

确实,看require.extensions看起来像 .js在那里作为第一项被提及 - 但是,对象属性名称在javascript中本质上是无序的,对吗?所以添加到该属性的任何名称都可能重新排序条目 - 这可能导致另一个解决方案订单吗?

只是想知道,因为我找不到任何文件。当你做(也许你不应该)coffee --compile route/to/directory时,它确实变得相关。

2 个答案:

答案 0 :(得分:2)

首先加载

.js(这也意味着最好使用完整的name.json代替name而不是name.js,因为它可能被LOAD_AS_FILE(X) 1. If X is a file, load X as JavaScript text. STOP 2. If X.js is a file, load X.js as JavaScript text. STOP 3. If X.node is a file, load X.node as binary addon. STOP 遮蔽了

来自“模块”documentation

  

如果找不到确切的文件名,那么node将尝试使用添加的.js,.json和.node扩展名加载所需的文件名。

另外,在pseudo-code中读取名称解析算法:

require("coffe-script")

在require.extensions中设置的(1,2,3)扩展按照它们的集合顺序进行检查(对于CoffeScript,.coffee installs {{1}}处理程序。)

答案 1 :(得分:1)

V8中的行为是按照最初分配的顺序迭代命名属性,因此我希望.js始终是第一个。

This post references that behavior