面试题答案
一键面试策略一:动态导入共享依赖
- 实现要点:在Angular中,对于共享依赖,不要在模块级别直接导入,而是在需要使用的组件或服务中通过动态导入的方式引入。例如,假设我们有一个共享的工具函数库
shared-utils
,通常在模块中导入是这样:
import { someSharedFunction } from './shared-utils';
改为动态导入:
async function loadSharedFunction() {
const { someSharedFunction } = await import('./shared-utils');
return someSharedFunction();
}
这样,只有在实际调用loadSharedFunction
时,才会加载shared-utils
代码,而不是在模块初始化时就加载,从而减少初始加载包大小。结合懒加载时,确保懒加载模块内同样采用这种动态导入共享依赖的方式。
策略二:提取共享依赖为单独的包
- 实现要点:使用工具如Webpack的
splitChunks
插件来将共享依赖提取为单独的包。在Angular项目中,通常会有webpack.extra.js
文件(如果没有则需创建)。在这个文件中配置splitChunks
:
module.exports = {
optimization: {
splitChunks: {
chunks: 'all',
name:'shared-deps',
minChunks: 2
}
}
};
这里chunks: 'all'
表示对所有类型的chunk都进行分割,name
指定了提取出的共享依赖包的名称,minChunks: 2
表示至少有两个模块依赖该代码时才提取为共享包。在懒加载模块配置中,同样会受益于这种提取,初始加载时只会加载核心代码和必要的懒加载模块,共享依赖包会在需要时加载。
策略三:Tree - shaking优化共享依赖
- 实现要点:确保项目配置支持Tree - shaking。在Angular项目中,使用ES6模块语法编写共享依赖代码,并且在构建时,Webpack会自动进行Tree - shaking。例如,对于一个共享的模块
sharedModule
:
// sharedModule.ts
export function function1() {
// 代码逻辑
}
export function function2() {
// 代码逻辑
}
在使用的组件中:
import { function1 } from './sharedModule';
// 这里只使用了function1,Webpack在构建时会通过Tree - shaking去除未使用的function2代码,减小包大小
function1();
对于懒加载模块,同样要遵循这种方式编写共享依赖代码,使得在懒加载模块加载时,也能去除未使用的代码,进一步优化包大小。