普通视图

发现新文章,点击刷新页面。
昨天以前首页

我的Vue项目胖成球了!用Webpack给它狠狠瘦个身

2025年10月31日 10:27

前几天我正准备下班,运维同事一个电话打过来:"小杨,你们前端打包后的文件怎么都快100M了?服务器都快被撑爆了!" 我老脸一红,赶紧打开那个久未关注的 dist 目录——好家伙,一个个chunk文件胖得跟球一样。

这不行,必须得给它瘦身!作为一名和Webpack打交道多年的"健身教练",我决定对我的Vue项目来一次彻底的"减肥计划"。下面就是我用的"减肥食谱"和"健身流程",亲测有效,打包体积直接从"庞然大物"变"苗条少女"。

第一步:诊断与分析(先上秤)

减肥前,得先知道胖在哪。我用了 webpack-bundle-analyzer 这个神器来给项目做"体测"。

// 安装:npm install --save-dev webpack-bundle-analyzer

// 在 vue.config.js 中配置
const { defineConfig } = require('@vue/cli-service')
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;

module.exports = defineConfig({
  transpileDependencies: true,
  configureWebpack: {
    plugins: [
      // 打包后自动打开分析报告页面
      new BundleAnalyzerPlugin({
        analyzerMode: 'server',
        openAnalyzer: true,
      })
    ]
  }
})

运行 npm run build 后,一个直观的图表页面就打开了。一眼我就发现了问题:某个第三方库 xxx-ui 和 moment.js 占了大头!心里立刻有了数。

第二步:核心"瘦身"手段(开始减肥)

1. 针对第三方库的"抽脂手术" - 配置 externals

我发现 xxx-ui 这个库又大又常用,但完全可以通过CDN引入。这招叫 externals,能把它从打包结果里"抽"出去。

// vue.config.js
module.exports = defineConfig({
  configureWebpack: {
    externals: {
      // key: 模块名, value: 全局变量名
      'xxx-ui': 'XUI' // 告诉Webpack:遇到import 'xxx-ui'时,别打包,去窗口找XUI这个全局变量
    },
    // ... 其他配置
  }
})

然后在 public/index.html 中通过 <script> 标签引入CDN链接。这样,这个库就不会占用我们的打包体积了。

2. 精准的"膳食管理" - 按需引入(Babel插件)

很多UI库,像 Element-Plus,支持按需引入。我只用到了Button和Input,那就只打包这两个,绝不把整个厨房都搬来。

// 对于支持按需引入的库,我通常会这样配置
// 首先安装 babel-plugin-import
module.exports = defineConfig({
  chainWebpack: (config) => {
    config.plugin('babel-plugin-import').use(require('babel-plugin-import'), [{
      libraryName: 'element-plus',
      customStyleName: (name) => {
        return `element-plus/theme-chalk/${name}.css`;
      },
    }]);
  }
})

这样,我在代码里 import { ElButton } from 'element-plus' 时,Webpack就会很聪明地只处理Button相关的代码。

3. 神奇的"代餐奶昔" - 替换臃肿库

分析报告显示 moment.js 这个时间库体积很大,我果断用 day.js 这个"代餐"替换了它。功能几乎一样,但体积小了太多!

npm uninstall moment
npm install dayjs

然后在项目里全局替换一下引用,几乎是无痛切换,但打包体积立竿见影地小了一圈。

4. 终极"塑形" - 代码分割与压缩

最后,再用Webpack的"塑形仪"来雕琢一下线条,也就是代码分割和压缩。

module.exports = defineConfig({
  configureWebpack: {
    optimization: {
      splitChunks: {
        chunks: 'all',
        cacheGroups: {
          vendor: {
            test: /[\/]node_modules[\/]/,
            name: 'chunk-vendors',
            priority: 10,
            reuseExistingChunk: true,
          },
          common: {
            name: 'chunk-common',
            minChunks: 2,
            priority: 5,
            reuseExistingChunk: true,
          },
        },
      },
    },
  },
})

这个配置能把第三方库、公共代码自动拆分成独立的chunk,利用浏览器并行加载,用户体验更快。

成果展示

经过这一套"组合拳"下来,我再次运行打包命令。好家伙,打包体积从近百M直接降到了十几M,运维同事都跑来问我用了什么黑科技。

其实哪有什么黑科技,无非就是找准问题、对症下药。Webpack给了我们非常强大的优化工具,关键在于我们是否愿意花时间去分析和配置。

希望我的这次"项目减肥"经历能给你一些启发。如果你的Vue项目也"胖"了,不妨也用这些方法试试看?如果你有更好的"瘦身"秘籍,也欢迎在评论区分享出来,我们一起交流学习!

⭐  写在最后

请大家不吝赐教,在下方评论或者私信我,十分感谢🙏🙏🙏.

✅ 认为我某个部分的设计过于繁琐,有更加简单或者更高逼格的封装方式

✅ 认为我部分代码过于老旧,可以提供新的API或最新语法

✅ 对于文章中部分内容不理解

✅ 解答我文章中一些疑问

✅ 认为某些交互,功能需要优化,发现BUG

✅ 想要添加新功能,对于整体的设计,外观有更好的建议

✅ 一起探讨技术加qq交流群:906392632

最后感谢各位的耐心观看,既然都到这了,点个 👍赞再走吧!

Webpack配置魔法书:从入门到高手的通关秘籍

2025年10月30日 08:41

朋友们,我是小杨!今天咱们来聊聊Webpack配置这个话题。很多人第一次看到webpack.config.js文件时,感觉就像在看天书一样。别担心,今天我就带你从零开始,一步步解锁Webpack配置的奥秘!

初识Webpack:先来个"Hello World"

让我们从一个最简单的配置开始,就像学编程先写Hello World一样:

// 我的第一个webpack配置
const path = require('path');

module.exports = {
  // 入口:告诉Webpack从哪开始打包
  entry: './src/index.js',
  
  // 输出:打包后的文件放哪里
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'bundle.js'
  },
  
  // 模式:开发还是生产
  mode: 'development'
};

这个基础配置就像搭积木的第一步,虽然简单,但已经能完成基本的打包任务了!

核心配置详解:拆解Webpack的"五脏六腑"

1. Entry(入口):打包的起点

// 单入口(SPA应用)
entry: './src/index.js'

// 多入口(多页面应用)
entry: {
  home: './src/home.js',
  about: './src/about.js',
  contact: './src/contact.js'
}

// 动态入口
entry: () => new Promise((resolve) => {
  resolve('./src/dynamic-entry.js');
})

2. Output(输出):打包成果的归宿

output: {
  path: path.resolve(__dirname, 'dist'),
  // 使用占位符确保文件名唯一
  filename: '[name].[contenthash].js',
  // 清理输出目录
  clean: true,
  // 公共路径(CDN场景很有用)
  publicPath: 'https://cdn.example.com/'
}

3. Loader:文件转换的"翻译官"

Loader是Webpack最强大的功能之一,让我展示几个常用配置:

module: {
  rules: [
    // 处理CSS文件
    {
      test: /.css$/i,
      use: ['style-loader', 'css-loader']
    },
    
    // 处理SCSS文件
    {
      test: /.scss$/i,
      use: [
        'style-loader',
        'css-loader',
        'sass-loader'
      ]
    },
    
    // 处理图片
    {
      test: /.(png|jpg|jpeg|gif|svg)$/i,
      type: 'asset/resource',
      generator: {
        filename: 'images/[name].[hash][ext]'
      }
    },
    
    // 处理字体
    {
      test: /.(woff|woff2|eot|ttf|otf)$/i,
      type: 'asset/resource',
      generator: {
        filename: 'fonts/[name].[hash][ext]'
      }
    },
    
    // Babel转译JS
    {
      test: /.js$/,
      exclude: /node_modules/,
      use: {
        loader: 'babel-loader',
        options: {
          presets: ['@babel/preset-env']
        }
      }
    }
  ]
}

4. Plugins:增强功能的"外挂"

插件让Webpack变得更强大,来看我的常用插件组合:

const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');

plugins: [
  // 自动生成HTML文件
  new HtmlWebpackPlugin({
    template: './src/index.html',
    title: '我的应用',
    minify: true
  }),
  
  // 提取CSS到单独文件
  new MiniCssExtractPlugin({
    filename: '[name].[contenthash].css'
  }),
  
  // 清理输出目录
  new CleanWebpackPlugin(),
  
  // 定义环境变量
  new webpack.DefinePlugin({
    'process.env.NODE_ENV': JSON.stringify('production')
  })
]

实战配置:搭建完整的开发环境

让我分享一个我在实际项目中使用的完整配置:

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');

module.exports = (env, argv) => {
  const isProduction = argv.mode === 'production';
  
  return {
    entry: {
      main: './src/index.js',
      vendor: './src/vendor.js'
    },
    
    output: {
      path: path.resolve(__dirname, 'dist'),
      filename: isProduction 
        ? '[name].[contenthash].js' 
        : '[name].js',
      publicPath: '/'
    },
    
    module: {
      rules: [
        {
          test: /.js$/,
          exclude: /node_modules/,
          use: 'babel-loader'
        },
        {
          test: /.css$/,
          use: [
            isProduction 
              ? MiniCssExtractPlugin.loader 
              : 'style-loader',
            'css-loader',
            'postcss-loader'
          ]
        },
        {
          test: /.(png|jpg|gif)$/,
          type: 'asset/resource'
        }
      ]
    },
    
    plugins: [
      new HtmlWebpackPlugin({
        template: './src/index.html',
        inject: true
      }),
      ...(isProduction 
        ? [new MiniCssExtractPlugin({
            filename: '[name].[contenthash].css'
          })]
        : []
      )
    ],
    
    optimization: {
      splitChunks: {
        chunks: 'all',
        cacheGroups: {
          vendor: {
            test: /[\/]node_modules[\/]/,
            name: 'vendors',
            priority: 10
          }
        }
      }
    },
    
    devServer: {
      static: './dist',
      hot: true,
      open: true,
      port: 3000
    },
    
    devtool: isProduction ? 'source-map' : 'eval-cheap-module-source-map'
  };
};

环境特定配置:开发vs生产

开发环境配置要点

// webpack.dev.js
module.exports = {
  mode: 'development',
  devtool: 'eval-source-map',
  devServer: {
    static: './dist',
    hot: true,
    open: true,
    historyApiFallback: true
  },
  module: {
    rules: [
      {
        test: /.css$/,
        use: ['style-loader', 'css-loader']
      }
    ]
  }
};

生产环境配置要点

// webpack.prod.js
const TerserPlugin = require('terser-webpack-plugin');
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');

module.exports = {
  mode: 'production',
  devtool: 'source-map',
  optimization: {
    minimize: true,
    minimizer: [
      new TerserPlugin(),
      new CssMinimizerPlugin()
    ],
    splitChunks: {
      chunks: 'all'
    }
  },
  module: {
    rules: [
      {
        test: /.css$/,
        use: [MiniCssExtractPlugin.loader, 'css-loader']
      }
    ]
  },
  plugins: [
    new MiniCssExtractPlugin()
  ]
};

高级配置技巧:我的独门秘籍

1. 动态配置

module.exports = (env, argv) => {
  const isProduction = argv.mode === 'production';
  const isAnalyze = env && env.analyze;
  
  const config = {
    // 基础配置...
  };
  
  if (isAnalyze) {
    const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
    config.plugins.push(new BundleAnalyzerPlugin());
  }
  
  return config;
};

2. 多目标构建

// 同时构建多个配置
module.exports = [
  {
    name: 'client',
    target: 'web',
    entry: './src/client.js',
    output: {
      filename: 'client.bundle.js'
    }
  },
  {
    name: 'server',
    target: 'node',
    entry: './src/server.js',
    output: {
      filename: 'server.bundle.js'
    }
  }
];

常见问题排查:我踩过的那些坑

问题1:文件找不到?
检查路径配置,记得用path.resolve

问题2:Loader不生效?
检查test正则和use数组顺序

问题3:打包文件太大?
合理配置splitChunks和压缩选项

问题4:热更新不工作?
检查devServer配置和HotModuleReplacementPlugin

性能优化配置

optimization: {
  // 代码分割
  splitChunks: {
    chunks: 'all',
    cacheGroups: {
      // 第三方库单独打包
      vendor: {
        test: /[\/]node_modules[\/]/,
        name: 'vendors',
        priority: 20
      },
      // 公共代码单独打包
      common: {
        name: 'common',
        minChunks: 2,
        priority: 10,
        reuseExistingChunk: true
      }
    }
  },
  // 运行时代码单独提取
  runtimeChunk: {
    name: 'runtime'
  }
}

总结

Webpack配置就像搭积木,从简单开始,逐步添加需要的功能。记住几个关键点:

  1. 理解核心概念:Entry、Output、Loader、Plugin
  2. 区分环境:开发环境要快,生产环境要小
  3. 渐进式配置:从简单开始,按需添加功能
  4. 善用优化:代码分割、压缩、缓存一个都不能少

配置Webpack不是一蹴而就的,需要在实际项目中不断实践和调整。希望这篇指南能帮你少走弯路,快速掌握Webpack配置的精髓!

⭐  写在最后

请大家不吝赐教,在下方评论或者私信我,十分感谢🙏🙏🙏.

✅ 认为我某个部分的设计过于繁琐,有更加简单或者更高逼格的封装方式

✅ 认为我部分代码过于老旧,可以提供新的API或最新语法

✅ 对于文章中部分内容不理解

✅ 解答我文章中一些疑问

✅ 认为某些交互,功能需要优化,发现BUG

✅ 想要添加新功能,对于整体的设计,外观有更好的建议

✅ 一起探讨技术加qq交流群:906392632

最后感谢各位的耐心观看,既然都到这了,点个 👍赞再走吧!

webpack了解吗,讲一讲原理,怎么压缩代码

2025年10月30日 08:36

大家好,我是小杨!今天我要带大家探索前端工程化的核心魔法——Webpack。很多人觉得Webpack很复杂,但其实掌握了它的原理,你就会发现它就像个智能的"代码料理机",能把各种原料加工成美味佳肴!

Webpack的核心概念:先认识这些"厨房工具"

想象一下,Webpack就是一个现代化的智能厨房:

// 这是我的webpack.config.js - 相当于"菜谱"
module.exports = {
  // 入口起点 - 告诉厨房从哪开始准备食材
  entry: './src/index.js',
  
  // 输出 - 成品要放在哪里
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'bundle.js'
  },
  
  // 加载器 - 各种食材处理工具
  module: {
    rules: [
      {
        test: /.css$/,        // 遇到CSS食材
        use: ['style-loader', 'css-loader']  // 用这两个工具处理
      },
      {
        test: /.(png|jpg)$/,  // 遇到图片食材
        use: ['file-loader']   // 用文件处理工具
      }
    ]
  },
  
  // 插件 - 高级厨房设备
  plugins: [
    new HtmlWebpackPlugin({
      template: './src/index.html'
    })
  ]
};

Webpack的工作原理:看看"厨房"是怎么运作的

让我用最通俗的方式解释Webpack的工作流程:

第一步:依赖收集(找食材)
Webpack从入口文件开始,像侦探一样找出所有的import和require语句,建立完整的依赖关系图。

// 假设这是我的项目结构
// src/
//   index.js (入口)
//   utils.js  
//   styles.css

// index.js
import { calculateTotal } from './utils.js';
import './styles.css';

const result = calculateTotal(100, 20);
console.log('总价:', result);

// utils.js
export function calculateTotal(price, tax) {
  return price + (price * tax);
}

第二步:模块转换(处理食材)
通过loader系统,把不同类型的文件都转换成JavaScript能理解的模块。

// 比如CSS文件,经过css-loader和style-loader处理
// 原始的styles.css
.body { color: red; }

// 被转换成JavaScript模块
const styles = ".body { color: red; }";
// 然后通过style-loader注入到页面

第三步:代码生成(装盘上菜)
把所有模块组合成一个或多个bundle文件。

代码压缩的魔法:让文件瘦身的秘密武器

说到代码压缩,这可是Webpack的拿手好戏!让我展示几种常见的压缩方式:

1. JavaScript压缩

// 压缩前的代码
function calculatePrice(originalPrice, discountRate) {
    const discountAmount = originalPrice * discountRate;
    const finalPrice = originalPrice - discountAmount;
    return finalPrice;
}

const result = calculatePrice(100, 0.2);
console.log("最终价格是:", result);

// 经过TerserWebpackPlugin压缩后
function n(n,r){return n-n*r}console.log("最终价格是:",n(100,.2));

在webpack中配置:

const TerserPlugin = require('terser-webpack-plugin');

module.exports = {
  optimization: {
    minimize: true,
    minimizer: [new TerserPlugin({
      terserOptions: {
        compress: {
          drop_console: true, // 移除console.log
          pure_funcs: ['console.log'] // 移除特定的函数调用
        }
      }
    })]
  }
};

2. CSS压缩

// 压缩前
.container {
    margin: 10px 20px 10px 20px;
    padding: 15px;
    background-color: #ff0000;
}

.title {
    font-size: 16px;
    font-weight: bold;
}

// 压缩后
.container{margin:10px 20px;padding:15px;background-color:red}.title{font-size:16px;font-weight:700}

配置方法:

const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');

module.exports = {
  optimization: {
    minimizer: [
      new CssMinimizerPlugin(),
    ],
  },
};

3. 图片压缩

module.exports = {
  module: {
    rules: [
      {
        test: /.(png|jpg|jpeg|gif)$/i,
        use: [
          {
            loader: 'image-webpack-loader',
            options: {
              mozjpeg: {
                progressive: true,
                quality: 65
              },
              optipng: {
                enabled: true,
              },
              pngquant: {
                quality: [0.65, 0.90],
                speed: 4
              }
            }
          }
        ]
      }
    ]
  }
};

高级优化技巧:我的实战经验分享

1. 代码分割

module.exports = {
  optimization: {
    splitChunks: {
      chunks: 'all',
      cacheGroups: {
        vendor: {
          test: /[\/]node_modules[\/]/,
          name: 'vendors',
          chunks: 'all',
        },
        common: {
          name: 'common',
          minChunks: 2,
          chunks: 'all',
          minSize: 0
        }
      }
    }
  }
};

2. Tree Shaking

// utils.js - 原始代码
export function usedFunction() {
  return '这个函数会被使用';
}

export function unusedFunction() {
  return '这个函数不会被使用,会被tree shaking掉';
}

// index.js - 只导入usedFunction
import { usedFunction } from './utils';

// 打包后,unusedFunction会被自动移除

实战案例:看我如何优化一个真实项目

让我分享一个真实的优化经历:

// 优化前的配置
module.exports = {
  entry: './src/index.js',
  output: {
    filename: 'bundle.js'
  }
};

// 优化后的配置
module.exports = {
  entry: {
    main: './src/index.js',
    admin: './src/admin.js'
  },
  output: {
    filename: '[name].[contenthash].js',
    path: path.resolve(__dirname, 'dist'),
    clean: true
  },
  optimization: {
    splitChunks: {
      chunks: 'all',
      cacheGroups: {
        vendor: {
          test: /[\/]node_modules[\/]/,
          name: 'vendors',
          priority: 10
        }
      }
    },
    usedExports: true,
    minimize: true
  },
  plugins: [
    new MiniCssExtractPlugin({
      filename: '[name].[contenthash].css'
    }),
    new CompressionPlugin({
      algorithm: 'gzip'
    })
  ]
};

优化效果:

  • 文件大小减少60%
  • 加载速度提升40%
  • 缓存命中率大幅提高

常见坑点和解决方案

坑1:Tree Shaking不生效
检查:package.json中要有"sideEffects": false

坑2:压缩后代码报错
可能是ES6+语法问题,确保terser配置正确

坑3:文件太大
合理使用代码分割和动态导入

总结

Webpack就像前端开发的"瑞士军刀",掌握它的原理和优化技巧,能让你在性能优化的道路上如鱼得水。记住:好的打包策略不是一蹴而就的,需要根据项目特点不断调整优化

希望这篇分享能帮你更好地理解Webpack!如果有任何问题,欢迎在评论区交流~

⭐  写在最后

请大家不吝赐教,在下方评论或者私信我,十分感谢🙏🙏🙏.

✅ 认为我某个部分的设计过于繁琐,有更加简单或者更高逼格的封装方式

✅ 认为我部分代码过于老旧,可以提供新的API或最新语法

✅ 对于文章中部分内容不理解

✅ 解答我文章中一些疑问

✅ 认为某些交互,功能需要优化,发现BUG

✅ 想要添加新功能,对于整体的设计,外观有更好的建议

✅ 一起探讨技术加qq交流群:906392632

最后感谢各位的耐心观看,既然都到这了,点个 👍赞再走吧!

玩转小程序生命周期:从入门到上瘾

2025年10月30日 08:30

作为前端老司机,我经常被问到:“小杨,小程序的生命周期到底怎么玩?”今天我就用最接地气的方式,带你解锁小程序生命周期的正确打开方式。准备好,我们要发车了!

先来认识下小程序的生命周期家族

想象一下,你的小程序就像一个有生命的个体,从诞生到离开,每个阶段都有专属的“人生时刻”。让我用一个简单的Page示例来演示:

// 我的第一个小程序页面
Page({
  data: {
    userInfo: {},
    isLoading: true
  },
  
  // 生命周期函数们要登场啦!
  onLoad(options) {
    console.log('页面加载啦!');
    // 我在这里初始化数据
    this.fetchUserData();
  },
  
  onShow() {
    console.log('页面显示啦!');
    // 每次进入页面都会执行
    this.updateBadgeCount();
  },
  
  onReady() {
    console.log('页面准备就绪!');
    // 页面渲染完成,可以操作DOM了
    this.initCanvas();
  },
  
  onHide() {
    console.log('页面隐藏了');
    // 页面被收起时清理一些资源
    this.clearTimer();
  },
  
  onUnload() {
    console.log('页面被卸载了');
    // 页面被关闭时彻底清理
    this.cleanup();
  }
})

全局生命周期:小程序的“大脑”

App级别的生命周期就像是整个小程序的大脑,掌控着全局的生死轮回:

App({
  onLaunch(options) {
    // 小程序启动时的初始化
    console.log('小程序诞生了!');
    this.initCloudService();
  },
  
  onShow(options) {
    // 小程序切换到前台
    console.log('小程序被唤醒了');
    this.syncData();
  },
  
  onHide() {
    // 小程序被切换到后台
    console.log('小程序去休息了');
    this.saveState();
  },
  
  onError(msg) {
    // 出错时的处理
    console.error('出问题啦:', msg);
    this.reportError(msg);
  }
})

组件生命周期:精致的“小部件”

组件的生命周期更加精细,让我用一个自定义组件来展示:

Component({
  lifetimes: {
    created() {
      // 组件实例刚被创建
      console.log('组件出生了!');
    },
    
    attached() {
      // 组件进入页面节点树
      console.log('组件安家落户了');
      this.initData();
    },
    
    ready() {
      // 组件渲染完成
      console.log('组件装修完毕');
      this.startAnimation();
    },
    
    detached() {
      // 组件被从页面移除
      console.log('组件搬家了');
      this.releaseResource();
    }
  },
  
  // 还有页面生命周期,专门为组件定制
  pageLifetimes: {
    show() {
      // 页面展示时的逻辑
      this.resumeMusic();
    },
    
    hide() {
      // 页面隐藏时的逻辑
      this.pauseMusic();
    }
  }
})

实战技巧:生命周期的最佳拍档

在我多年的开发经验中,发现这些生命周期组合使用效果最佳:

场景1:数据加载优化

Page({
  data: {
    listData: [],
    hasMore: true
  },
  
  onLoad() {
    // 初次加载数据
    this.loadInitialData();
  },
  
  onShow() {
    // 每次显示时检查更新
    if (this.shouldRefresh()) {
      this.refreshData();
    }
  },
  
  onHide() {
    // 离开时保存状态
    this.saveScrollPosition();
  }
})

场景2:资源管理

Page({
  timer: null,
  
  onShow() {
    // 开启定时器
    this.timer = setInterval(() => {
      this.updateRealTimeData();
    }, 5000);
  },
  
  onHide() {
    // 及时清理,避免内存泄漏
    if (this.timer) {
      clearInterval(this.timer);
      this.timer = null;
    }
  },
  
  onUnload() {
    // 双重保险
    this.onHide();
    this.cleanupNetworkRequests();
  }
})

常见坑点与解决方案

坑1:onLoad vs onShow 傻傻分不清

  • onLoad:只在页面创建时执行一次,适合一次性初始化
  • onShow:每次页面显示都执行,适合状态更新

坑2:内存泄漏
记得在onHide或onUnload中清理定时器、事件监听等资源。

坑3:数据状态混乱
合理利用onHide保存状态,onShow恢复状态。

总结

掌握小程序生命周期,就像掌握了小程序的“呼吸节奏”。合理运用它们,能让你的小程序运行更加流畅,用户体验更加丝滑。记住:合适的生命周期做合适的事,这是写出优质小程序的秘诀!

希望这篇分享能帮你更好地理解小程序生命周期。如果有任何问题,欢迎在评论区交流讨论~

⭐  写在最后

请大家不吝赐教,在下方评论或者私信我,十分感谢🙏🙏🙏.

✅ 认为我某个部分的设计过于繁琐,有更加简单或者更高逼格的封装方式

✅ 认为我部分代码过于老旧,可以提供新的API或最新语法

✅ 对于文章中部分内容不理解

✅ 解答我文章中一些疑问

✅ 认为某些交互,功能需要优化,发现BUG

✅ 想要添加新功能,对于整体的设计,外观有更好的建议

✅ 一起探讨技术加qq交流群:906392632

最后感谢各位的耐心观看,既然都到这了,点个 👍赞再走吧!

❌
❌