Skip to content

未命名

🕒 Published at:

性能优化

(具体看前端详细点的性能优化)

javascript
代码优化
    尽量减少 data 中的数据data 中的数据都会增加 getter setter会收集对应的 watcher
    v-if v-for 不能连用
    如果需要使用 v-for 给每项元素绑定事件时使用事件代理
    SPA 页面采用 keep-alive 缓存组件
    在更多的情况下使用 v-if 替代 v-show
    key 保证唯一
    requestAnimationFrame处理频繁渲染,避免卡顿
    webWorker 开启单独线程处理时间很长的代码
    
    
SEO 优化
    采用http2代替http1.1 (可管道复用,请求头压缩,响应时额外推送信息)
    预渲染 (使用async/defer script提前加载js)
    服务端渲染 SSR
    使用缓存(客户端缓存服务端缓存)
    使用路由懒加载异步组件
    防抖节流
    第三方模块按需导入
    长列表滚动到可视区域动态加载
    图片懒加载

打包优化
    压缩代码,服务端开启 gzip 压缩等
    Tree Shaking/Scope Hoisting
    使用 cdn 加载第三方模块
    多线程打包 HappyPack开启多线程打包
    splitChunks 抽离公共文件
    sourceMap 优化

用户体验
    骨架屏
    PWA
javascript
//造成首屏缓慢的点分为I/O阻塞,DOM渲染和性能

//I/O阻塞(分为减少包体积,请求优化,资源懒加载)
//减少包体积
    JavaScriptUglifyjsPlugin 
    CSSMiniCssExtractPlugin(提取css为单独文件) OptimizeCSSAssetsPlugin(压缩css)
    HTMLHtmlWebpackPlugin
    gzip开启 gzip 压缩(一种压缩算法,减少传输的资源量)通常开启 gzip 压缩能够有效的缩小传输资源的大小
    压缩图片可以使用 image-webpack-loader在用户肉眼分辨不清的情况下一定程度上压缩图片
    树摇
    使用 svg 图标相对于用一张图片来表示图标svg 拥有更好的图片质量体积更小并且不需要开启额外的 http 请求
    合理使用第三方库对于一些第三方 ui 框架类库尽量使用按需加载减少打包体积
    
//请求优化
    请求优化将第三方的类库放到 CDN能够大幅度减少生产环境中的项目体积另外 CDN 能够实时地根据网络流量和各节点的连接负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上
    缓存将长时间不会改变的第三方类库或者静态资源设置为强缓存 max-age 设置为一        个非常长的时间再将访问路径加上哈希达到哈希值变了以后保证获取到最新资源好的缓存策略有助于减轻服务器的压力并且显著的提升用户的体验    
    http2如果系统首屏同一时间需要加载的静态资源非常多但是浏览器对同域名的 tcp 连接数量是有限制的(chrome 6)超过规定数量的 tcp 连接则必须要等到之前的请求收到响应后才能继续发送 http2 则可以在多个 tcp 连接中并发多个请求没有限制在一些网络较差的环境开启 http2 性能提升尤为明显
    
//资源懒加载
懒加载 url 匹配到相应的路径时通过 import 动态加载页面组件这样首屏的代码量会大幅减少webpack 会把动态加载的页面组件分离成单独的一个 chunk.js 文件
    图片懒加载使用图片懒加载可以优化同一时间减少 http 请求开销避免显示图片导致的画面抖动提高用户体验

//DOM渲染
    虚拟列表,图片懒加载等各种懒加载

//代码性能优化
    预渲染由于浏览器在渲染出页面之前需要先加载和解析相应的 htmlcss js 文件为此会有一段白屏的时间可以添加loading或者骨架屏幕尽可能的减少白屏对用户的影响体积优化
    使用可视化工具分析打包后的模块体积webpack-bundle- analyzer 这个插件在每次打包后能够更加直观的分析打包后模块的体积再对其中比较大的模块进行优化
    提高代码使用率利用代码分割将脚本中无需立即调用的代码在代码构建时转变为异步加载的过程
    封装构建良好的项目架构按照项目需求就行全局组件插件过滤器指令utils 等做一 些公共封装可以有效减少我们的代码量而且更容易维护资源优化

Webpack 性能优化模块与代码示例

优化方法代码示例作用描述
多线程打包javascript const TerserPlugin = require('terser-webpack-plugin'); module.exports = { optimization: { minimizer: [ new TerserPlugin({ parallel: true, // 开启多线程 }), ], }, }; 利用多核 CPU 并行处理任务,加快代码压缩和打包速度。
代码分割javascript module.exports = { optimization: { splitChunks: { chunks: 'all', }, }, }; 将代码拆分为多个 chunk,按需加载,减少初始加载时间。
Tree Shakingjavascript module.exports = { mode: 'production', optimization: { usedExports: true, }, }; 移除未使用的代码,减少打包体积。
缓存javascript module.exports = { cache: { type: 'filesystem', }, }; 缓存构建结果,避免重复构建,提升二次构建速度。
懒加载javascript const LazyComponent = () => import('./LazyComponent'); 延迟加载非核心模块,减少初始加载时间。
压缩代码javascript const TerserPlugin = require('terser-webpack-plugin'); module.exports = { optimization: { minimize: true, minimizer: [new TerserPlugin()], }, }; 压缩 JavaScript 代码,减少文件体积。
图片压缩javascript const ImageMinimizerPlugin = require('image-minimizer-webpack-plugin'); module.exports = { plugins: [ new ImageMinimizerPlugin({ minimizer: { implementation: ImageMinimizerPlugin.imageminMinify, options: { plugins: ['imagemin-optipng'], }, }, }), ], }; 压缩图片资源,减少文件体积。
预加载与预获取javascript import(/* webpackPreload: true */ './PreloadModule'); import(/* webpackPrefetch: true */ './PrefetchModule'); 提前加载或获取资源,优化用户体验。
模块热替换 (HMR)javascript module.exports = { devServer: { hot: true, }, }; 在开发环境下,实现模块热替换,提升开发效率。
外部扩展 (Externals)javascript module.exports = { externals: { lodash: '_', }, }; 将第三方库从打包中排除,通过外部引入,减少打包体积。

组件发布流程

  1. 为组件指定入口文件:在每个包下的 package. Json 文件中添加 main (require 命令的入口) 和 module (import 命令的入口) 属性,指定组件的入口文件。
  2. 设置环境变量:利用工具(如 cross-env)设置环境变量,区分开发环境和生产环境。
  3. 添加打包配置文件:在项目的根目录下添加构建配置文件(如 rollup. Config. Js),配置构建和打包的相关参数。
  4. Npm config set registry=私库地址/
  5. 开发组件
  6. Npm publish npm 会根据 package. Json 文件中的 files 字段来决定哪些文件应该被包含在发布的包中。如果 files 字段不存在,npm 会默认包含除了被 .npmignore.gitignore 文件排除之外的所有文件。