面试题答案
一键面试1. 管理模块以确保可维护性和复用性的方法
- 模块化设计原则:遵循单一职责原则,每个模块只负责一个特定的功能。例如,将数据获取逻辑放在一个模块,视图渲染逻辑放在另一个模块。这样当需求变化时,只需要修改对应的模块,而不会影响其他无关部分。
- 目录结构规划:合理组织项目的目录结构。比如,将通用的工具函数放在
utils
目录,组件放在components
目录。这样不同类型的模块有清晰的存放位置,易于查找和管理。
2. 创建和引用自定义模块
创建自定义模块
假设我们要创建一个用于格式化日期的模块。在 utils
目录下创建 dateFormat.js
文件:
// utils/dateFormat.js
export const formatDate = (date) => {
return date.toISOString().split('T')[0];
};
引用自定义模块
在需要使用这个日期格式化功能的组件中,比如 src/lib/components/MyComponent.svelte
:
<script>
import { formatDate } from '../utils/dateFormat.js';
const today = new Date();
const formattedDate = formatDate(today);
</script>
<p>The formatted date is: {formattedDate}</p>
3. 处理模块之间的依赖关系
- 显式导入:在 Svelte 中,通过
import
语句显式声明模块的依赖。例如上面MyComponent.svelte
对dateFormat.js
的依赖。这种方式使得依赖关系清晰可见。 - Tree - shaking:Svelte 项目在构建过程中,工具(如 Rollup)会自动进行 tree - shaking。这意味着如果某个模块被导入但未使用,它不会被包含在最终的打包文件中。例如,如果在一个组件中导入了一个模块,但在代码中并未实际调用该模块的任何函数或使用其任何变量,打包时该模块不会被包含,从而优化了代码体积。
- 依赖倒置原则:尽量让高层模块不依赖于低层模块的具体实现,而是依赖于抽象。例如,在数据获取场景中,可以定义一个抽象的数据获取接口,高层组件依赖这个接口,而具体的数据获取实现(如使用
fetch
或其他库)在低层模块实现。这样如果数据获取方式改变,只需要修改低层模块,高层模块不受影响。