【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
相关推荐
孟陬5 小时前
Node.js 测试报告格式一览和自定义 json 格式 `--test-reporter=spec | tap | dot | junit | lcov`
node.js
陳陈陳1 天前
🚀 前端流式输出革命:SSE + BFF 架构从零到一实战指南
vue.js·架构·node.js
Revolution611 天前
第一次运行 Node.js:终端里的 JavaScript 怎样执行
后端·面试·node.js
半句唐诗1 天前
我是如何通过 Access Token 成功发布第一个 npm 包的
前端·npm·node.js
贩卖黄昏的熊1 天前
NestJS简明教程——异常处理和日志
javascript·node.js·nest.js
Revolution612 天前
Node.js 是什么:前端项目里哪些事情由它完成
前端·面试·node.js
Revolution612 天前
Nest.js 是什么:怎样用它写出第一个后端接口
后端·node.js·nestjs
柳林林2 天前
解决 nvm 切换 Node.js 版本时报“没有文件扩展 ‘.vbs’ 的脚本引擎”错误
node.js
To_OC2 天前
从 0 到 1:Milvus + 大模型打造私人记忆知识库
人工智能·node.js·llm
孟陬2 天前
介绍 Node.js v22 新增的 `toArray` 方法
node.js·deno·bun