Node.js:CommonJS模块化规范

news2025/1/19 3:05:10

CommonJS

上文提到了 Node 采用的模块化规范是 CommonJS,它主要规定了如何定义模块,如果导出模块和如何导入模块

  • 定义模块:一个文件就是一个模块
  • 导出模块:通过 module.exports 导出模块
  • 导入模块:通过 require 方法导入模块

为了方便使用模块化,于是提供了几个全局的方法或对象,分别是:

  • require:是一个方法,用来导入模块
  • module:是一个对象,表示当前的模块定义
  • exports:是 module.exports 对象的别名,存放了模块要导出的内容
  • __dirname:获取当前文件的绝对路径
  • __filename:获取当前文件绝对路径和文件名称

下面来看下这几个对象和方法的使用。

模块的导入和导出

首先准备一个目录:

a.js 模块导出内容:

const name = 'kw'

// 导出内容有几种不同的方式:
// 方式1:模块只导出变量 name
module.exports = name


// 方式2:模块导出的是一个对象,包含一个 name 属性
module.exports.name = name
// 等同于
exports.name = name

模块要导出的内容是存放在 module.exports 中的,默认是一个空对象。

exportsmodule.exports 的别名,在导出内容时,切不可这样做:

const name = 'kw'

exports = name

这里就是值类型与引用类型的区别的问题。将 exports 指向一个全新的值,就和原来的 module.exports 断了联系,此时模块将导出默认的空对象。

idnex.js中,导入 a 模块:

const a = require('./a')
// 方式1的结果:
console.log(a) // 'kw'

// 方式2的结果:
console.log(a) // {name: 'kw'}

模块不止 .js

上面的示例中,我们所创建的模块都是一个个的 .js 文件,这属于文件类型的模块

文件不止一种类型,文件模块也就不止一种。在 node 中的文件模块有三种:

  • 后缀名为 .js 的文件
  • 后缀名 .jsonjson 文件
  • 后缀名为 .node 的经过编译的二进制模块文件

对不同文件后缀的模块有不同的加载策略。对于 json 文件会调用 fs 模块读取后再用 JSON.parse 方法转成 json对象;对于 .node 文件,不经任何处理,直接调用。

我们知道 Webpack 是一个模块打包工具,它默认支持 CommonJS 规范。使用 Webpack 时,也会认为一个文件就是一个模块。但比 CommonJS 规范更加丰富的是,不仅 .js.json 是模块,任意一个文件都是模块,比如 .png.vue.ts,但是这种模块 Webpack 是“不认识”的,还需要安装对应的 loader 去解析。

require 导入模块的查找机制

按照来源划分,在 Node 中一共有三类模块,分别是:

  • 内置模块:也叫核心模块,由 Node 本身实现和提供的,比如 fshttppath模块
  • 自定义模块:一般项目中自己写的每一个 .js 文件都是
  • 第三方模块:通过包管理工具 npm/yarn/pnpm 安装到 node_modules 目录下的模块

require 方法在导入模块时,会有一个查找的机制。

导入内置模块

参数是一个模块名。如果发现是内置模块,则导入并结束查找。

const http = require('http')

导入自定义模块

参数是一个文件路径,以 ./../ 或者 /开头。

// 此时会当作内置模块查找,自然是找不到的,会报错
const a = require('a.js')

// 必须以 ./、 ../、 / 开头
// 找到同级目录下的 a.js 并导入
const a = require('./a.js')

如果模块没有带后缀:

const a = require('./a')

会依次去找有没有 a.jsa.jsona.node,找到则导入模块;没有的话,会将 a 当作一个目录名,去找 a 目录下的 index.jsindex.jsonindex.node,找到则导入模块。如果还没有找到,则报错找不到模块。

导入第三方模块

参数是一个模块名,并且不是核心模块名。

通过包管理工具安装一个模块:

npm install dayjs
// src/index.js

// 发现 dayjs 不是内置模块,首先会从当前模块所在目录的 node_modules 目录下查找,找到后就结束查找。找不到则向上一级目录查找,一直到系统的根目录。
// 查找顺序分别是:
/** 
    'c:\Users\taylo\Desktop\commonjs\src\node_modules',
    'c:\Users\taylo\Desktop\2022 掘金日新计划 8月\commonjs\node_modules',
    'c:\Users\taylo\Desktop\2022 掘金日新计划 8月\node_modules',
    'c:\Users\taylo\Desktop\node_modules',
    'c:\Users\taylo\node_modules',
    'c:\Users\node_modules',
    'c:\node_modules'
    在我们的目录结构中,会从第二个路径中找到,于是导入模块,结束查找。
*/

const dayjs = require('dayjs')

console.log(dayjs(123456789123).format('YYYY-MM-DD hh:mm:ss')) // '1973-11-30 05:33:09'

小结

本文主要介绍了 CommonJS 规范在 Node 中的简单应用,主要就是导入和导出模块。

关于 CommonJS 规范更细节的讲解,以及实现原理,会在后面的更文中谈到,敬请期待。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/197654.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】第八部分 Linux常用基本命令

【Linux】第八部分 Linux常用基本命令 文章目录【Linux】第八部分 Linux常用基本命令8. Linux常用基本命令8.1 帮助命令8.2 文件目录类命令pwd 显示当前工作目录的绝对路径cd 切换目录ls 列出目录的内容mkdir 创建目录rmdir 删除目录touch 创建文件cp 复制文件或者目录rm 删除文…

Kaggle系列之预测泰坦尼克号人员的幸存与死亡(随机森林模型)

Kaggle是开发商和数据科学家提供举办机器学习竞赛、托管数据库、编写和分享代码的平台,本节是对于初次接触的伙伴们一个快速了解和参与比赛的例子,快速熟悉这个平台。当然提交预测结果需要注册,这个可能需要科学上网了。我们选择一个预测的入…

【操作系统】4、设备管理

文章目录四、设备管理4.1 I/O设备基本概念4.2 I/O控制方式4.2.1 程序控制方式4.2.2 中断方式4.2.3 DMA控制方式4.2.4 通道控制方式4.3 缓冲技术4.4 假脱机技术四、设备管理 I/O控制方式:程序控制、中断、DMA、通道, 缓冲技术;假脱机技术(SPO…

大龄学长的浙大MBA提面优秀之路分享

作为今年上岸浙大MBA项目的一名中年老学长,想把自己在提面中取得优秀资格的经验做个梳理供大家参考,因为以我的经历来说,我认为浙大MBA提前批面试是非常有价值的,而且在提面过程中也发现了优秀资格其实遍布于各个年龄段和层级&…

2023-02-04 Elasticsearch环境安装

1 JDK-8的安装 查询资料自我安装即可,这里不做展示。 2 Elasticsearch 的安装 Elasticsearch目录结构: 配置文件: #节点名称,集群内要唯一 node.name: node-1001node.master: true node.data: true#ip 地址 network.host: localhost htt…

细讲TCP三次握手四次挥手(一)

计算机网络体系结构 在计算机网络的基本概念中,分层次的体系结构是最基本的。计算机网络体系结构的抽象概念较多,在学习时要多思考。这些概念对后面的学习很有帮助。 网络协议是什么? 在计算机网络要做到有条不紊地交换数据,就必…

lsof - list open file

lsof 指令全称 list open file,用官方的话说 Lsof revision 4.91 lists on its standard output file information about files opened by processes -i 平常工作中,用到最多的就是 -i 参数,后面跟端口号,可以查看和这个端口有关…

【嵌入式】MDK使用sct文件将代码段放入RAM中执行

sct文件即分散加载文件,是ARMCC编译器使用的链接脚本文件,等同于GCC编译器的ld链接脚本。MDK IDE使用的是ARMCC。 支持NorFlash中运行代码(XIP)的MCU例如STM32,一般将所有代码(text段)都放在FL…

[ 云计算 | AWS ] 亚马逊云科技核心服务之计算服务(Part1:AWS EC2 星巴克为什么横向排队)

(星爸爸网络上的一张图) 注意上图中的5个人,对没错这5个人。一般情况星巴克的人员配置大概是这样的: 1个经理,在办公室两个收银,在收银台(本文关注的重点)三个人做咖啡 当你去过星巴克买咖啡时&#xff0…

【NS2】tcl与c++互相调用/传参

在NS2,做实验的时候,为了能通过循环配合传值实验,一直找不到tcl传参给c的方法,网上的只po出一部分看不懂,只能通过源码自己研究。最后的解决办法就是,模仿源码的操作,以下通过tcl→ex→sat-irid…

Navicat Monitor 3.0 现已上市 | 欢迎下载试用

Navicat Monitor 3.0 现已上市Navicat Montior 3.0 现已发布!一经发布,受到广大专业运维人员的关注与选择! 五大新亮点带给运维团队最为实用且有效地提升监控能力。其具备 PostgreSQL 服务器监控能力、支持优化慢查询、构建自定义指标、性能分析工具优化…

flutter问题

问题一1.报错:Flutter ios/Flutter/Debug.xcconfig: unable to open file (in target "Runner" in project "Runner")2.解决:cd 项目目录flutter cleanflutter create --org solanddriver .运行Xcode问题二1.Cannot run with sound …

Java线程安全问题的原因和解决方案

1.什么是线程安全2.线程不安全的原因 及 解决措施2.1 多线程同时修改同一个变量2.2 修改操作不是原子性加锁操作关键字:synchronized2.3 抢占式执行,随机调度 (根本原因)2.4内存可见性问题volatile 关键字2.5指令重排序1.什么是线程安全 线程安全的确切定义是比较复…

Java——SSM项目(瑞吉外卖)笔记

阅读提醒:最重要的内容都是我手打的字,还有截图上的红字备注部分。 nginx是一个服务器,主要部署一些静态的资源,包括后面做tomcat的集群, 可以接收前端的请求,然后分发给各个tomcat 第一步搭建数据库&…

浏览器网页视频怎么快速下载到本地?

我们在浏览网页时,经常会遇到一些特别喜欢的视频文件,想要下载收藏却苦于不会操作怎恶魔办呢?这时候可以通过一些小插件快速达成下载,比如通过猫爪视频下载插件用户可以轻松的抓取任意网页的视频文件,并将其保存到本地…

Java 利用PriorityQueue进行无InvokerTransformer反序列化

java_PriorityQueue java.util.PriorityQueue 是一个优先队列(Queue),节点之间按照优先级大小排序成一棵树。其中PriorityQueue有自己的readObject反序列化入口。 反序列化链为:PriorityQueue#readObject->heapify()->sif…

新网站沙盒期要多久(关于网站走出沙盒期的征兆)

做网站优化首先要明白搜索引擎抓取原理,不管是百度还是谷歌,新站上线总要进入沙盒,接受来自搜索引擎的审查,涉及网站结构、网站内容、网站外链等内容。对于新手朋友来说,难免着急,这段考察期究竟有多长&…

【Python获取相亲网站数据】马上都元宵节了,还在相亲,看看某相亲网站有没有那个有缘人。

前言 马上都元宵节了,还在相亲,看看某相亲网站有没有那个有缘人。今天我们来爬取某相亲网站获取我们想要的数据,比如说,对方的姓名,年龄,身高,体重等等。今天我们主要使用CSS选择的方法来匹配我…

IDEA插件开发入门.01

环境准备Idea插件SDK文档在线地址:https://plugins.jetbrains.com/docs/intellij/welcome.html安装IntelliJ IDEA,这里使用版本2020.1.3 X64IDEA中安装Plugin DevKit插件创建插件项目新建工程。File ->New -> Project选择工程类型,Inte…

无法应用转换程序。请检查指定的转换程序路径是否有效。例子:Adobe Acrobat DC (PDF编辑器)卸载不了或者无法重新安装

不知道大家有没遇到这种情况,Adobe Acrobat DC (PDF编辑器)卸载不了或者无法重新安装,显示:无法应用转换程序。请检查指定的转换程序路径是否有效。 今天小编句遇到了这种情况,卸不了,把文件夹直接删了还是无法重新安装…