前端性能优化:webpack分离 + LocalStorage缓存

Web前端面试核心知识点全解析:HTML5到性能优化 Web前端开发作为构建现代互联网应用的关键技术,其核心原理涵盖HTML5语义化、CSS布局机制和JavaScript异步编程等基础概念。HTML5语义化标签通过结构化文档提升SEO效果和可访问性,CSS的Flex和Grid布局基于盒模型实现响应式设计,而JavaScript的闭包和原型链机制支撑了复杂的应用逻辑。这些技术价值体现在提升用户体验、优化性能和保证代码可维护性上,广泛应用于电商、社交等高频交互场景。本文基于字节跳动等大厂面试热点,系统梳理了Vue响应式原理、React Hooks和Webpack优 阅读详情

一,优化背景

上一篇关于webpack优化的文章webpack + react 优化:缩小js包体积谈到如何缩小webpack打包后的js代码体积,来减少网络请求数据量,这次尝试将第三方库(React,ajax等)从业务代码中分离出来,并且将分离出来的第三方库缓存在LocalStorage中。

该次优化的出发点有下面两点:

①每次更改业务代码都会打包成新的bundle.js,前端需要抛弃以前的HTTP缓存重新下载249K左右的bundle.js,即使改变的业务代码很少。
②尝试使用LocalStorage(移动端上兼容很好)

第一点是痛点,第二点是作为前端工程师学习研究用的,希望足够严谨不会给用户带来副作用。

优化结果

①webpack分离出业务代码和第三方库

分离前:
webpack代码切分

分离后:bundle.js 为业务代码,vendor.js为第三方库代码(几乎不更新)
webpack代码切分

②使用LocalStorage缓存第三方库到本地

缓存前:
localstorage缓存前

缓存后:(少下了198KB的libs.js,注:这里的app对应上面的bundle.js,libs对应vendor.js)
localstorage缓存前

下面上相关代码。

二,优化思路

①将公用库分出来

这一部给出webpack配置文件即可,注意看注释部分:

var webpack = require('webpack');
var path = require('path');
var ExtractTextPlugin = require("extract-text-webpack-plugin");

module.exports = {
  entry: {
    //业务代码
    bundle: path.resolve(__dirname, 'src/main.jsx'), 
    //第三方库
    vendor: ["react","react-dom","react-router","@fdaciuk/ajax"]
  },
  //输出路径
  output: {
    path: __dirname + '/server/public',
    publicPath: '/',
    filename: './[name].js'
  },
  module: {
    loaders:[
      { test: /\.css$/, loader: ExtractTextPlugin.extract("style-loader", "css-loader") },
      { test: /\.scss$/, loader: ExtractTextPlugin.extract("style-loader", "css-loader!sass-loader") },
      { test: /\.(jpg|png)$/, loader: "url" },
      { test: /\.js[x]?$/, include: path.resolve(__dirname, 'src'), exclude:/node_modules/, loader: 'babel-loader' },
      { test: /\.woff$/, loader: "url-loader?prefix=font/&limit=5000&mimetype=application/font-woff" },
      { test: /\.ttf$/, loader: "file-loader?prefix=font/" },
      { test: /\.svg$/, loader: "file-loader?prefix=font/" }
    ]
  },
  resolve: {
    extensions: ['', '.web.js', '.js', '.json', '.jsx'],
    modulesDirectories: ['node_modules', path.join(__dirname, '../node_modules')],
  },
  plugins: [
    new webpack.optimize.DedupePlugin(),
    new ExtractTextPlugin("bundle.css"),
    //将第三方库打包到vendor.js
    new webpack.optimize.CommonsChunkPlugin({ name: 'vendor' }),
    new webpack.DefinePlugin({ 'process.env': { NODE_ENV: JSON.stringify(process.env.NODE_ENV), }, }),
    new webpack.optimize.UglifyJsPlugin({ output: { comments: false, }, compress: { warnings: false } }),
  ]
};

关于这部分深入的理解和学习可以看webpack的示例.

②将公用库缓存在LoaclStorage中

这一步比较好玩,涉及到的东西也比较多,先上学习参考资料:

  1. MDN:LocalStorage
  2. 知乎:静态资源(JS/CSS)存储在localStorage有什么缺点?为什么没有被广泛应用?
  3. Dynamic script addition should be ordered?(动态添加的script标签会按顺序执行吗?)

关于这一部分,有两个要点:

  • LocalStorage缓存
  • LocalStorage缓存版本控制

按照惯例:上源码

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>
<title>Examples</title>
<meta name="description" content="">
<meta name="keywords" content="">
<!-- 利用noscript, 使script标签不加载,不执行 -->
<noscript>
  <script src="vendor.js"></script>
  <script src="bundle.js"></script>
</noscript>
<script>
  //这则匹配获取两个script的src
  var script_info = document.head.querySelector('noscript').innerText.split(/\s/).join('').match(/src="(.+)".*src="(.+)"/);
  var vendor_src = script_info[1], bundle_src = script_info[2];
  var vendor_script = document.createElement('script'), 
      bundle_script = document.createElement('script'); vendor_script.defer = true;
  bundle_script.defer = true, bundle_script.src = bundle_src;
  if (window.localStorage) {
    var cur_version = vendor_src, vendor = null;
    if (window.localStorage.getItem("vendor_version") == cur_version && window.localStorage.getItem("vendor")) {
      //命中缓存
      vendor = window.localStorage.getItem("vendor");
      vendor_script.innerText = vendor;
      document.head.appendChild(vendor_script);
      document.head.appendChild(bundle_script);
    } else {
      //获取js代码
      var httpRequest = new XMLHttpRequest();
      httpRequest.onreadystatechange = function(){
        if (httpRequest.readyState === XMLHttpRequest.DONE && httpRequest.status === 200 || httpRequest.status === 304) {
          vendor = httpRequest.responseText;
          vendor_script.innerText = vendor;
          document.head.appendChild(vendor_script);
          document.head.appendChild(bundle_script);
          //以当前vendor的src链接作为key用于版本控制
          window.localStorage.setItem("vendor_version", cur_version);
          //存储实际代码
          window.localStorage.setItem("vendor", vendor);
        }
        //should handle 500
      }
      httpRequest.open('GET', vendor_src, true);
      httpRequest.send(null);
    }
  } else {
    //不支持localstorage时的回退方案,直接将script标签添加到head
    vendor_script.src = vendor_script;
    document.head.appendChild(vendor_script);
    document.head.appendChild(bundle_script);
  }
</script>
<link href="bundle.css" rel="stylesheet">
</head>
<body>
  DEMO
</body>
</html>

代码没有什么高深的地方(毕竟水平有限,但是简单易懂有用的代码也挺好的),应该看完就知道大概了,可能你会疑惑:

为什么用了<noscript>标签?

这里回答一下,也是今早折腾了一小下的小亮点。

我的web后台使用了rails,我在后台给静态资源文件名加上了指纹作为缓存的依据,实际如下:

rails 后台模板:会自动找到加上自问的静态资源。
rails 后台模板

生成的HTML:
noscript

可见一旦文件内容发生变化,对应的文件名也发生了改变(HTTP缓存失效),因此可以用文件名来做LocalStorage缓存的版本。也正是因为文件名不确定,因此只能通过去找到相应的script标签的src才能获取资源。

那么问题就来,一开始我把vendor和bundle的script标签放在控制缓存的脚本后面,但是执行到缓存脚本时,页面还没解析到后面两个script标签,因此无法获取script的src。而把vendor和bundle的script标签放在控制缓存的脚本前面时,在执行缓存脚本前vendor和bundle脚本就已经开始下载了(通过设置type=”text”或其他可以使script不执行),不够优雅。

解决思路如下:

  1. 页面还没解析到后面两个script标签时能获取后面的信息吗?(个人觉得不合常理,如果有方法,请分享,万分感谢)
  2. 有什么办法能让前面的script不下载? => <noscript>包裹即可,well done.

三,优化结果 && more

优化结果其实前面已经提及了,无非是首次加载web应用后就不需要再加载不常改变的libs.js(200k左右),值得注意的是,前面缓存前后的比较其实不严谨,因为都把HTTP cache关了,实际场景中设置了HTTP cache,所以其实LocalStorage优化不大,但是节省了用户流量是实实在在的。

优化完之后还有些疑惑:

  1. 为什么vendor.js体积比所有库(["react","react-dom","react-router","@fdaciuk/ajax"])加起来大?vendor.js里面肯定包含了webpack实现模块化的一些代码,但占这么大应该不科学,抽空应该好好看看webpack的实现原理。
  2. LocalStorage是否比HTTP cache更加可靠?

四,一些想法

除了将第三方库缓存下来之外,是不是也可以将一些万年不变的图片缓存下来?例如各个分类都有个大图,很耗流量,现在的做法是减少尺寸,在清晰度上牺牲了一些。

最近也在看事件循环,zepto.js的event.js和touch.js,好多可以学习深入的地方,兴奋之余也在提醒自己,要踏踏实实攻城拔寨。

人生是一场马拉松,今日的领先和落后都不值一提,唯一值得关注的是你自身的不断成长。

自勉。

2025美团前端面试高频题解析:从JS原理到性能优化 前端面试考察的不再是API记忆,而是对技术原理与工程落地的综合理解。以JavaScript为例,闭包、事件循环、Promise手写题背后,是执行上下文与异步调度机制的系统掌握;Vue和React的源码追问,则要求候选人从响应式Proxy、diff算法与Hooks调用链等底层机制推导设计取舍。理解这些原理,不仅能应对大厂高频考题,更能指导真实业务中的性能优化与代码质量提升。从浏览器缓存策略到webpack/Vite构建流程,从XSS防御到监控体系,面试官最终考察的是候选人解决实际问题的能力。2025年美团前端 阅读详情

相关推荐

Vue+Webpack前端工程化落地手册:从构建、Mock到CDN与容灾

单页应用(SPA)的工程化本质是将开发、构建、部署与监控形成闭环。其核心原理在于模块化打包(如Webpack的Tree Shaking与代码分割)、运行时资源加载策略(如基于contenthash的长效缓存与HTML短缓存协同),以及前端可自主掌控的联调与容灾能力。技术价值体现在提升首屏性能(LCP优化)、降低发布风险(CDN缓存策略防404)、增强开发体验(零侵入Mock)和保障线上稳定性(LocalStorage降级兜底)。典型应用场景包括中后台系统快速迭代、跨团队协作项目标准化,以及遗留Vue项目性能

weixin_29001655的博客 200

.11-浅析webpack源码之Storage模块

  至此已完成NodeJsInputFileSysten模块的讲解,下一步就是实际实用的模块: compiler.inputFileSystem = new CachedInputFileSystem(new NodeJsInputFileSystem(), 60000);   挂载到compiler对象上的输入模块其实是带有缓存的输入模块,源码整理如下(用ES6的class重写): ...

weixin_30345055的博客 144

轻量级前端缓存插件npm-storage实战指南

虽然默认序列化能满足大多数场景,但在某些高阶需求下仍需定制。例如加密敏感字段、压缩大数据量对象、或与后端协议保持一致的编解码格式(如 MessagePack)。npm-storage 提供了可配置的serializer接口:},try {});

weixin_42143092的博客 1080

webpack实现静态资源缓存的那点事

引言 静态资源缓存是前端性能优化的一个点,所以在前端开发过程中,一般会最大限度的利用缓存(这里主要是强缓存)。回到本文主题,在使用webpack构建的项目中,稍有不慎的话,即使服务器设置了缓存策略,可能构建的项目无法实现静态资源缓存。那么webpack怎样才能达到使用缓存的效果呢,下面就来谈谈这个问题。 区分一下几种不同的hash 我们都知道,webpack有各种hash值,包括每次项目构建has...

weixin_30708329的博客 305

适用于浏览器和Node.js的通用LocalStorage。-JavaScript开发

localstorage-ponyfill用于浏览器和Node.js的通用LocalStorage ponyfill库。 安装使用npm安装:npm install localstorage-ponyfill用法自动(浏览器或Node.js)自动localstorage-ponyfill用于浏览器和Node.js的通用LocalStorage ponyfill库。 安装使用npm安装:npm install localstorage-ponyfill用法自动(浏览器或Node.js)自动选择模式。 如果环境定义window.localStorage->“浏览器”,否则->“节点”从“ localstorage-ponyfill”导入{createLocalStorage}; const localStorage = createLocalStorage(); localStorage.setItem(“ key”,“ value”); const value = localStorage.getItem(“ key”); assert.strictEqual(val

AXI总线的Burst Type以及地址计算 | WRAP到底是怎么一回事?

AXI总线的transaction是burst-based的,因此有必要好好研究一下不同burst type的工作原理。此处略过burst的定义以及burst size、burst length等信号的介绍。

qiuzhongyu123的博客 2万+

localStorage纯前端缓存实践

localStorage纯前端缓存实践 8】localStorage缓存js实践 思路: js包都不以script标签的形式插入到html中,而是需要以dom的形式动态设置script,并写入脚本。 判断bundle缓存是否过期:使用htmlwebpackplugin打包时不插入script标签,而是插入z89e0af6.bundle.js但是不让它显示。(我们需要手动写插件进行拦截) 在index.html中写脚本进行判断。 Dll动态链接库 拆一些公共的文件:react/react-dom/vu

weixin_45221036的博客 558

从Demo到产品:基于ADAU1452的ANC方案,硬件选型、性能优化与避坑指南

本文详细解析了基于ADAU1452的主动降噪(ANC)方案从Demo到产品的实现路径,涵盖硬件选型、性能优化与实战避坑指南。重点探讨了ADAU1452与ADAU1466的性能差异、编解码器选型策略,以及MFXLMS算法优化技巧,为工程师提供从理论验证到量产落地的系统级解决方案。

weixin_30542079的博客 451

使用缓存实现前端性能优化——浏览器缓存机制、缓存分类

前端性能优化探讨及浏览器缓存机制 一、缓存如何实现前端性能优化 1、什么是浏览器缓存 2、js请求,一般会有哪些地方有缓存处理? 3、什么是静态资源 二、缓存的类型 1、客户端缓存 ① 浏览器的http缓存 1)缓存过程分析 2)分类 强缓存 协商缓存 缓存的实际中的应用策略 ② 本地存储cookie,localStorage,sessionStorage (客户端保存数据) 实现数据持久化(数据本地化) cookie还可以用于跟踪用户身份 2、 CDN 缓

秀秀的奇妙旅行 1293

逆向实战:我是如何一步步解开美团外卖App的mtgsig3.0签名(附关键代码片段)

本文详细记录了逆向分析美团外卖App的mtgsig3.0签名算法的全过程,从抓包到算法还原,包括Java层和Native层的深度分析。通过Frida、IDA Pro等工具,揭示了签名生成的多层加密流程,并提供了关键代码片段。文章还探讨了逆向工程中的反调试对抗和签名时效性问题,为安全研究人员提供了宝贵的技术参考。

weixin_42530732的博客 870

云安全技术——搭建VPN

VPN(Virtual Private Network)是一种可以在公共网络上建立安全连接的技术。VPN是实现保密通信的基本手段,在windows系统上,可以直接进行VPN服务的搭建。1.VPN的工作原理:通过使用加密协议和认证机制,将本地计算机和远程服务器之间的通信加密和保护。2.VPN的分类:根据不同的方式和用途,VPN可以分为不同类型,例如远程访问VPN、站点到站点VPN等。3.VPN的优势:VPN可以带来许多好处,如提高数据安全性、隐藏真实IP地址、突破地理限制等。4.

qq_53142796的博客 3万+

webpack实现静态资源缓存

webpack如何实现静态资源缓存,相关配置几原理

miaomiao_1024的博客 2385

(三) Debian 安装linuxcnc-ethercat中间件

1.在这里同样的也是需要下载一下依赖包 sudo apt install linuxcnc-uspace-dev 2.依赖包安装完成, 接着执行下面命令 sudo git clone https://github.com/sittner/linuxcnc-ethercat 还是可能出现下载网络错误下载不成功,可以直接下载我已上传百度云linuxcnc目录下 注意一下,后面make可能会出现头文件(xxx.h)的报错提示,在这里给大家一个处理办法 用aptitude 工具可以搞定 sudo apt-get

qq_30065813的博客 828

使用 Webpack 和 LocalStorage 实现静态资源的离线缓存

使用 Webpack 和 LocalStorage 实现静态资源的离线缓存

嗨,欢迎来到我的 优快云 博客小天地!一名深耕多年的技术发烧友。在这里,我将把日常工作中积累的宝贵经验,从复杂架构设计的精妙之处,到代码优化的实战技巧,毫无保留地分享给大家。 6835

快速入门必看!RT-DETR手把手训练自己的数据集去跑实验,基于 ultralytics 仓库源码改进,配置虚拟环境,准备数据集、训练、验证、推理测试 ,实现0到1的完整教学过程。

本文介绍了使用Ultralytics框架训练RT-DETR模型的全流程。首先需要创建Python 3.10虚拟环境,安装指定版本的PyTorch和相关依赖包。然后准备数据集,修改配置文件,并详细介绍训练、验证和推理三个核心步骤的代码实现。训练阶段使用RTDETR类加载模型配置,设置训练参数;验证阶段评估模型性能;推理阶段可对图片、视频等进行预测。文中还提供了清华大学镜像源加速下载,以及详细的参数配置说明,帮助用户快速搭建RT-DETR目标检测模型。

Ai缝合怪、助力小伙伴高效发论文 5548

Python散点图(Scatter Plot):高阶分析、散点图矩阵、三维散点图及综合应用

散点图作为一种直观且功能强大的数据可视化工具,在数据分析中具有广泛的应用。通过观察散点图中数据点的分布模式,我们可以轻松地判断变量之间是否存在相关性,以及相关性的类型和强度。同时,散点图也是识别数据集中异常值的有效工具,无论是通过直观观察还是结合统计方法,都能帮助我们发现数据中的异常情况。掌握散点图的绘制和分析技巧,将使我们在数据探索和决策制定中更加得心应手。

SiArch的博客 1444

前端性能优化

network,请求次数越少,DOMContentLoaded(html 被完全解析和加载,不包含样式图片和框架的加载时间),load 越小,性能越好。所以我们可以使用 自定义指令。不论是使用 webpack 还是 vite ,打包后进行打包分析,针对于特别大的包,我们可以采用。性能的指标,浏览器的控制台中 网络(network) 和 性能(performance)。但是要注意,cdn 只能增加用户访问的速度,但是不会减少依赖包的体积。一般来说,304 缓存的处理是服务框架中自动进行处理,不需要过多关注。

小秀的博客 1356

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Backbone.localStorage的未来发展:路线图与社区支持

Backbone.localStorage是一个为Backbone.js提供localStorage适配器的开源项目,它能够替换Backbone.sync方法,将数据保存到window.localStorage中而不是服务器。作为前端开发中常用的本地存储解决方案,其未来发展方向和社区支持情况备受开发者关注。 ## 项目现状与核心优势 Backbone.localStorage目前的最新版本为2

gitblog_00797的博客 1031

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

前端数据持久化:LocalStorage实现用户状态存储与恢复

前端数据持久化是Web开发中的基础技术概念,指在浏览器环境中将应用状态数据长期保存的机制。其核心原理是通过浏览器提供的存储API(如LocalStorage、SessionStorage等)实现数据的序列化存储与反序列化读取。这一技术对于提升用户体验具有重要价值,能够解决页面刷新导致状态丢失、用户偏好设置无法保存等常见问题。在实际应用场景中,数据持久化广泛应用于用户身份识别、表单数据暂存、应用配置保存等场景。本文聚焦LocalStorage这一主流方案,通过用户标识信息存储的具体案例,详细讲解数据持久化的工

weixin_33994429的博客 377

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

前后端分离架构实战:从开发环境搭建到API设计与性能优化

前后端分离架构是现代Web开发的核心模式,其原理是通过API接口实现前端界面与后端服务的解耦。这种架构的技术价值在于提升开发效率、支持团队并行协作和增强系统可扩展性。在实际应用场景中,开发者需要掌握RESTful API设计、状态管理和数据流控制等关键技术。本文基于React和Spring Boot技术栈,详细展示了开发环境配置、接口规范定义、性能优化策略等工程实践内容,帮助开发者解决跨域访问、数据一致性等常见挑战,实现高效的前后端协作开发。

weixin_33924312的博客 433

前端性能优化及其优化点

前端性能优化 web前端与CS架构GUI软件开发与部署过程 CS架构GUI软件开发与部署过程:开发完成后通过生成包,发布到对应的应用下载商城之中,再将包放在对应的操作系统之中,最后代码将运行在该操作系统中,用户就可以访问加载在本地的一些资源。如:在安卓系统下,开发完成后打包会生成一个.apk的包,将该包发布在应用商城上,然后用户拿到该包后,就可以在安卓系统下去运行。 web前端的开发与部署:当开发者开发完成之后是将项目运行在远程的服务器之中,用户就可以通过域名来访问该网址,从而就能访问到该项目。 web

domino~~的博客 951

前后端分离架构:原理、实践与优化策略

前后端分离是现代Web开发的核心架构模式,通过RESTful API实现前后端解耦。其技术原理基于HTTP协议和标准化接口规范,利用React/Vue等框架构建动态前端,配合Spring Boot等后端服务。这种架构显著提升了开发效率,支持技术栈自由选型,适用于中大型Web应用开发。实践中需关注接口契约管理、JWT认证、跨域解决方案等关键技术点,并通过Webpack优化、接口聚合等手段提升性能。随着微前端和Serverless技术的发展,前后端分离架构正在向更灵活的BFF模式和边缘计算演进。

weixin_30385925的博客 327

前端加分点-项目性能优化方案

1.2异步加载:找出项目中适合做异步加载的功能(包体积比较大,又不是马上需要的功能),比如项目中涉及到图片压缩的功能,涉及到的第三方库体积很大,并且图片压缩功能不会立即用到。1.3更新为体积更小的新版本:项目比较老用到的一些库的版本也比较老, 此时更新新版本可以配合按需引入支持tree-shaking机制减小库打包体积,比如xlsx库。不变数据,定期失效可以缓存在cookies或者localstorage中,比如token,用户名等。3.骨架屏,loading效果,让屏幕不白,减少用户焦虑。

awangshengjie的博客 549

使用webpack实现静态资源缓存

  引言 静态资源缓存是前端性能优化的一个点,所以在前端开发过程中,一般会最大限度的利用缓存(这里主要是强缓存)。回到本文主题,在使用webpack构建的项目中,稍有不慎的话,即使服务器设置了缓存策略,可能构建的项目无法实现静态资源缓存。那么webpack怎样才能达到使用缓存的效果呢,下面就来谈谈这个问题。 区分一下几种不同的hash 我们都知道,webpack有各种hash值,包括每次项...

ruanhongbiao的专栏 1734

快手前端面试全流程复盘:基础、框架与场景题

事件循环和闭包是JavaScript进阶路上绕不开的核心概念,它们决定了代码的执行顺序与变量作用域,也是前端面试中考察候选人基本功的高频考点。理解宏任务与微任务的调度机制、掌握闭包与内存泄漏的关系,能帮助开发者写出更可靠的异步逻辑。从浏览器渲染原理到React框架的Diff算法与Hooks闭包陷阱,再到Webpack构建优化和请求并发控制,这些技术点最终都指向一个目标:提升页面性能与工程效率。这份快手前端面试复盘从基础概念出发,完整梳理了从事件循环、原型链到框架原理、场景题的真实考察方式,为准备跳槽的开发者

weixin_30800807的博客 510
上一篇: 前端性能优化利器:Chrome Timeline学习及实践
下一篇: ReactJS修炼之路(五):Immutable.js的使用及setState的一个误区
Sheldon_Law
博客等级 码龄11年 44粉丝 32原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值