Skip to content

JS代码分割与动态加载优化指南

问题描述

项目中未使用动态导入实现代码分割,导致一次性加载所有代码,影响首屏加载性能。

优化建议

1. 动态导入实现

基本语法

javascript
// 动态导入模块
const module = await import('./module.js');
module.doSomething();

// 或者使用Promise语法
import('./module.js').then(module => {
  module.doSomething();
});

条件加载

javascript
// 根据条件动态加载模块
if (user.isAdmin) {
  const adminModule = await import('./admin.js');
  adminModule.init();
}

2. 路由懒加载

Vue Router示例

javascript
// Vue Router 3.x
const routes = [
  {
    path: '/about',
    component: () => import('./views/About.vue')
  },
  {
    path: '/user',
    component: () => import('./views/User.vue')
  }
];

// Vue Router 4.x
const routes = [
  {
    path: '/about',
    component: () => import('./views/About.vue')
  }
];

React Router示例

javascript
import { lazy, Suspense } from 'react';
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';

// 懒加载组件
const About = lazy(() => import('./components/About'));
const User = lazy(() => import('./components/User'));

function App() {
  return (
    <Router>
      <Suspense fallback={<div>Loading...</div>}>
        <Routes>
          <Route path="/about" element={<About />} />
          <Route path="/user" element={<User />} />
        </Routes>
      </Suspense>
    </Router>
  );
}

3. Webpack代码分割配置

动态导入配置

javascript
// webpack.config.js
module.exports = {
  optimization: {
    splitChunks: {
      chunks: 'all',
      cacheGroups: {
        vendor: {
          test: /[\\/]node_modules[\\/]/,
          name: 'vendors',
          chunks: 'all'
        },
        common: {
          minChunks: 2,
          chunks: 'all',
          priority: 5
        }
      }
    }
  }
};

魔法注释

javascript
// 为动态导入的模块命名
const module = await import(
  /* webpackChunkName: "lodash" */ 'lodash'
);

// 预加载
const module = await import(
  /* webpackPreload: true */ './heavy-module.js'
);

// 预获取
const module = await import(
  /* webpackPrefetch: true */ './login-modal.js'
);

4. Vite代码分割配置

Rollup配置

javascript
// vite.config.js
export default {
  build: {
    rollupOptions: {
      output: {
        manualChunks: {
          // 手动分块
          vendor: ['vue', 'vue-router'],
          utils: ['lodash', 'axios'],
          ui: ['element-plus', '@element-plus/icons-vue']
        }
      }
    }
  }
};

5. 实施步骤

  1. 分析应用的路由和功能模块
  2. 识别可以懒加载的组件
  3. 实现路由懒加载
  4. 使用动态导入处理条件加载
  5. 配置构建工具的代码分割策略
  6. 验证优化效果

6. 注意事项

  • 确保懒加载不会影响用户体验
  • 考虑加载状态和错误处理
  • 避免过度分割导致请求数量增加
  • 测试不同网络环境下的加载性能

7. 验证方法

  1. 使用Chrome开发者工具Network面板
  2. 检查代码分割后的文件数量和大小
  3. 对比优化前后的首屏加载时间
  4. 验证功能完整性

通过JS代码分割与动态加载,可以有效减少首屏加载的代码量,提升页面加载性能。