练习

模块化机器人

这些是第 7 章的项目所创建的约束:

  1. roads
  2. buildGraph
  3. roadGraph
  4. VillageState
  5. runRobot
  6. randomPick
  7. randomRobot
  8. mailRoute
  9. routeRobot
  10. findRoute
  11. goalOrientedRobot

如果你要将该项目编写为模块化程序,你会创建哪些模块? 哪个模块依赖于哪个模块,以及它们的接口是什么样的?

哪些片段可能在 NPM 上找到? 你愿意使用 NPM 包还是自己编写?

roads模块

根据第 7 章中的示例编写 CommonJS 模块,该模块包含道路数组,并将表示它们的图数据结构导出为roadGraph。 它应该依赖于一个模块./graph,它导出一个函数buildGraph,用于构建图。 该函数接受包含两个元素的数组(道路的起点和终点)。

  1. // Add dependencies and exports
  2. const roads = [
  3. "Alice's House-Bob's House", "Alice's House-Cabin",
  4. "Alice's House-Post Office", "Bob's House-Town Hall",
  5. "Daria's House-Ernie's House", "Daria's House-Town Hall",
  6. "Ernie's House-Grete's House", "Grete's House-Farm",
  7. "Grete's House-Shop", "Marketplace-Farm",
  8. "Marketplace-Post Office", "Marketplace-Shop",
  9. "Marketplace-Town Hall", "Shop-Town Hall"
  10. ];

循环依赖

循环依赖是一种情况,其中模块 A 依赖于 B,并且 B 也直接或间接依赖于 A。许多模块系统完全禁止这种情况,因为无论你选择何种顺序来加载此类模块,都无法确保每个模块的依赖关系在它运行之前加载。

CommonJS 模块允许有限形式的循环依赖。 只要这些模块不会替换它们的默认exports对象,并且在完成加载之后才能访问对方的接口,循环依赖就没有问题。

本章前面给出的require函数支持这种类型的循环依赖。 你能看到它如何处理循环吗? 当一个循环中的某个模块替代其默认exports对象时,会出现什么问题?