HoRain云--Node.js 模块导入
当你开始写 Node.js 项目时最先遇到的问题之一就是——如何导入模块module。在 Node.js 里模块就是可以重复使用的 JavaScript 文件它们之间通过导入import和导出export互相通信。Node.js 生态系统主要支持两种模块系统CommonJS和ES Modules (ESM)。模块系统规范文件扩展名导入方式导出方式CommonJSNode.js 早期使用.jsrequire()module.exports/exportsES Module (ESM)ECMAScript 标准.mjs或type: moduleimportexport/export defaultCommonJS 模块系统CommonJS 是 Node.js 最早也是最广泛使用的模块系统它采用同步加载的方式这意味着模块在加载时会阻塞程序的执行直到加载完成。导入和导出在 CommonJS 中你使用require()函数来导入模块使用module.exports或exports对象来导出模块。导出方式 math.js 文件代码// math.jsfunction add(a, b) {return a b;}module.exports { add };// 或者exports.add add;导入方式实例// app.jsconst math require(./math.js);console.log(math.add(2, 3)); // 5模块要想让外部访问自己的内容就需要使用 module.exports 或 exports 来导出实例// user.jsconst name Alice;const age 30;// 方式一使用 module.exports 导出单个对象或值module.exports {name: name,age: age,sayHello: () {console.log(Hello, my name is ${name}.);}};// 方式二使用 exports 导出多个具名变量// exports 是 module.exports 的一个引用exports.name name;exports.age age;exports.sayHello () {console.log(Hello, my name is ${name}.);};导入方式实例// main.jsconst user require(./user.js);console.log(user.name); // 输出: Aliceuser.sayHello(); // 输出: Hello, my name is Alice.// 也可以直接解构const { name, age } require(./user.js);console.log(name); // 输出: AliceCommonJS 特点同步加载适合服务器端环境因为模块通常都在本地文件系统中加载速度快。运行时加载require()可以在代码的任何位置调用这使得你可以根据条件来动态加载模块。缓存机制require()加载的模块会被缓存第二次导入时会直接从缓存中读取避免重复加载。ES ModuleESM规范ESM 是 JavaScript 官方的模块标准它采用异步加载并且是浏览器和现代 Node.js 应用的首选。在 ESM 中你使用 import 语句来导入模块使用 export 语句来导出模块。启用 ESM要在 Node.js 中使用 ESM你需要在 package.json 文件中添加 type: module或者将文件扩展名更改为 .mjs。// package.json { type: module }导出模块:实例// math.mjsexport function add(a, b) {return a b;}export default function multiply(a, b) {return a * b;}导入模块:实例// app.mjsimport multiply, { add } from ./math.mjs;console.log(add(2, 3)); // 5console.log(multiply(2, 3)); // 6启用方式文件扩展名用 .mjs或在 package.json 中添加{ type: module }ESM 支持两种导出方式具名导出 (Named Exports) 和 默认导出 (Default Export)。实例// user.mjs// 具名导出export const name Bob;export const age 25;// 默认导出const sayHello () {console.log(Hello, my name is ${name}.);};export default sayHello;导入方式实例// main.mjs// 导入具名导出import { name, age } from ./user.mjs;console.log(name); // 输出: Bob// 导入默认导出import sayHello from ./user.mjs;sayHello(); // 输出: Hello, my name is Bob.// 同时导入具名和默认导出import sayHello, { name } from ./user.mjs;console.log(name);sayHello();// 导入所有具名导出并将其作为对象的属性import * as user from ./user.mjs;console.log(user.name);user.default(); // 默认导出会作为 default 属性ESM 特点异步加载默认是异步加载不会阻塞主线程更适合浏览器环境但在 Node.js 中通常表现为同步加载。静态分析import和export语句在代码执行前就可以确定模块的依赖关系这使得工具如 Webpack、Vite可以进行更好的优化如Tree Shaking。严格模式ESM 模块默认在严格模式下运行。CommonJS 和 ESM 的区别项目CommonJSESM语法require/module.exportsimport/export加载机制运行时同步加载编译时静态加载默认支持Node.js 默认支持需.mjs或type: module适合场景后端脚本、老项目前后端现代项目、Tree-shaking是否可混用不能直接混用需额外配置不能直接混用需额外配置混合使用Node.js 在较新版本中支持两种模块系统共存。你可以在同一个项目中同时使用 CommonJS 和 ESM但需要注意以下几点ESM 中不能直接使用require()和module.exports。CommonJS 中不能直接使用import和export。如果想在 ESM 中导入 CommonJS 模块可以直接使用import语句ESM 会将其视为默认导出。// commonjs_module.js module.exports { data: hello }; // esm_module.mjs import commonModule from ./commonjs_module.js; console.log(commonModule.data); // 输出: hello如果想在 CommonJS 中导入 ESM 模块你需要使用动态import()函数。// esm_module.mjs export const name Bob; // commonjs_module.js async function loadESM() { const { name } await import(./esm_module.mjs); console.log(name); } loadESM();最佳实践建议对于新的项目强烈推荐使用 ES Modules (ESM)。它不仅是 JavaScript 的官方标准而且与现代前端工具链如 Vite、Next.js兼容性更好能够充分利用 Tree Shaking 等优化技术减少打包后的代码体积。如果你正在维护一个老旧的 CommonJS 项目并且不需要 ESM 的特性可以继续使用 CommonJS。但如果需要引入新的依赖或利用 ESM 的新特性可以考虑逐步迁移或者使用混合模式来过渡。

相关新闻

HoRain云--CSS 分组 和 嵌套 选择器

HoRain云--CSS 分组 和 嵌套 选择器

分组选择器在样式表中有很多具有相同样式的元素。h1 { color:green; } h2 { color:green; } p { color:green; }为了尽量减少代码,你可以使用分组选择器。每个选择器用逗号分隔。在下面的例子中,我们对以上代码使用分组选择器:实例h1,h2,p { …

2026/8/29 20:39:01 阅读更多 →
HoRain云--CSS padding(填充)

HoRain云--CSS padding(填充)

CSS padding(填充)是一个简写属性,定义元素边框与元素内容之间的空间,即上下左右的内边距。 padding(填充) 当元素的 padding(填充)内边距被清除时,所释放的区域将会受到…

2026/8/29 20:39:01 阅读更多 →
学习FastAPI,定义模型时使用Pydantic

学习FastAPI,定义模型时使用Pydantic

在其他的web框架中,Django或Flask,都有相应的表单类用来校验前端数据的合法行,在FaskAPI中则用Pydantic来实现。Pydantic 是 FastAPI 的"数据守门员":你只用声明"我想要什么类型的数据、有什么规则"&#xff…

2026/8/29 20:39:01 阅读更多 →

最新新闻

【PYTHON】使用代码执行js文件中的函数和独立页面执行自定义协议

【PYTHON】使用代码执行js文件中的函数和独立页面执行自定义协议

代码执行JS from playwright.sync_api import sync_playwrightwith sync_playwright() as p:browser p.chromium.launch(headlessFalse,executable_pathr"D:\download\chrome-win64\chrome-win64\chrome.exe",)page browser.new_page()# 监听浏览器console输出&…

2026/8/29 21:14:34 阅读更多 →
蓝桥杯国赛“扩散”题解:从暴力模拟到曼哈顿距离的算法思维跃迁

蓝桥杯国赛“扩散”题解:从暴力模拟到曼哈顿距离的算法思维跃迁

1. 项目概述:从一道国赛真题看算法思维的构建“扩散”这道题,是2020年第十一届蓝桥杯国赛C B组的一道经典题目。对于很多从省赛一路拼杀到国赛的选手来说,这道题像是一个分水岭,它考察的远不止是基础的语法或简单的算法模板&#…

2026/8/29 21:14:34 阅读更多 →
STM32G4 HAL库嵌入式开发实战:从外设驱动到系统设计

STM32G4 HAL库嵌入式开发实战:从外设驱动到系统设计

1. 从零到一:理解第九届蓝桥杯嵌入式国赛的挑战与机遇 第九届蓝桥杯嵌入式国赛,对于每一位参赛者而言,都是一场技术与心态的双重考验。它不仅仅是一次编程比赛,更像是一个浓缩的、高强度的嵌入式产品开发实战演练。当赛题下发&…

2026/8/29 21:14:34 阅读更多 →
JavaScript对象创建模式:从工厂、构造函数到原型与组合模式

JavaScript对象创建模式:从工厂、构造函数到原型与组合模式

1. 从“面条代码”到模块化:为什么我们需要封装如果你写过一段时间的JavaScript,尤其是接手过一些“祖传”代码,大概率见过这样的场景:几百行代码挤在一个文件里,变量名是a、b、c,函数之间互相调用&#xf…

2026/8/29 21:14:34 阅读更多 →
前端校招面经:字节阿里腾讯美团四厂面试全记录

前端校招面经:字节阿里腾讯美团四厂面试全记录

说实话,现在回头看2021届的校招,依然觉得那是一段很特别的日子。作为前端方向的学生,我在2020年从春招实习一路面到秋招,陆续投了字节跳动、阿里巴巴、腾讯、美团这四家,基本把国内主流大厂的前端面试风格都感受了一遍…

2026/8/29 21:14:34 阅读更多 →
阿里前端暑期实习面试复盘:从八股文到项目深挖的实战指南

阿里前端暑期实习面试复盘:从八股文到项目深挖的实战指南

开篇:一次把“八股文”问成“应用题”的面试我拿到阿里巴巴前端暑期实习offer已经是去年的事了,但这段时间陆续有学弟学妹来问我“阿里面试到底问什么”“前端暑期实习要准备到什么程度”,所以我决定把整个面试过程完整复盘一遍。先说结论&am…

2026/8/29 21:13:33 阅读更多 →

日新闻

etc目录下的profile.d文件目录设置环境变量和全局脚本shell

etc目录下的profile.d文件目录设置环境变量和全局脚本shell

一、设置环境变量etc目录下的profile.d文件目录 /etc/profile.d1、编写 vi test.sh文件内容# jdk变量 export ZHK_HOME/root export PATH$PATH:$ZHK_HOME/test # 可以取出来ZHK_HOME变量给ZZZ_HOME赋值 export ZZZ_HOME${ZHK_HOME}/test2、刷新 执行source /etc/profile 命令使…

2026/8/29 0:00:24 阅读更多 →
【JavaScript】内存管理-垃圾回收机制-内存泄露

【JavaScript】内存管理-垃圾回收机制-内存泄露

内存管理 C 语言这样的底层语言一般都有底层的内存管理接口,比如 malloc()和free()。 而 JavaScript 是在创建变量(对象,字符串等)时自动进行了分配内存,并且在不使用它们时“自动”释放。释放的过程称为垃圾回收。 整…

2026/8/29 0:00:24 阅读更多 →
Labgrid-MCP:为嵌入式硬件实验室接入AI Agent操控能力

Labgrid-MCP:为嵌入式硬件实验室接入AI Agent操控能力

Labgrid-MCP 的目标是把 MCP(Model Context Protocol)能力延伸到真实嵌入式硬件实验室:AI Agent 通过一个标准化的 MCP Server,就能查看目标板状态、控制上电断电、复位开发板、读取串口日志,甚至执行镜像刷写。对于经…

2026/8/29 0:00:24 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/29 18:08:35 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/28 23:05:07 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/28 19:47:53 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/29 4:34:53 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/28 17:43:04 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/29 2:05:18 阅读更多 →