贝利信息

javascript如何实现惰性加载_它如何提升单页面应用的性能?

日期:2026-01-09 00:00 / 作者:夢幻星辰
import() 是 JavaScript 动态导入语法,用于运行时按需加载模块,返回 Promise,支持条件判断、变量路径和任意作用域调用,区别于顶层静态 import。

什么是 import() 动态导入?

JavaScript 的 import() 是一个函数式语法,用于在运行时按需加载模块,而不是在模块初始化时就全部加载。它返回一个 Promise,这意味着你可以用 await.then() 处理加载完成后的逻辑。

它和静态 import 语句有本质区别:静态导入必须写在顶层、不能加条件;而 import() 可以出现在任意作用域,支持变量拼接路径、条件判断、循环调用等。

怎么在 React 路由中用 React.lazy + Suspense 实现路由级懒加载?

React.lazy 是对 import() 的封装,专为组件懒加载设计;Suspense 则负责处理加载中的 UI 状态。两者必须配合使用,且 Suspense 必须包裹其子组件(不能包裹 lazy 组件本身)。

const Home = React.lazy(() => import('./pages/Home'));
const About = React.lazy(() => import('./pages/About'));

function App() { return ( } /> ); }

为什么不用 require.ensureSystem.import

这两个都是 Webpack 早期的私有 API,已废弃多年。require.ensure 是 Webpack 1–2 的产物,System.import 曾短暂作为提案,但被标准 import() 取代。现代打包工具(Vite/Webpack 5+)只识别 import() 并自动切分 chunk。

懒加载不是万能的——哪些情况反而会拖慢首屏?

过度拆分或错误触发时机,会让懒加载从优化变成负优化。关键看资源是否「真·非首屏必需」。

真正影响性能的,往往不是“有没有懒加载”,而是“什么时候加载”和“加载了什么”。比如一个 50KB 的工具函数被拆进每个路由 chunk,不如统一放 vendor;而一个 300KB 的图表库,只在特定页面用,就值得单独拆。