练习
模块化机器人
这些是第 7 章的项目所创建的约束:
roads
buildGraph
roadGraph
VillageState
runRobot
randomPick
randomRobot
mailRoute
routeRobot
findRoute
goalOrientedRobot
如果你要将该项目编写为模块化程序,你会创建哪些模块? 哪个模块依赖于哪个模块,以及它们的接口是什么样的?
哪些片段可能在 NPM 上找到? 你愿意使用 NPM 包还是自己编写?
roads
模块
根据第 7 章中的示例编写 CommonJS 模块,该模块包含道路数组,并将表示它们的图数据结构导出为roadGraph
。 它应该依赖于一个模块./graph
,它导出一个函数buildGraph
,用于构建图。 该函数接受包含两个元素的数组(道路的起点和终点)。
// Add dependencies and exports
const 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
对象时,会出现什么问题?
当前内容版权归 wizardforcel 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 wizardforcel .