首页 > 解决方案 > 为什么我可以将 require 的结果分配给一个对象?

问题描述

我很好奇 require() 函数在 Node.js 中是如何工作的。

所以我正在研究 NodeJS 核心模块中的代码。

Webstorm中nodejs项目中这个文件的路径如下。

外部库\Node.js Core\core-modules\internal\modules\cjs\loader.js

const {   
       makeRequireFunction,   
       requireDepth,   
       stripBOM,   
       stripShebang } = require('internal/modules/cjs/helpers');

所以,我还没有在 javascript 中看到上述形式的变量。而且我发现数组中的文本是 helper.js 中函数的名称。

helper.js 路径如下。

外部库\Node.js Core\core-modules\internal\modules\cjs\helper.js

// Invoke with makeRequireFunction(module) where |module| is the Module 

object
// to use as the context for the require() function.
function makeRequireFunction(mod) {
  const Module = mod.constructor;

  function require(path) {
    try {
      exports.requireDepth += 1;
      return mod.require(path);
    } finally {
      exports.requireDepth -= 1;
    }
  }

  function resolve(request, options) {
    if (typeof request !== 'string') {
      throw new ERR_INVALID_ARG_TYPE('request', 'string', request);
    }
    return Module._resolveFilename(request, mod, false, options);
  }

  require.resolve = resolve;

  function paths(request) {
    if (typeof request !== 'string') {
      throw new ERR_INVALID_ARG_TYPE('request', 'string', request);
    }
    return Module._resolveLookupPaths(request, mod, true);
  }

  resolve.paths = paths;

  require.main = process.mainModule;

  // Enable support to add extra extension types.
  require.extensions = Module._extensions;

  require.cache = Module._cache;

  return require;
}

我什至无法想象该变量是如何工作的。

标签: javascriptnode.js

解决方案


这就是所谓的对象解构。require 返回一个包含多个键(包括您的示例中的键)的对象,并且 ES6+ javascript 将使这些键中的每一个都可作为直接常量使用

例子:

// object containing name, country & job keys
const person = {name: "John Doe", country: "Belgium", job: "Developer"};

// destructuring assignment, grabbing name, country & job from the person object
const {name, country, job} = person;

console.log(name);//"John Doe"
console.log(country);//"Belgium"
console.log(job);//"Developer"

请注意,您还可以使用类似的语法分配不同的变量名称。
给定前一个对象:

const {job: occupation} = person

console.log(occupation); //"Developer"

require在 Node 中解析 JavaScript 文件并返回一个window.exports对象,该对象是通过在原始 JS 周围包装一些代码而创建的。请参阅require() 实际返回的内容、文件或函数以及https://nodejs.org/api/modules.html#modules_require_id

额外资源:MDN 资源


推荐阅读