Node.js 知识(规范)

一、引言

在 Node.js 开发中,存在两种常用的模块规范,分别是默认使用的 CJS(CommonJS)规范以及 ESM(ES Modules)规范,二者在导入导出模块的语法等方面存在差异,下面将详细介绍它们各自的使用方式。

二、ESM(ES Modules)规范

2.1 配置 package.json 方式
  • 整体流程示例 :
    • demo.js 文件内容:
js 复制代码
//从 web.js 文件中导入 title、url、getUrl
import obj from "./web.js";

console.log(obj.title);
console.log(obj.url);
console.log(obj.getUrl());
  • web.js 文件内容:
js 复制代码
let title = "标题";
let url = "dengruicode.com";

let getUrl = () => "www.dengruicode.com";

//将一个对象作为整体导出,导出的对象包含 title、url、getUrl
export default { title, url, getUrl };
  • package.json 文件配置关键部分:
json 复制代码
{
  "type": "module",
  "name": "demo",
  "version": "1.0.0",
  "main": "demo.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "description": ""
}

通过在 package.json 中设置 "type": "module",可以让 Node.js 识别并按照 ESM 规范来处理模块的导入导出操作。

2.2 mjs 文件扩展名方式
  • 整体流程示例 :
    • demo.mjs 文件内容:
js 复制代码
//从 web.mjs 文件中导入 title、url、getUrl
import obj from "./web.mjs";

console.log(obj.title);
console.log(obj.url);
console.log(obj.getUrl());
  • web.mjs 文件内容:
js 复制代码
let title = "标题";
let url = "dengruicode.com";

let getUrl = () => "www.dengruicode.com";

//将一个对象作为整体导出,导出的对象包含 title、url、getUrl
export default { title, url, getUrl };

使用 .mjs 作为文件扩展名,Node.js 同样会按照 ESM 规范来处理模块相关操作,这种方式相对更直观地表明了使用的是 ESM 规范。

三、CJS(CommonJS)规范

  • 整体流程示例 :
    • demo.js 文件内容:
js 复制代码
//从 web.js 文件中导入 title、url、getUrl
//import obj from "./web.js"; //ESM规范
const obj = require("./web.js"); //CJS规范

console.log(obj.title);
console.log(obj.url);
console.log(obj.getUrl());
  • web.js 文件内容:
js 复制代码
let title = "标题";
let url = "dengruicode.com";

let getUrl = () => "www.dengruicode.com";

//将一个对象作为整体导出,导出的对象包含 title、url、getUrl
//export default { title, url, getUrl }; //ESM规范
module.exports = { title, url, getUrl }; //CJS规范

在 CJS 规范中,使用 require 函数来导入模块,使用 module.exports 来导出模块内容,这与 ESM 规范的 import 和 export 语法有着明显区别。

四、总结

在 Node.js 项目开发中,了解和掌握 ESM 规范与 CJS 规范的使用方式很重要,开发人员可以根据项目的实际需求、兼容性要求等因素来选择合适的模块规范进行代码的组织和模块间的交互,确保项目能够顺利运行并实现预期的功能。

相关推荐
严肃小白兔1 天前
TanStack Router 更新构建工具链:Node.js 兼容性、路由分割与前端工程实践
前端·node.js·状态模式
一缕82年的清风2 天前
用了 3 年 Notion 和 Obsidian 后,为什么我最终把所有身家搬到了思源笔记?
node.js
Dumbness2 天前
一份 JSON 生成增删改查接口,入参清洗漏了什么:Number(" ") 是 0,搜 100% 把 1000 元券也搜出来
node.js·express
FungLeo3 天前
成为全栈·基础补充·Node.js 运行时:事件循环与异步
javascript·node.js·事件循环·后端开发·异步编程·成为全栈
用户087308654874 天前
用 GUI 自动化写了一个群聊 AI:5 个真实事故,和 7 条让 AI 不像机器人的设计
node.js
Dumbness5 天前
毕设后台导出 CSV 的 4 个坑:date 字段漏了公式防护,搜索框输入 % 能扫全表
node.js·express
wno7047 天前
node.js中使用jquery
前端·node.js·jquery
damoluomu8 天前
Node 的 Headless 出厂没有前台,Java 的 Headless 是从门户里长出来的
java·开发语言·node.js
Dumbness8 天前
一个手机号验证码登录接口的五个坑:无限发码、无限试码,传个数字就让 Express 进程退出
node.js·express