【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
相关推荐
shmily麻瓜小菜鸡13 小时前
TDD(测试驱动开发)详解
开发语言·javascript·typescript·node.js·ecmascript
半生过往15 小时前
Node.js 多版本管理完全指南
node.js
梦帮科技1 天前
AI 音乐产品的发布工程:验证门、数据发布、回滚与生产运维纪律
数据结构·数据库·架构·node.js·音视频·动态规划·推荐算法
BreezeJiang1 天前
别把 WebSocket 当成一门新协议学:搞懂"借 HTTP 握手",双端 Demo 和跨域就都通了
websocket·node.js
65岁退休Coder2 天前
把 Agent 框架拆开:PI 开发生产级 Harness
后端·node.js·agent
65岁退休Coder2 天前
PI Agent 开发一个生产级 Harness
后端·node.js·agent
szephyr2 天前
WebSocket 实战:心跳、断线重连、鉴权,一次讲清
前端·websocket·node.js·长连接·实时通信
秋秋小事2 天前
node postgreSQL的select与include
node.js
ID34610744202 天前
【课程设计】基于Spring Boot+Vue的游戏账号租赁系统的设计与实现-计算机毕设 附源码50345
javascript·vue.js·spring boot·python·node.js·php·课程设计
柚yuzumi2 天前
彻底搞懂 JavaScript 类型转换:显式转换、隐式转换与 ToPrimitive
前端·javascript·node.js