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

时间:2013-03-18 07:50:19

标签: node.js require

这两个require语句似乎都以相同的方式运行:

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

var Mypackage require('mypackage');

它们之间有区别吗?

1 个答案:

答案 0 :(得分:16)

以下是答案:

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将开始搜索名为 {{1}的目录} 的。
    它将从当前目录(相对于Node.JS中当前正在执行的文件)开始,然后在文件夹层次结构中向上运行,检查node_modules文件夹的每个级别。 一旦Node.JS找到node_modules文件夹,它就会尝试将给定模块加载为(.js)JavaScript文件或命名子目录;如果它找到了命名的子目录,它将尝试以各种方式加载该文件。所以,例如
  3. 如果您要求加载模块,“utils”及其目录而不是.js文件,则:Node.JS将在分层目录中搜索node_modulesnode_modules通过以下方式:
    utils
    ./node_modules/utils.js
    ./node_modules/utils/index.js
  4. 如果Node.JS仍然无法在上述步骤中找到该文件,Node.js将开始从环境变量中查看目录路径,即 ./node_modules/utils/package.json 设置为您的机器(如果您在Windows上,显然由Node.JS安装程序文件设置) 然后,在上述所有步骤中找不到,将堆栈跟踪打印到stder 例如 NODE_PATH Error:
    有关更多信息:链接为here,即使循环require()也能得到很好的解释。