require('mypackage.js')和require('mypackage')有什么区别?

这两个require陈述似乎以相同的方式工作:

var Mypackage = require('mypackage.js');

var Mypackage require('mypackage');

他们之间有区别吗?

答案是:

 Module.prototype.load = function(filename) { debug('load ' + JSON.stringify(filename) + ' for module ' + JSON.stringify(this.id)); assert(!this.loaded); this.filename = filename; this.paths = Module._nodeModulePaths(path.dirname(filename)); var extension = path.extname(filename) || '.js'; if (!Module._extensions[extension]) extension = '.js'; Module._extensions[extension](this, filename); this.loaded = true; }; 
  1. Node.JS会查看给定的模块是否是核心模块。 (例如httpfs等)始终在加载模块中占优先。
  2. 如果给定的模块不是核心模块(例如httpfs等),则Node.js将开始search名为node_modules的目录。
    它将从当前目录(相对于Node.JS中当前正在执行的文件)开始,然后沿着文件夹层次结构查找,检查每个级别的node_modules文件夹。 一旦Node.JSfindnode_modules文件夹,它将尝试加载给定的模块,作为(.js)JavaScript文件或命名的子目录; 如果它find了指定的子目录,它将尝试以各种方式加载文件。 所以,例如
  3. 如果您提出加载模块的请求,“utils”及其目录不是.js文件,则:
    Node.JS将通过以下方式searchnode_modulesutils的分层目录:
    ./node_modules/utils.js
    ./node_modules/utils/index.js
    ./node_modules/utils/package.json
  4. 如果Node.JS仍然无法在上述步骤中find该文件,Node.js将开始查看环境variables的目录path,即在您的机器上设置的NODE_PATH(如果您在Windows上显然由Node.JS安装程序文件设置)在上述所有步骤中找不到,然后打印一个堆栈跟踪到stder
    例如Error: Cannot find module 'yourfile'
    欲了解更多信息:链接在这里甚至循环require()解释得非常好。