Node.js ES Modules (ECMAScript Modules)
Subject: Node.js
Subject: Node.js
export: Share functions, variables, or classes from a file.\n- import: Bring shared code into another module.\n- Native to browsers and now fully supported in Node.js (v12+ experimental, v16+ stable).\n\n---\n\n### Enabling ES Modules in Node.js\n1. Use .mjs Extension\nbash\nnode myModule.mjs\n\n2. Use "type": "module" in package.json\njson\n{\n  \"type\": \"module\"\n}\n\nThis lets you use .js files with ESM syntax.\n\n---\n\n### Example of ES Module Usage\n#### math.js\njs\nexport function add(a, b) {\n  return a + b;\n}\n\nexport function subtract(a, b) {\n  return a - b;\n}\n\n#### app.js\njs\nimport { add, subtract } from './math.js';\n\nconsole.log(add(5, 3));        // Output: 8\nconsole.log(subtract(10, 4));  // Output: 6\n\nNote: This requires the file extension to be .mjs, or your package.json must include \"type\": \"module\".\n\n---\n\n### Default Exports in ES Modules\n#### logger.js\njs\nexport default function log(message) {\n  console.log(\"Log:\", message);\n}\n\n#### app.js\njs\nimport log from './logger.js';\nlog(\"This is an ES Module example\");\n\n\n---\n\n### Top-Level await\nES Modules support await at the top level without needing to wrap code in an async function:\njs\n// top-level-await.js\nconst res = await fetch('https://jsonplaceholder.typicode.com/posts/1');\nconst data = await res.json();\nconsole.log(data);\n\nMust be run with \"type\": \"module\" in package.json.\n\n---\n\n### Differences Between CommonJS and ES Modules\n| Feature                | CommonJS (require)      | ES Modules (import)         |\n|------------------------|----------------------------|-------------------------------|\n| Import Syntax          | const fs = require('fs') | import fs from 'fs'         |\n| Export Syntax          | module.exports = ...     | export default / export {}|\n| Top-Level await        | Not supported              | Supported                     |\n| File Extension         | .js (default)            | .mjs or .js with type     |\n| Static Analysis        | Not supported              | Supported                     |\n\n---\n\n### Mixing CommonJS and ES Modules\n- You can import CommonJS modules into ES Modules using import.\n- You cannot use require() inside ES Modules.\n- To import an ES Module into CommonJS, use dynamic import() which returns a Promise.\n\n#### Example: Importing CommonJS into an ES Module\njs\n// app.mjs\nimport fs from 'fs';\n\nfs.readFile('example.txt', 'utf8', (err, data) => {\n  if (err) throw err;\n  console.log(data);\n});\n\n\n---\n\n### When to Use ES Modules\n- When building modern apps with consistent frontend/backend syntax.\n- When using tools like Babel, Webpack, or Rollup that prefer ESM.\n- When you need top-level await, static imports, or tree shaking.\n\n---\n\n### Key Takeaways\n- ES Modules are now fully supported in Node.js.\n- Enable using .mjs or \"type\": \"module\" in package.json.\n- Use import and export instead of require() and module.exports.\n- Avoid mixing module types unless necessary.\n- Some npm packages may still use CommonJS, so test compatibility when mixing systems.