《性能优化》在vue、react中异步加载javascript文件

export function loadScript(
	url: string,
	options?: {
		cors: boolean;
		id: string;
	}
) {
	const id = options ? options.id : undefined;
	const cors = options ? options.cors : undefined;
	return new Promise((resolve, reject) => {
		const script = document.createElement("script");
		script.type = "text/javascript";
		script.async = false;
		cors && (script.crossOrigin = "anonymous");
		id && (script.id = id);
		script.src = url;
		document.head.appendChild(script);
		script.onload = resolve;
		script.onerror = reject;
	}).catch((err) => console.error(`加载 ${url} 失败`, err));
}
loadScript("https://example.com/script.js", { id: "myScript", cors: true })
	.then(() => console.log("Script loaded successfully"))
	.catch(() => console.log("Script failed to load"));

在庞大的项目中基本会有量大但是不使用无需加载的JS代码。使用异步加载,不仅可以提升页面加载速度,还能降低主包的大小

例:echart

<think>我们正在讨论前端性能优化,特别是针对ReactVue和Webpack的优化实践。根据引用内容,我们可以总结出以下几点: 1. Webpack是重要的构建工具,优化其构建性能对开发部署效率至关重要[^1]。 2. VueReact都是流行的前端框架,各自有不同的优化策略。 3. 性能优化需要全面知识,养成良好编码习惯比后期优化更实在[^5]。 现在,我将分别从ReactVue和Webpack三个方面介绍优化实践,并给出具体示例。 ### React性能优化实践 #### 1. 组件渲染优化 - **React.memo()**:用于避免不必要的重新渲染,仅当props改变时重新渲染[^3]。 ```jsx const MyComponent = React.memo(function MyComponent(props) { /* 使用props渲染 */ }); ``` - **useMemo()**:缓存计算结果,避免重复计算[^3]。 ```jsx const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]); ``` - **useCallback()**:缓存函数引用,避免子组件因函数引用变化而重新渲染。 ```jsx const memoizedCallback = useCallback(() => { doSomething(a, b); }, [a, b]); ``` #### 2. 虚拟DOM优化 - 避免在渲染函数中执行复杂操作。 - 使用key属性帮助React识别元素变化,提高列表渲染效率。 #### 3. 代码分割 - 使用`React.lazy`和`Suspense`实现按需加载。 ```jsx const OtherComponent = React.lazy(() => import('./OtherComponent')); function MyComponent() { return ( <Suspense fallback={<div>Loading...</div>}> <OtherComponent /> </Suspense> ); } ``` ### Vue性能优化实践 #### 1. 组件优化 - **v-once指令**:用于静态内容,只渲染一次。 ```vue <div v-once>{{ staticContent }}</div> ``` - **computed属性**:缓存计算值,避免重复计算。 ```vue computed: { fullName() { return this.firstName + ' ' + this.lastName; } } ``` #### 2. 虚拟DOM优化 - 使用`key`属性提高列表渲染效率。 - 避免在模板中使用复杂表达式。 #### 3. 异步组件 - 使用动态导入实现代码分割。 ```vue const AsyncComponent = () => ({ component: import('./MyComponent.vue'), loading: LoadingComponent, error: ErrorComponent, delay: 200, timeout: 3000 }); ``` ### Webpack性能优化实践 #### 1. 构建速度优化 - **缓存**:使用`cache-loader`或`hard-source-webpack-plugin`缓存中间结果。 - **多线程/并行处理**:使用`thread-loader`或`parallel-webpack`。 - **减少搜索范围**: ```js module.exports = { resolve: { modules: ['node_modules'], extensions: ['.js', '.json'], mainFields: ['main'], }, }; ``` #### 2. 输出文件优化 - **代码分割**: ```js module.exports = { optimization: { splitChunks: { chunks: 'all', }, }, }; ``` - **Tree Shaking**:移除未引用代码,需配合ES6模块语法(import/export)。 - **Scope Hoisting**:合并模块,减少闭包数量。 ```js module.exports = { optimization: { concatenateModules: true, }, }; ``` #### 3. 资源压缩 - **TerserPlugin**:压缩JavaScript。 - **CssMinimizerPlugin**:压缩CSS。 - **ImageMinimizerPlugin**:压缩图片。 ### 通用优化建议 1. **懒加载**:对图片、组件等资源使用懒加载。 2. **CDN加速**:使用CDN分发静态资源。 3. **浏览器缓存**:合理设置HTTP缓存头。 4. **服务端渲染(SSR)**:提高首屏加载速度,React有Next.jsVue有Nuxt.js。 ### 性能监控 - 使用Lighthouse、WebPageTest等工具进行性能评估。 - 使用Chrome DevTools的Performance面板分析运行时性能。 ### 优化效果评估 | 优化策略 | 预期效果 | 实现难度 | |------------------|----------------------------|----------| | 代码分割 | 减少首屏加载资源量 | ★★☆☆☆ | | Tree Shaking | 减少最终打包体积 | ★★☆☆☆ | | 组件懒加载 | 提高首屏加载速度 | ★★★☆☆ | | SSR | 提高首屏渲染速度,改善SEO | ★★★★☆ | | Webpack构建优化 | 缩短开发/构建时间 | ★★★☆☆ | ### 总结 性能优化是一个系统工程,需要从多个层面进行: 1. **框架层面**:合理使用ReactVue提供的优化API 2. **构建层面**:通过Webpack优化打包质量和速度 3. **网络层面**:利用缓存、CDN、懒加载等减少资源传输量 4. **运行时层面**:避免阻塞主线程的操作,合理使用Web Worker > 性能优化不是一蹴而就的,需要在开发过程中持续关注和实践[^5]。 --- ### 相关问题 1. 如何量化前端性能优化的效果? 2. React中useMemo和useCallback的具体应用场景有何区别? 3. Vue3的Composition API在性能优化方面有哪些改进? 4. Webpack5的新特性对构建性能有哪些提升? 5. 如何在前端项目中实现自动化性能监控?</think>### 前端性能优化ReactVue 和 Webpack 最佳实践 #### **一、React 性能优化** 1. **组件渲染优化** - `React.memo()`:避免不必要的重渲染(仅比较 props)[^3] ```jsx const MemoizedComponent = React.memo(MyComponent); ``` - `useMemo()`:缓存复杂计算(依赖项变化时重新计算)[^3] ```jsx const sortedList = useMemo(() => hugeList.sort((a, b) => a.id - b.id), [hugeList]); ``` - `useCallback()`:防止函数引用变化导致的子组件重渲染 ```jsx const handleClick = useCallback(() => { /*...*/ }, [deps]); ``` 2. **虚拟 DOM 优化** - 避免在渲染中使用 `index` 作为 `key` - 使用 `React.lazy` + `Suspense` 实现代码分割 ```jsx const LazyComponent = React.lazy(() => import('./HeavyComponent')); ``` 3. **状态管理优化** - 使用 Redux 时选择器函数配合 `reselect` 库 - Context API 分割高频/低频更新数据 --- #### **二、Vue 性能优化** 1. **响应式系统优化** - 冻结大型列表:`Object.freeze(largeList)` - 扁平化数据结构减少侦听层级 - 使用 `v-once` 标记静态内容 ```vue <div v-once>{{ staticContent }}</div> ``` 2. **组件级优化** - 异步组件 + `defineAsyncComponent`(Vue 3) ```js const AsyncComp = defineAsyncComponent(() => import('./HeavyComponent.vue') ); ``` - 计算属性缓存:优先用 `computed` 替代方法调用 ```js computed: { sortedList() { return [...this.list].sort() } } ``` 3. **渲染优化** - 虚拟滚动:`vue-virtual-scroller` 处理长列表 - 避免 `v-for` 和 `v-if` 同时使用(优先级问题) --- #### **三、Webpack 构建优化** 1. **构建速度优化** - 缓存:`cache-loader` 或 `hard-source-webpack-plugin`[^1] - 多线程:`thread-loader` 并行处理 - 限制搜索范围: ```js resolve: { modules: ['node_modules'], extensions: ['.js', '.vue'], } ``` 2. **输出体积优化** - Tree Shaking:ES6 模块 + `sideEffects` 标记 - 代码分割: ```js optimization: { splitChunks: { chunks: 'all' } } ``` - 压缩:`TerserPlugin`(JS) + `CssMinimizerPlugin`(CSS) 3. **资源优化** - 图片压缩:`image-webpack-loader` - 字体子集化:`fontmin-webpack` - 按需加载:`@babel/plugin-transform-runtime` 减少 polyfill 体积 --- #### **四、通用优化策略** 1. **网络传输优化** - HTTP/2 多路复用 + 服务端推送 - Brotli 压缩(比 Gzip 小 20%) - CDN 分发静态资源 2. **运行时性能** - 虚拟滚动(`react-window`/`vue-virtual-scroller`) - Web Workers 处理 CPU 密集型任务 - 骨架屏(Skeleton Screen)提升感知性能 3. **监控与分析** - Lighthouse + Web Vitals 指标监控 - Source Map 分析包体积:`webpack-bundle-analyzer` - 性能追踪:Chrome DevTools Performance 面板 --- ### 优化效果对比 | 优化类型 | React 方案 | Vue 方案 | Webpack 方案 | |------------------|----------------------------|----------------------------|----------------------------| | **减少重渲染** | `React.memo()` + `useMemo` | `v-once` + 计算属性 | 不适用 | | **代码分割** | `React.lazy` + `Suspense` | `defineAsyncComponent` | `splitChunks` | | **构建加速** | 不适用 | 不适用 | `cache-loader` + 多线程 | | **输出体积** | 组件级按需加载 | 组合式 API 按需导入 | Tree Shaking + 压缩 | > 性能优化需要结合具体场景,良好的编码习惯(如避免内联函数、合理状态管理)比后期优化更有效[^5]。 --- ### 相关问题 1. React 中 `useMemo` 和 `useCallback` 的最佳实践场景是什么? 2. Vue 3 的 Composition API 如何提升性能优化空间? 3. Webpack 5 的持久化缓存机制如何配置? 4. 如何量化性能优化前后的具体收益? 5. 微前端架构下如何实现跨应用的性能优化? [^1]: Webpack 优化构建性能对开发部署效率至关重要 [^2]: Vue 的渐进式特性利于模块化优化 [^3]: React.memo 和 useMemo 的优化场景区别 [^5]: 性能优化需养成良好编码习惯
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值