Node.js CommonJS模块化规范的使用 您所在的位置:网站首页 quickjs使用npm模块 Node.js CommonJS模块化规范的使用

Node.js CommonJS模块化规范的使用

2023-03-16 05:06| 来源: 网络整理| 查看: 265

CommonJS

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

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

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

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

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

模块的导入和导出

首先准备一个目录:

Node.js CommonJS模块化规范的使用_前端模块化

​​a.js​​ 模块导出内容:

const name = 'kw'

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

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

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

​​exports​​ 是​​module.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 本身实现和提供的,比如 ​​fs​​、​​http​​、​​path​​模块自定义模块:一般项目中自己写的每一个 ​​.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.js​​、 ​​a.json​​、​​a.node​​,找到则导入模块;没有的话,会将 ​​a​​ 当作一个目录名,去找 ​​a​​ 目录下的 ​​index.js​​、 ​​index.json​​、 ​​index.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 规范更细节的讲解,以及实现原理,会在后面的更文中谈到,敬请期待。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有