MST

星途 面试题库

面试题:Angular代码分割与懒加载的深度结合

在一个大型Angular项目中,已经使用了代码分割来优化加载速度。现在,部分模块存在大量的共享依赖,导致分割后的代码包依旧较大。请提出至少两种优化策略,结合懒加载和代码分割,进一步减小初始加载包大小,并说明每种策略在实际代码中的实现要点。
33.6万 热度难度
前端开发Angular

知识考点

AI 面试

面试题答案

一键面试

策略一:动态导入共享依赖

  • 实现要点:在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();

对于懒加载模块,同样要遵循这种方式编写共享依赖代码,使得在懒加载模块加载时,也能去除未使用的代码,进一步优化包大小。