- 练习
- 模块化机器人
roads模块- 循环依赖
练习
模块化机器人
这些是第 7 章的项目所创建的约束:
roadsbuildGraphroadGraphVillageStaterunRobotrandomPickrandomRobotmailRouterouteRobotfindRoutegoalOrientedRobot
如果你要将该项目编写为模块化程序,你会创建哪些模块? 哪个模块依赖于哪个模块,以及它们的接口是什么样的?
哪些片段可能在 NPM 上找到? 你愿意使用 NPM 包还是自己编写?
roads模块
根据第 7 章中的示例编写 CommonJS 模块,该模块包含道路数组,并将表示它们的图数据结构导出为roadGraph。 它应该依赖于一个模块./graph,它导出一个函数buildGraph,用于构建图。 该函数接受包含两个元素的数组(道路的起点和终点)。
// Add dependencies and exportsconst roads = ["Alice's House-Bob's House", "Alice's House-Cabin","Alice's House-Post Office", "Bob's House-Town Hall","Daria's House-Ernie's House", "Daria's House-Town Hall","Ernie's House-Grete's House", "Grete's House-Farm","Grete's House-Shop", "Marketplace-Farm","Marketplace-Post Office", "Marketplace-Shop","Marketplace-Town Hall", "Shop-Town Hall"];
循环依赖
循环依赖是一种情况,其中模块 A 依赖于 B,并且 B 也直接或间接依赖于 A。许多模块系统完全禁止这种情况,因为无论你选择何种顺序来加载此类模块,都无法确保每个模块的依赖关系在它运行之前加载。
CommonJS 模块允许有限形式的循环依赖。 只要这些模块不会替换它们的默认exports对象,并且在完成加载之后才能访问对方的接口,循环依赖就没有问题。
本章前面给出的require函数支持这种类型的循环依赖。 你能看到它如何处理循环吗? 当一个循环中的某个模块替代其默认exports对象时,会出现什么问题?
