面试题答案
一键面试代码分割
- Webpack实现方式:
- 动态导入(import()语法):在Vue项目中,对于路由组件等场景,可使用动态导入。例如在Vue Router配置中:
这样Webpack会将const router = new VueRouter({ routes: [ { path: '/home', component: () => import('./components/Home.vue') } ] });
Home.vue
单独打包成一个chunk文件。当访问/home
路由时,才会加载这个chunk,实现了按需加载,减少了初始加载的代码量。- splitChunks插件:Webpack默认配置了
splitChunks
插件,可对第三方库和公共代码进行分割。例如,在webpack.config.js
中:
这会将所有chunk中公共的模块(如module.exports = { optimization: { splitChunks: { chunks: 'all' } } };
vue
、vue - router
等第三方库)提取到单独的文件中。在多页面应用或有多个入口的Vue项目中,这些公共模块只需要加载一次,提高了缓存利用率。 - 应用场景及效果:
- 场景:在大型单页应用(SPA)中,页面众多且功能复杂。如电商平台的管理后台,有商品管理、订单管理、用户管理等多个模块。
- 效果:通过代码分割,初始加载时只加载必要的代码,提升了页面的加载速度。用户在操作过程中,根据需要加载相应的模块,减少了用户等待时间,提升了用户体验。同时,公共代码的提取也提高了缓存效率,再次访问不同页面时可能无需重复下载相同的代码。
Tree - shaking
- Webpack实现方式:
- ES6模块规范支持:Vue项目中,确保使用ES6模块(
import
和export
)进行代码编写。Webpack在构建过程中,会分析ES6模块的依赖关系,只保留被使用的导出。例如,假设有一个工具函数文件utils.js
:
Webpack在打包时,会忽略// utils.js export const add = (a, b) => a + b; export const subtract = (a, b) => a - b; // main.js import { add } from './utils.js';
subtract
函数,不会将其打包进最终的代码中。- mode设置为production:在
webpack.config.js
中设置mode: 'production'
。Webpack在生产模式下,会启用更多的优化,包括更严格的Tree - shaking。生产模式下会压缩代码,进一步移除未使用的代码。
- ES6模块规范支持:Vue项目中,确保使用ES6模块(
- 应用场景及效果:
- 场景:在引入大型第三方库时,如
lodash
。lodash
提供了大量的工具函数,但在项目中可能只使用其中几个。例如只使用_.debounce
函数:
import { debounce } from 'lodash';
- 效果:Tree - shaking会将
lodash
中未使用的函数剔除,减小了打包后的文件体积。对于大型Vue项目,依赖众多,通过Tree - shaking可以显著减少最终打包文件的大小,加快加载速度。
- 场景:在引入大型第三方库时,如