面试题答案
一键面试代码分割策略
- 使用动态导入(Dynamic Imports)
- 在Angular组件或服务中,使用ES2020的动态导入语法
import()
。例如,如果有一些不常用的模块,可以动态导入。
import { Component } from '@angular/core'; @Component({ selector: 'app - my - component', templateUrl: './my - component.html' }) export class MyComponent { async loadFeature() { const { FeatureModule } = await import('./feature.module'); // 这里可以使用FeatureModule } }
- Webpack会将动态导入的模块拆分成单独的chunk文件,在需要时才加载,从而减小初始加载的代码体积。
- 在Angular组件或服务中,使用ES2020的动态导入语法
- 按路由进行代码分割
- 在Angular路由配置中,使用
loadChildren
属性。例如:
const routes: Routes = [ { path: 'feature', loadChildren: () => import('./feature/feature.module').then(m => m.FeatureModule) } ];
- 这样Webpack会将
FeatureModule
及其相关代码分割成单独的chunk,只有在用户访问/feature
路由时才加载。
- 在Angular路由配置中,使用
缓存策略
- 设置Webpack缓存
- 在Webpack配置文件(通常是
webpack.extra.js
)中,启用缓存。例如,使用cache
选项:
module.exports = { cache: { type: 'filesystem', cacheDirectory: './node_modules/.cache/webpack' } };
- 这会将Webpack的编译结果缓存到指定目录,下次构建时,如果相关文件没有变化,Webpack可以直接使用缓存结果,大大加快构建速度。
- 在Webpack配置文件(通常是
- 优化HTTP缓存
- 在服务器端配置合理的HTTP缓存头。对于静态资源(如JavaScript、CSS、图片等),可以设置较长的缓存时间。例如,在Nginx配置中:
location ~ \.(js|css|png|jpg|gif)$ { expires 365d; access_log off; }
- 这样浏览器在下次请求相同资源时,如果缓存未过期,可以直接从本地缓存加载,减少网络请求和加载时间。
优化loader配置
- 优化ts-loader
- 在
webpack.extra.js
中配置ts-loader
时,启用transpileOnly
选项。例如:
module.exports = { module: { rules: [ { test: /\.ts$/, use: [ { loader: 'ts-loader', options: { transpileOnly: true } } ] } ] } };
transpileOnly
选项会跳过类型检查,只进行转译,能显著加快构建速度。不过需要注意,这会导致构建时不进行完整的类型检查,所以最好在开发过程中配合ng serve
的类型检查机制,在生产构建时使用此优化。
- 在
- 优化CSS loader
- 对于CSS,使用
OptimizeCSSAssetsPlugin
来压缩CSS。首先安装插件:npm install optimize - css - assets - plugin --save - dev
。然后在Webpack配置中:
const OptimizeCSSAssetsPlugin = require('optimize - css - assets - plugin'); module.exports = { optimization: { minimizer: [ new OptimizeCSSAssetsPlugin({}) ] } };
- 该插件会压缩CSS代码,减小CSS文件体积,从而优化构建产出。同时,在使用
style - loader
和css - loader
时,合理配置选项,如设置css - loader
的sourceMap
选项为false
(生产环境),可以减少构建过程中的额外开销。
- 对于CSS,使用