面试题答案
一键面试优化模块加载性能的策略
- 代码分割:
- 描述:将代码按照功能或路由等规则拆分成多个较小的文件,避免初始加载时一次性加载过大的文件。这样可以减小初始加载包的体积,加快页面的加载速度。
- Webpack实现:使用
splitChunks
插件。例如:
module.exports = {
optimization: {
splitChunks: {
chunks: 'all'
}
}
};
- **适用场景**:适用于应用程序有明显的功能模块划分,如多页面应用或单页应用中有不同功能模块(如用户登录模块、商品展示模块等),可在页面加载或路由切换时,加载对应的代码块。
2. 按需加载:
- 描述:只有在需要使用某个模块时才加载它,而不是在页面初始化时就加载所有模块。这样可以避免加载一些用户可能永远不会用到的代码,提升性能。
- Webpack实现:在ES6模块中,可使用动态import()
语法。例如:
// 点击按钮时加载模块
document.getElementById('btn').addEventListener('click', async () => {
const module = await import('./module.js');
module.doSomething();
});
- **适用场景**:适用于用户操作触发的功能模块,如点击某个按钮才会显示的弹窗内的功能代码,或者用户特定行为才会用到的功能模块。
3. Tree - shaking:
- 描述:去除未使用的代码(即死代码),通过静态分析代码的导入和导出,仅保留被实际使用的部分。这可以显著减小打包后的文件体积。
- Webpack实现:Webpack默认支持Tree - shaking,只要使用ES6模块语法(import
和export
),并且在package.json
中设置"mode": "production"
,Webpack会在生产模式下自动启用Tree - shaking。
- 适用场景:适用于任何JavaScript项目,尤其是引入了大型库,但只使用了其中部分功能的情况,如引入了lodash
库,但只使用了_.map
函数,Tree - shaking可以去除其他未使用的函数代码。
4. 预加载和预渲染:
- 描述:预加载是提前加载将来可能会用到的资源,浏览器在空闲时间进行加载,不会阻塞页面渲染。预渲染则是提前渲染页面的部分内容,使页面加载后能更快呈现给用户。
- Webpack实现:预加载可通过在HTML中使用<link rel="preload">
标签,Webpack也可通过html - webpack - plugin
等插件来自动生成相关标签。例如:
<link rel="preload" href="path/to/module.js" as="script">
- **适用场景**:预加载适用于已知用户下一步很可能会用到的资源,如单页应用中用户点击某个按钮大概率会进入的下一个页面的代码。预渲染适用于首屏内容渲染较慢的情况,通过提前渲染首屏内容来提升用户体验。