【Node.js】模块化

概述

Nodejs 模块化规范遵循两套规范:

  • Common JS
  • ES Module

Common JS

引入模块(require)支持四种格式

  • 支持引入内置模块例如 http os fs child_process 等const fs = require('fs'),高版本也可以使用const fs = require('node:fs')便于区分
  • 支持引入第三方模块express md5 koa 等const md5 = rquire('md5')
  • 支持引入自己编写的模块require('./test.js')
  • 支持引入addon, napi 等 C++扩展模块 (编译后为.node文件)
  • 支持引入 json 文件 const data = require('./data.json')

导出模块exports 和 module.exports

js 复制代码
module.exports = {
  code: 200,
  hello: function() {
    console.log('Hello, world!');
  }
};

如果不想导出对象直接导出值: module.exports = 123

导入: const myTest = require('./MyTest.js'),类似解构赋值导入也可以。

ESM

引入模块 import 必须写在头部

使用ESM模块的时候必须开启一个选项

打开package.json 设置 type:module

import fs from 'node:fs'

如果要引入json文件需要特殊处理,需要增加断言并且指定类型 json,而且要注意node低版本不支持。import data from './data.json' assert { type: "json" }; console.log(data);

加载模块的整体对象 import * as all from 'xxx.js'

动态导入模块,import静态加载不支持掺杂在逻辑中。如果想动态加载使用import函数模式

js 复制代码
if(true){
    import('./test.js').then()
}

模块导出

导出一个默认对象 default只能有一个不可重复export default

js 复制代码
// export  default 只能有一个
export default {
    name: 'test',
}

导出变量

js 复制代码
export const a = 1

cjs 和 esm 的区别

  1. cjs 基于运行时的同步加载,esm 基于编译时的异步加载(也就是为什么import需要写在顶端,就是因为需要编译时就要引入,而非在运行时才会加载)
  2. cjs 可以修改值,esm 不可以修改(只读)
  3. cjs 不支持 tree shaking ,esm 支持 tree shaking
  4. cjs 顶层的 this 指向这个模块本身, esm 顶层的 this 指向 undefined
相关推荐
代码搬运媛2 小时前
NestJS 实战:TypeORM 从入门到精通(完整教程)
node.js
太难了啊3 小时前
5分钟实现你的第一个 Node.js 智能体
人工智能·node.js
MingT 明天你好!5 小时前
trae中安装mcp报Cannot find package/ERR_MODULE_NOT_FOUND问题
node.js·trae
米丘8 小时前
从 HTTP 到 WebSocket:深入 Vite HMR 的网络层原理
http·node.js·vite
米丘8 小时前
Node.js 事件循环
前端·javascript·node.js
Kel8 小时前
深入 Ink 源码:当 React 遇见终端 —— Custom Reconciler 全链路剖析
react.js·架构·node.js
全马必破三10 小时前
Vue3+Node.js 实现AI流式输出全解析
前端·javascript·node.js
吴声子夜歌11 小时前
Node.js——util工具模块
node.js
笑笑先生12 小时前
从接口搬运工到研发控制平面,BFF 到底在解决什么?
前端·架构·node.js
www_stdio12 小时前
🚀 从 Event Loop 到 AI Agent:我的 Node.js 全栈进阶之路
前端·node.js·nestjs