javascript - 为什么我可以将 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;
}
我什至无法想象该变量是如何工作的。
解决方案
这就是所谓的对象解构。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 资源
推荐阅读
- python - 可视化来自 Microsoft Azure 读取 API 的 JSON 结果
- hierarchy - 基于孔径 7 层次结构的 H3 地理寻址方案
- haskell - 为什么我在 Haskell 中的 if then else 语句之后会出现解析错误?
- database - 在嵌套数组中查找具有重复元素的 mongo 文档的 ID
- javascript - 当我将鼠标悬停在“a”元素上时,我希望动画能够工作吗?
- python - Firefox 在服务器关闭连接时显示连接重置错误
- r - 使用 if else 条件向量化循环
- node.js - 使用 express.static 提供 admin-lte 静态文件 - 如何处理嵌套路由?
- javascript - 在 Blade Laravel 8 中使用 Javascript 附加翻译后的 HTML
- android - MPAndroid 图像最初不可见