webkit内核源代码导读1:前言及webcore最基本的类

WebKit和Chrome源码分析 WebKit内核源代码分析 http://blog.sina.com.cn/s/blog_53220cef0100ta1i.html 摘要:本系列通过分析WebKit的源代码,试图分析WebKit的内核设计架构,模块之间的关系,分析的时候以Qt的移植为参考,涉及移植的东西不多,主要还是以内核为主。在分析内核的时候,Frame是首当其冲的一个类,本文将分析Frame类的代码。 1.     阅读详情

前言

webkit代码是目前最复杂也是最优秀的代码之一了。而且随着浏览器大战,也变得炙手可热。

但是,要理解这个代码也非常困难。

我自己也断断续续的读过不少webkit的代码,但是,经常读经常就忘了。最重要的是,很难把握它的全景。最近一段时间,因为工作需要,又需要了解内核的代码。这次,我换一种方式,从代码的结构入手,一步一步的将代码解析清楚。


webkit代码阅读的方法

webkit代码复杂程度如同一个人的身体结构。骨骼、血管、神经、肌肉、皮肤等紧密在一起,非常难以区分。但是在医学上,我们可以将各个部分分解为独立的系统来考虑,就可以比较清晰的了解人体结构。同样的方法,作用于webkit代码也是有效的。

我采用的方法,是从结构入手的。首先分解出最最重要的类以及类直接的关系,得到一个较为全局的概念,然后在一层层的细致分解下去,从而掌握整个webkit代码。

具体的方法,首先,就是抓住主干、忽略细节。 阅读过webkit的源码的人都知道,一段短短的代码,可能涉及四五个类十几个方法,而且,不明白这些代码的具体功能是什么。要理解他们,必须将那些次要的辅助性的代码排除出去(尤其是针对特殊问题的处理方法),仅留下最基本最重要的功能,以此为脉络,来掌握其意图。

其次,重点能够领会一个类或者方法的功能,而忽略其具体细节,这些细节只有在处理专门问题时,才需要考虑;

第三,对于明显独立的模块,要把它当作黑盒,需要适可而止,了解其接口和功用即可。其内部的具体工作原理,在分析该模块时,在具体分析。


webkit的源码

我所使用的webkit源码来自于chromium项目,与webkit官方的源码可能有区别。


开始,webcore最核心的类

先看图吧(这些类来自命名空间webcore):


  • Frame 类是中心类,和其他类相互关联。可以通过Frame来找到所有其他类。因此,当我们想引用一个网页时,就使用Frame类;
  • FrameLoader:没有什么好说的,负责加载方面的事情;
  • Document : 在网页中,具体实现是HTMLDocument,代表一个文档;
  • Page : 代表一个页面,负责前进后退、Js窗口(js alert, prompt,open等函数的实现, 模态窗口以及拖拽相关的实现。和窗口系统关联是通过Chrome类
  • EventHandler: 所有的键盘、鼠标、触屏事件,都是通过这个类处理的。


这些类之间有非常复杂和密切的关系,Frame周边的类的每个对象,都会包含一个Frame对象指针,当这个类需要调用其他类的接口时,就通过Frame指针找到它。例如,在Document中,通常需要访问FrameLoader的功能时,就使用 frame()->loader() 这样的方法来查找。

以上就是webkit的最基本骨架,后面的文章,将逐个分析每个部分。

浏览器内核分析2 -- Webkit和Chromium源码结构 1 Webkit架构Webkit和Blink代码量都是几百万行级别,阅读难度很大,故先了解下它的大体架构是十分有意义的。下面是《Webkit技术内幕》一书中给出的架构图由图中可见,大体分为以下几个层次 1. 操作系统:WebKit可以在不同OS上运行,如mac OS,Windows,Linux等。 2. 三方库:WebKit依赖了很多三方库,如音频,视频等 3. WebKit:大概分为两个部分 阅读详情

相关推荐

WebKit内核源码分析_ALL

WebKit内核源码分析_ALL

WebKit核心:WebKit结构简介

WebKit是一个开源的浏览器引擎, 主要用于渲染网页内容。WebKit的结构主要包括WebCore、JavaScriptCore、WebKit Ports和WebKit API等组件。

单口相声Jay 537

扩增子测序|iCAMP包——基于系统发育零模型分析确定性和随机性在群落构建过程R中实践

iCAMP的核心功能是通过系统发育分箱的零模型分析,量化不同生态过程的相对重要性。,用于评估不同生态过程(同质选择、异质选择、扩散和漂变)对整个群落及各个系统发育分箱(bin)的相对重要性。该方法也成为nature,science系列文章的常客,深受大家喜欢,在文章中运用该方法将为论文增色不少。外环和内环的圆环图显示了每个门(或变形菌门的分类)中不同过程的相对重要性。中央是系统发育树,内环展示了不同过程的相对重要性,表示每个系统发育箱中的DL。示例代码中提供了数据和代码,已经小编测试,可直接运行。

weixin_46814750的博客 6230

WebKit三件套(1):WebKit之WebCore篇

导语:Chrome浏览器的代码量其实是非常庞大的,要想对其有深入的理解,仅仅编译编译调试调试,是很难深入下去的。

周陆军的博客,分享it技术。 564

程序设计二(面向对象)_实训10_复杂类的实现_ArrayList类的实现

第1关:构造函数与析构函数的实现

2401_83406306的博客 820

RS485设备联网避坑指南:塔石串口服务器在MODBUS平台中的3个关键配置项

本文针对塔石串口服务器在MODBUS物联网平台接入中的常见问题,详细解析了三个关键配置项:工作模式选择、远程端口与保活机制、寄存器映射与轮询策略。通过对比错误与正确配置案例,帮助工程师避开配置陷阱,实现RS-485设备的稳定、高效联网,提升批量部署的成功率与系统可靠性。

weixin_29281941的博客 405

(转)WebKit内核源码分析

转自:红心地瓜的专栏,WebKit内核源码分析。 WebKit内核源码分析 WebKit内核源码分析(一) 摘要:本系列通过分析WebKit的源代码,试图分析WebKit的内核设计架构,模块之间的关系,分析的时候以Qt的移植为参考,涉及移植的东西不多,主要还是以内核为主。在分析内核的时候,Frame是首当其冲的一个类,本文将分析Frame类的代码。 1.    描述 Frame类是W

zhangfanlong的博客 2360

Mixly米思齐——超声波测距控制LED灯

为了更加地贴近中小学信息技术的课程,我们用米思齐做了一个实验——根据距离的远近开启警报灯(利用超声波测出距离)。 实验硬件准备 arduino uno R3 、USB 数据线、YFROBOT UNO I/O扩展板、YFROBOT超声波传感器模块、模块3P连接线x1、LED灯x1 硬件连接图如下: 在arduino uno R3 上再接一个LED灯,实物图如下: 在本次实验中,LE...

Janise_的博客 9977

WebKit之WebCore篇

<br />转自: 浅谈WebKi谈WebKit之WWebKit之WebCore篇 <br /> <br />1、从源代码目录结构来看<br /> WebCore目录主要包括如下目录:<br />bindings 包含将Dom Binding给JavascriptCore方面的代码,同时包含依据idl接口描述文件,自动生成对应于JavascriptCore的Binding实现的脚本等内容;<br /><br />bridge 主要包含NPPlugin方面的接口访问等内容;<br /><br />c

leeeryan 3941

Autosar Dcm配置-App到Boot的跳转及1002回复配置及实现-基于ETAS软件

在软件刷写流程中,上位机(诊断仪)发送1002后,APP检查允许跳转boot后,在特定的ram(软复位不清除)写入指定置后通过触发软件复位来跳转到boot的。在APP跳转到Bootloader时,1002的回复有两种方式,一种是APP直接回复,然后跳转,另一种是APP回复NRC78,然后跳转,在Boot中回复。本文介绍这两种方式的实现。如果是在APP中回复,可以少发一个0x78,整体跳转时间可能会少一些。但是如果诊断在收到5002之后立马请求其他的服务,可能出现boot正在初始化而未正常接收到报文。

赞的博客 1556

Response Instance 详解:在 ABAP OData Client Proxy 中读懂每一次响应

ABAP OData Client Proxy中的Response Instance是关键信息载体,封装了业务数据及调用上下文(如分页、delta link等)。响应实例在执行请求后自动生成,根据请求类型返回特定接口(如READ返回/IWBEP/IF_CP_RESPONSE_READ)。响应抽象与OData版本解耦,支持统一处理V2/V4服务。常见响应类型包括单实体读取、列表读取(支持分页和增量同步)、创建/更新/删除响应等。开发时可通过响应对象的安全类型方法获取数据,如get_business_data获

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 136

WEBKIT内核源码分析系列

原帖地址:http://www.cnblogs.com/qq499194341/articles/2891954.html

一天 一小步 1万+

ubuntu下编译qtwebengine

ubuntu qtwebengine

tianyu的专栏 - Linux site:blog.youkuaiyun.com/wishfly 1463

WebKit内核源码分析(一)---dlmu2001

WebKit内核源码分析(一)---dlmu2001tomorrow.cyz@gmail.com摘要:本系列通过分析WebKit的源代码,试图分析WebKit的内核设计架构,模块之间的关系,分析的时候以Qt的移植为参考,涉及移植的东西不多,主要还是以内核为主。在分析内核的时候,Frame是首当其冲的一个类,本文将分析Frame类的代码。1.    描述Frame类是WebCore内核同应用之间联系的一个重要的类。它有点像设计模式中的Façade,将内核的各个不同的零配件组装在了一起,但又不是Façade,因

红心地瓜的专栏 3万+

mongodb在游戏开发领域的优势

目前游戏服务器使用mysql作为数据库的较多,然而,使用mongodb来作为存储层,在某些方面比mysql更为方便和适合。

littleschemer的博客 1698

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

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

WebKit 内核源代码分析系列

WebKit 内核源代码分析 ( 一):http://blog.youkuaiyun.com/dlmu2001/article/details/6164873 WebKit内核源代码分析(二)http://blog.youkuaiyun.com/dlmu2001/article/details/6168545   WebKit内核源代码分析(三): http://blog.youkuaiyun.com/dl

conquer0的专栏 604

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

理解WebKit和Chromium: HTML解析和DOM

转载请注明原文地址:http://blog.youkuaiyun.com/milado_nju # HTML解析和DOM ## 概述 前面介绍了很多眼花缭乱的新技术,关于渲染,关于硬件加速,关于布局,关于其他很多,同大家一样,我也花了很多时间来消化它们。本章介绍稍微基础些的话题(本系列的写作顺序完全是随心所欲地),就是在渲染整个过程的初始阶段---HTML解析。不过这不表示它简单,其实这里是...

weixin_34417200的博客 309

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

从零开始看WebKit源码——bmalloc[1]

最近有些空,准备看看浏览器相关的源码,chromium以前看了一部分,这次准备看看WebKit的一些代码,并码点字记录一下梳理的过程。 首先先从bmalloc开始,相关文件在Source/bmalloc/bmalloc下,我们从bmalloc.h文件开始。 // Returns null on failure. BINLINE void* tryMalloc(size_t size, HeapKind kind = HeapKind::Primary) { #if BUSE(LIBPAS) if (

qq_38617319的博客 1813

WebKit内核源代码分析(三)

浏览器的请求一般是以页面请求为单位,当用户通过网址栏输入一个url,浏览器就开始一个页面请求。而一个页面请求可能包含有一到多个页面子帧,以及图片、CSS和插件等派生子资源。Page类就是用来对应这样的页面请求。Page类是WebKit中非常重要的一个类,它就像内核对外的一个聚合器。

红心地瓜的专栏 1万+

Webkit 结构简介难点要点和案例源码解析说明

JavaScript 引擎(JavaScriptCore):掌握 JavaScript 解析和执行的原理,了解与呈现引擎的协作方式,是开发基于 WebKit 的浏览器的关键要点。开发团队可以基于这个基本框架,根据项目需求进行进一步的定制和开发工作,例如增加对特定功能的支持、优化性能、改进安全性等,以开发出符合项目需求的定制化浏览器。深入理解和把握 WebKit 结构的难点和要点,将有助于开发团队更好地定制和开发基于 WebKit 的浏览器,提升系统的稳定性、性能和安全性。

2401_84235249的博客 539

WebKit源码解析 -- WebCore::CSSValue

转载,请注明出处!      在创建了CSSParserValue对象之后,会将CSSParserValue对象转换为CSSValue对象,最后使用CSSValue对象以及属性名称propId创建Property对象。可以认为CSS属性值在WebCore模块有两中存储形式:CSSParserValue,CSSValue。CSSParserValue是在CSS语法分析器解析过程中创建的、只能被CS

shuimuniao的专栏 1050

深入理解 WKWebView(入门篇)—— WebKit 源码调试与分析

????????关注后回复“进群”,拉你进程序员交流群????????作者丨童红明来源丨百度App技术前言移动互联网时代,网页依旧是内容展示的重要媒介,这离不开 WebKit 浏览内核...

<sdffdsfsdfdfs>sfsfsfsdfsdffds</sdfsDS>Fsd 988

webkit的源码编译

刚刚完成webkit源码的编译,由于我是菜鸟,看了很多的博客才成功,现在和搭建分享一下。 源码版本WebKit-r174650是目前最新的,下面介绍开发环境的搭建: 1,安装VS2013,看了这个大神的博客,上边有链接,下载后直接安装,我用的是默认目录,为了减少不必要的麻烦,毕竟菜鸟:http://blog.youkuaiyun.com/kimmking/article/details/43910121

JustNoDouble的专栏 1736

webkit源码分析

Webkit源码分析

yzy9508的博客 943

webkit内核源代码导读3:HTML的解析过程

声明 HTML的解析过程是非常复杂的,下载、解析、脚本执行、显示是交错进行的。而且,HTML的解析器具有非常强的容错能力。 对于初次接触webkit源码的童鞋来说,是无法全面理解的。而且,本文立意也不是介绍HTMl的解析算法一类的东西。即便是我自己,对于很多东西都理解不了。 所以,本文重在解释HTML的解析过程,解说各个组成部分及功能。以后有机会,我将详细分析解析的算法。 解析过程

doon的专栏 4150

WebKit – WebKit For Android

如需转载,请注明出处!WebSite: http://www.jjos.org/作者: 姜江 linuxemacs@gmail.comQQ: 457283这是一篇自己写于一年前的工作文档,分享出来。原文:http://www.jjos.org/android/2010/05/10/312_webkit-webkit-for-android.html一、WebKit简介W

★果冻★的专栏 4396
上一篇: 软件开发的思维模式
下一篇: webkit内核源代码导读2: FrameLoader的初步分析
漂流的代码
博客等级 码龄23年 188粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值