node.js的exports、module.exports与ES6的export、export default深入详解

node.js的exports、module.exports与ES6的export、export default深入详解

简介

在 Node.js 中,我们可以通过模块系统(Module System)来定义和使用模块。模块可以是一个文件或用 npm 安装的一个包。在模块中,我们可以导出(Export)一些变量、函数或类,供其他模块使用。

在 Node.js 中,有两个类似但不同的模块导出机制:exports 和 module.exports。而在 ES6 中,则有 export 和 export default。

exports 和 module.exports

exports 和 module.exports 都可以把对象暴露给其他模块。但是,它们之间有什么区别呢?

让我们看下面这个示例:

// lib.js
exports.foo = function () {
  console.log('hello, world!');
};

// app.js
const lib = require('./lib');
lib.foo();

在这个示例中,我们使用了 exports 来导出一个名为 foo 的函数,然后在 app.js 中使用 require('./lib') 来引入这个模块,并调用了 foo 函数。这个示例是可以正常工作的。

实际上,Node.js 内部对 exports 和 module.exports 的处理机制是这样的:

exports = module.exports = {};

也就是说,exports 和 module.exports 实际上是指向同一个对象的引用。因此,我们可以使用 exports.xx 和 module.exports.xx 这两种方式来向外暴露变量、函数或类。

但是,如果我们将 exports 直接赋值为一个新的对象,例如:

// lib.js
exports = {
  foo: function () {
    console.log('hello, world!');
  }
};

// app.js
const lib = require('./lib');
lib.foo();

这个示例是不会工作的。原因是 exports 的指向被改变了,而 module.exports 并没有受到影响。

因此,如果我们想在 Node.js 中使用 exports 暴露变量、函数或类,就需要像这样使用:

// lib.js
exports.foo = function () {
  console.log('hello, world!');
};

// app.js
const lib = require('./lib');
lib.foo();

或者使用如下方式:

// lib.js
module.exports = {
  foo: function () {
    console.log('hello, world!');
  }
};

// app.js
const lib = require('./lib');
lib.foo();

export 和 export default

在 ES6 中,可以使用 export 和 export default 来向外暴露变量、函数或类。

这两者的区别在于,export 可以暴露多个变量、函数或类,而 export default 只能暴露一个默认变量、函数或类。因此,使用 export 和 export default 的时候,需要注意一下它们的用法。

使用 export 默认导出的变量、函数或类,可以用 import 导入并且可以使用任意名称来指代它们。示例代码如下:

// lib.js
export default function () {
  console.log('hello, world!');
}

// app.js
import foo from './lib';
foo();

在这个示例中,我们使用 export default 导出了一个函数,并在 app.js 中使用 import xxx from './lib' 来导入这个函数。

如果我们想使用 export 导出多个变量、函数或类,可以使用如下方式:

// lib.js
export function foo () {
  console.log('foo');
}

export function bar () {
  console.log('bar');
}

// app.js
import { foo, bar } from './lib';
foo();
bar();

在这个示例中,我们使用 export 导出了两个函数,并在 app.js 中使用 import { xxx, xxx } from './lib' 来导入这两个函数。

总结

Node.js 的 exports 和 module.exports 可以用来向外暴露变量、函数或类,而 export 和 export default 则是 ES6 中用来向外暴露变量、函数或类的关键字。

需要注意的是,在 Node.js 中,exports 和 module.exports 的区别在于它们内部处理机制的差异。如果想暴露多个变量、函数或类,建议使用 exports;如果想暴露一个默认变量、函数或类,建议使用 export default。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:node.js的exports、module.exports与ES6的export、export default深入详解 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • npm install安装失败报错:The operation was rejected by your operating system

    当我们使用npm安装依赖时,可能会出现”npm install安装失败报错:The operation was rejected by your operating system”的错误提示。这个错误通常是因为电脑权限问题导致的,我们可以采取以下操作来解决此问题: 解决方式一:使用管理员权限运行命令行工具 有时候我们在安装依赖时,会因为权限不够而安装失败。可…

    node js 2023年6月8日
    00
  • Vue3+Element-plus项目自动导入报错的解决方案

    下面我就为您详细讲解“Vue3+Element-plus项目自动导入报错的解决方案”的完整攻略。 问题描述 在使用Vue3+Element-plus项目进行开发时,如果使用自动导入方式(通过Babel插件或Webpack插件)进行引入组件,则可能会出现报错(如“Cannot read properties of undefined (reading ‘pro…

    node js 2023年6月8日
    00
  • ES10 特性的完整指南小结

    ES10 特性的完整指南小结 ECMAScript 2019 (ES10) 是Javascript的第十代标准,为Javascript增加了一些新的特性和语法。本文将对ES10的主要新增特性进行介绍。 Array.prototype.flat() Array.prototype.flat() 方法可以将一个多维数组变成一个一维数组。它接收一个可选参数dept…

    node js 2023年6月8日
    00
  • 2014年最火的Node.JS后端框架推荐

    2014年最火的Node.JS后端框架推荐 Node.js是一个服务器端JavaScript环境,它以高效的事件驱动和非阻塞I / O模型而闻名,在现代Web应用程序开发中越来越受欢迎。但是,Node.js本身只是一个运行时环境,它需要框架来简化Web应用程序开发。在 2014年,以下是一些最流行的Node.js后端框架: 1. Express Expres…

    node js 2023年6月7日
    00
  • 详解redis在nodejs中的应用

    详解Redis在Node.js中的应用 简介 Redis是一个开源的、基于内存的key-value存储系统,数据存在内存中,因此读写速度快。Redis具有持久化和多种数据结构的支持,同时也是分布式系统下的良好选择。Node.js是一个充分利用事件驱动、非阻塞I/O的JavaScript运行时。结合Redis和Node.js,能够发挥它们的协同作用。 本文将着…

    node js 2023年6月8日
    00
  • Knockoutjs 学习系列(一)ko初体验

    以下是“Knockoutjs 学习系列(一)ko初体验”的完整攻略: 前言 Knockout.js是一个非常流行的前端MVVM框架,通过数据绑定和依赖追踪来自动管理UI的更新。在使用Knockout.js的过程中,你只需要关注数据和业务逻辑,而不必手动操作DOM。这篇攻略会给初学者讲解如何使用Knockout.js,从而让你更好地理解和掌握这个框架。 什么是…

    node js 2023年6月8日
    00
  • Nodejs学习笔记之Global Objects全局对象

    下面详细讲解一下“Nodejs学习笔记之Global Objects全局对象”的攻略。 1. 什么是Global Objects? 在Node.js的全局作用域中,存在一些对象,这些对象可以在任何地方访问,被称作全局对象,其中包括: global对象:它是一个全局对象,可以在任何地方访问,如果一个变量在所有模块中都是全局变量,它就是global对象的属性之一…

    node js 2023年6月8日
    00
  • JavaScript Fetch API请求和响应拦截详解

    JavaScript Fetch API请求和响应拦截详解 什么是Fetch API? fetch是Web API中的一个新的API,可以用来发起HTTP请求并获取响应数据。它支持Promise,让我们在异步请求中处理响应更加方便和灵活。 发起请求 使用fetch发起请求非常简单,我们只需要提供请求的URL和可选的一些配置,然后fetch会返回一个Promi…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部