HoRain云--Node.js 模块导入

发布时间:2026/8/29 20:38:57
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 的新特性可以考虑逐步迁移或者使用混合模式来过渡。