• Node.js 入门教程 14 使用 exports 从 Node.js 文件中公开功能


    Node.js 入门教程

    Node.js官方入门教程

    Node.js中文网

    本文仅用于学习记录,不存在任何商业用途,如侵删

    14 使用 exports 从 Node.js 文件中公开功能

    Node.js 具有内置的模块系统。

    Node.js 文件可以导入其他 Node.js 文件公开的功能。

    当想要导入某些东西时,使用

    const library = require('./library')
    
    • 1

    当然这是CommonJS的用法

    可以导入存在于当前文件夹中的 library.js 文件中公开的功能。

    在此文件中,必须先公开功能,然后其他文件才能将其导入。

    默认情况下,文件中定义的任何其他对象或变量都是私有的,不会公开给外界。

    这就是 module 系统提供的 module.exports API 可以做的事。

    在这里插入图片描述

    当将对象或函数赋值为新的 exports 属性时,这就是要被公开的内容,因此,可以将其导入应用程序的其他部分或其他应用程序中。

    可以通过两种方式进行操作。

    【1】第一种方式是将对象赋值给 module.exports(这是模块系统提供的对象),这会使文件只导出该对象:

    const car = {
      brand: 'Ford',
      model: 'Fiesta'
    }
    
    
    module.exports = car
    
    
    //在另一个文件中
    
    
    const car = require('./car')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

    这是 CommonJS的模块加载方式。

    【2】第二种方式是将要导出的对象添加为 exports 的属性。这种方式可以导出多个对象、函数或数据:

    const car = {
      brand: 'Ford',
      model: 'Fiesta'
    }
    
    
    exports.car = car
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    或直接

    exports.car = {
      brand: 'Ford',
      model: 'Fiesta'
    }
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    在另一个文件中,则通过引用导入的属性来使用它:

    const items = require('./items')
    items.car
    
    • 1
    • 2

    或者

    const car = require('./items').car
    
    • 1

    在这里插入图片描述

    module.exports 【对象】和 export 【属性】之间有什么区别?

    前者公开了它指向的对象。 后者公开了它指向的对象的属性。

    这里笔者补充一点吧【这是ES入门中阮一峰老师的解释】

    JavaScript 现在有两种模块。一种是 ES6 模块,简称 ESM;另一种是 CommonJS 模块,简称 CJS。

    CommonJS 模块是 Node.js 专用的,与 ES6 模块不兼容。语法上面,两者最明显的差异是,CommonJS 模块使用require()module.exports,ES6 模块使用importexport

    它们采用不同的加载方案。从 Node.js v13.2 版本开始,Node.js 已经默认打开了 ES6 模块支持。

    Node.js 要求 ES6 模块采用.mjs后缀文件名。也就是说,只要脚本文件里面使用import或者export命令,那么就必须采用.mjs后缀名。Node.js 遇到.mjs文件,就认为它是 ES6 模块,默认启用严格模式,不必在每个模块文件顶部指定"use strict"

    如果不希望将后缀名改成.mjs,可以在项目的package.json文件中,指定type字段为module

    {
       "type": "module"
    }
    
    • 1
    • 2
    • 3

    一旦设置了以后,该项目的 JS 脚本,就被解释成 ES6 模块。

    # 解释成 ES6 模块
    $ node my-app.js
    
    • 1
    • 2

    如果这时还要使用 CommonJS 模块,那么需要将 CommonJS 脚本的后缀名都改成.cjs。如果没有type字段,或者type字段为commonjs,则.js脚本会被解释成 CommonJS 模块。

    总结为一句话:.mjs文件总是以 ES6 模块加载,.cjs文件总是以 CommonJS 模块加载,.js文件的加载取决于package.json里面type字段的设置。

    注意,ES6 模块与 CommonJS 模块尽量不要混用。require命令不能加载.mjs文件,会报错,只有import命令才可以加载.mjs文件。反过来,.mjs文件里面也不能使用require命令,必须使用import

  • 相关阅读:
    电脑硬盘数据恢复一般需要收费多少钱
    c# .net linux ImageSharp+FastDFS+Base64上传图片,压缩图片大小,图像处理dcoker中使用也可以
    k8s--基础--23.5--认证-授权-准入控制--通过token令牌登陆dashboard界面
    vue3使用swiper6.7.0写轮播图,按钮在轮播图外面
    【网站项目】437物流管理系统
    HTML期末作业 蛋糕bootstrap响应式网站html+css+javascript+jquery+bootstarp
    Docker 镜像仓库是什么?有哪些镜像仓库命令?
    appium---如何判断原生页面和H5页面
    linux-Too many open files排查及修复
    如此编码 202201-1 【CSP】
  • 原文地址:https://blog.csdn.net/weixin_44226181/article/details/128060976