JavaScript 代码分割和按需加载的核心是动态 import() 语法配合打包工具自动分包,减少首屏体积;支持 await/.then、React.lazy+Suspense、chunk 命名与预加载策略,并需注意 SSR 环境兼容性。
JavaScript 中实现代码分割和按需加载模块,核心是利用 动态 import() 语法配合打包工具(如 Webpack、Vite 或 Rollup)的自动分包能力。它让模块不再在初始加载时全部打包进主 bundle,而是运行时才请求并执行所需代码,显著减少首屏体积。
这是现代 JavaScript 的标准语法,返回一个 Promise,支持 await 或 .then() 处理加载结果:
import { func } from './utils.js' 改为 const { func } = await import('./utils.js')
utils.abc123.js)用 React.lazy + Suspense 包裹异步组件,适合页面级拆分:
const Home = React.lazy(() => import('./pages/Home')); > 内渲染 lazy 组件lazy 只支持默认导出;若需命名导出,需在被加载模块中重新 default 导出或用动态 import 手动解构可通过注释提示打包工具优化分包行为:
import(/* webpackChunkName: "chart" */ './charts/BarChart.js') —— 指定 chunk 文件名import(/* webpackPrefetch: true */ './modules/settings.js') —— 空闲时预取(适合可能后续用到的模块)import(/* webpackPreload: true */ './components/Header.js') —— 关键资源预加载(优先级高于 prefetch)Node.js 环境不原生支持动态 import 加载浏览器端 chunk,需适配:
webpack-node-externals 和同构写法,避免服务端尝试加载浏览器专用模块if (typeof window !== 'undefined') { await import('./client-only.js') }