CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
JavaScript 进阶/课时/模块系统
RawBlame
课时目录12 节

JavaScript 进阶

  1. 01JS 进阶地图
  2. 02变量与提升
  3. 03运算符与相等
  4. 04控制流深入
  5. 05函数与 this
  6. 06异步深入
  7. 07对象与原型
  8. 08集合与 JSON
  9. 09模块系统
  10. 10内存与 GC
  11. 11调试与异常
  12. 12综合练习

模块系统

CommonJS、ESM、rest/spread。

30 分钟

模块系统

javascript-core 介绍 ESM 基础;本课对比 CommonJS(CJS) 与 ES Module(ESM),并深入 rest/spread 在模块边界的数据传递。Node 双模块见 nodejs-essentials;前端打包见 react-essentials。

学习目标

  • 区分 CJS require 与 ESM import 的加载时机
  • 理解 default export 与 named export 的互操作
  • 熟练使用 rest/spread 合并配置与参数

ESM(浏览器与现代 Node)

// math.js
export function add(a, b) {
  return a + b;
}
export default function multiply(a, b) {
  return a * b;
}

// app.js
import multiply, { add } from './math.js';
import * as math from './math.js';

ESM 静态分析:import 必须在顶层;支持 tree-shaking 删除未用导出。

CommonJS(Node 传统)

// logger.js
function log(msg) {
  console.log(msg);
}
module.exports = { log };
// 或 module.exports.log = log;

// app.js
const { log } = require('./logger');

CJS 运行时加载:require 可放在条件分支;导出的是值的拷贝(基本类型)或引用(对象)。

CJS 与 ESM 互操作

// ESM 引 CJS:default 常为 module.exports 整体
import pkg from 'legacy-cjs-package';

// CJS 引 ESM:需动态 import
async function load() {
  const { add } = await import('./math.js');
}

Node "type": "module" 或 .mjs 扩展名启用 ESM;混用需查阅 package.json 的 exports 字段。

rest / spread

const defaults = { page: 1, size: 20 };
const query = { ...defaults, page: 2, filter: 'js' };
// { page: 2, size: 20, filter: 'js' }

function createLesson(title, ...tags) {
  return { title, tags };
}
createLesson('模块', 'esm', 'cjs');

const { page, ...rest } = query;

展开是浅拷贝;嵌套对象需手动深拷贝或 structuredClone。

循环依赖

// a.js
import { b } from './b.js';
export const a = 'A' + b;

// b.js
import { a } from './a.js';
export const b = 'B';

ESM 通过 live binding 处理部分循环;设计上应避免相互 import,提取公共模块。

与构建工具

Vite / webpack 将 ESM 打包;import.meta.url 在 Node 中解析当前模块路径:

import { fileURLToPath } from 'node:url';
import { dirname } from 'node:path';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);

练习

  • 写两个 ESM 文件,分别 default 与 named export,在第三文件聚合导入
  • 用 spread 合并 API 默认 query 与用户传入参数
  • 说明 ESM 为何更利于 tree-shaking

小结

ESM 静态、可摇树;CJS 动态、Node 遗留;rest/spread 简化配置合并。 下一课内存与 GC。

加载本节练习…
← 上一课集合与 JSON下一课 →内存与 GC