我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Node.js中的CommonJS模块化规范详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Node.js中的CommonJS模块化规范详解

nodeJS的介绍

NodeJS不但自己可以完成服务器软件的功能,也不再需要php,asp,jsp等传统的服务器语言
nodeJS可以解析JS代码,而没有浏览器安全级别的限制,因为,它的运行可以脱离浏览器的环境,而是在服务端运行;提供了很多系统级别的API,如:
文件的读写
进程的管理
网络通信
NodeJS的包管理器npm,成为世界上最大的开放源代码的生态系统。

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 的文件
  • 后缀名 .json 的 json 文件
  • 后缀名为 .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
// class="lazy" data-src/index.js

// 发现 dayjs 不是内置模块,首先会从当前模块所在目录的 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 规范更细节的讲解,以及实现原理,会在后面的更文中谈到,敬请期待。

到此这篇关于Node.js中的CommonJS模块化规范的文章就介绍到这了,更多相关Node.js CommonJS模块化规范内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Node.js中的CommonJS模块化规范详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Node.js中的CommonJS模块化规范详解

这篇文章主要介绍了Node.js中的CommonJS模块化规范,本文主要介绍了 CommonJS 规范在 Node 中的简单应用,主要就是导入和导出模块,需要的朋友可以参考下
2023-02-06

Node.js CommonJS 规范揭秘:模块化开发的基石

Node.js CommonJS 规范是 JavaScript 模块化开发的基石,本文将深入解析 CommonJS 规范,帮助开发者理解模块化开发的精髓,提升代码的可读性、可维护性和复用性。
Node.js CommonJS 规范揭秘:模块化开发的基石
2024-02-04

Node.js CommonJS 规范与 ES 模块:大比拼

Node.js CommonJS 规范与 ES 模块
Node.js CommonJS 规范与 ES 模块:大比拼
2024-03-11

模块化规范 CommonJS 会消失吗?

JavaScript 出现大约 15 年后,开始从浏览器扩展到服务端。许多更大的项目选择使用 JavaScript 进行构建,而 JavaScript 需要一种更好的方法来处理大量源代码,它需要模块化。

Node.js CommonJS 规范:模块化编程的过去、现在和未来

Node.js CommonJS 规范:模块化编程的演变
Node.js CommonJS 规范:模块化编程的过去、现在和未来
2024-03-11

「Node.js系列」深入浅出Node模块化开发——CommonJS规范

本文将为大家透彻的介绍关于Node的模块化——CommonJS的一切。
CommonJS2024-12-03

编程热搜

目录