工程化:Webpack 热更新实现原理

前端八股文面试题——webpack工程化 代码分割是将一个应用程序的代码拆分成多个独立的块,以便可以按需加载。可以减少初始加载时间提高页面性能,在 Webpack 中配置实现代码分割,有以下多种方式:1、入口起点配置:配置多个入口起点,不同部分打包成独立的代码块。2、动态导入 (Dynamic import):可以将模块作为单独的代码块按需加载,这样模块需要时才会下载执行,3、使用 SplitChunksPlugin 插件来自动分割代码。自动拆分公共模块,并创建独立代码块,避免重启加载,提高缓存利用率。 阅读详情

HMR 的基本流程图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xUZsHdAp-1658289458369)(https://s.poetries.work/images/20210422211446.png)]

  • 当修改了一个或多个文件;
  • 文件系统接收更改并通知 webpack;
  • webpack 重新编译构建一个或多个模块,并通知 HMR 服务器进行更新;
  • HMR Server 使用 webSocket 通知 HMR runtime 需要更新,HMR 运行时通过 HTTP 请求更新 jsonp
  • HMR 运行时替换更新中的模块,如果确定这些模块无法更新,则触发整个页面刷新
前端领域:Webpack的热更新原理与实现 Webpack的热更新(HMR)是现代前端开发中提升效率的核心技术之一。本文旨在深入解析HMR的工作原理,从底层实现到实际应用,为开发者提供全面的理解和技术指导。文章将从HMR的基本概念开始,逐步深入到实现原理、源码分析、实际应用和优化策略,最后探讨未来发展趋势。: 模块热替换,在不刷新整个页面的情况下替换、添加或删除模块: 提供开发服务器的Webpack工具,支持HMRCompiler: Webpack的核心编译器实例Bundle: Webpack打包生成的输出文件集合更快的更新速度。 阅读详情

相关推荐

NXP S32K1 SPI驱动实战:从配置到DMA传输的完整流程解析

本文深入解析了NXP S32K1系列MCU的SPI驱动开发全流程。基于S32 Design Studio环境,详细阐述了从引脚配置、LPSPI模块初始化,到实现阻塞、中断及DMA三种传输模式的实战代码与配置要点。文章重点剖析了DMA传输的配置细节与性能优化,旨在帮助开发者构建高效、稳定的嵌入式SPI通信,并提供了SPI Flash驱动的综合案例。

blue42的博客 714

Webpack 热更新原理详解

Webpack热更新(HMR)是一种提升开发效率的重要功能,无需重新加载页面即可动态更新代码模块。其原理分为服务端和客户端两部分:服务端通过文件监听检测变化,增量构建生成更新文件;客户端通过WebSocket接收更新,利用module.hot API实现模块动态替换。核心机制包括HotModuleReplacementPlugin注入必要代码、HotModuleReplacementRuntime处理更新逻辑。虽然HMR能保留页面状态,但也存在模块兼容性限制,需注意正确使用相关API。合理运用HMR可显著提

你若盛开,清风自来 2040

ansys命令流力磁耦合仿真

文章目录前言一、力磁耦合仿真流程二、静力学仿真三、力磁耦合模型构建四、静磁学仿真总结 前言 一、力磁耦合仿真流程 力磁耦合有限元仿真流程中,首先进行静力学仿真,经过前处理模块、分析计算模块和后处理模块提取三维模型单元应力,然后根据力磁耦合方程中,通过matlab将单元应力导入到磁导率与应力的关系式中,得到单元的相对磁导率。最后采用载荷传递耦合方式,进行静磁学模拟仿真,分析计算得到该载荷下试件的磁场分布。,如下图所示为力磁耦合仿真流程图: 二、静力学仿真 下图为中心预制条形缺陷的Q235钢板试..

wsfwsf128的博客 2661

Webpack 热更新原理

模块热替换(hot module replacement 或 HMR)是webpack提供的最有用的功能之一。它允许在运行时更新所有类型的模块,而无需完全刷新一种是页面刷新,不保留页面状态,就是简单粗暴,直接。另一种是基于WDS) 的模块热替换,只需要局部刷新页面上发生变化的模块,同时可以保留当前的页面状态,比如复选框的选中状态、输入框的输入等。可以看到相比于第一种,热更新对于我们的开发体验以及开发效率都具有重大的意义。HMR作为一个Webpack内置的功能,可以通过或--hot开启。

楠姐的博客 1125

用Arduino和8个舵机,从零搭建一台能走路的并联腿机器狗(附完整代码与3D模型)

本文详细介绍了如何用Arduino和8个舵机从零搭建一台能走路的并联腿机器狗,包括硬件准备、结构组装、电路系统搭建、运动算法实现和Arduino编程。通过完整的代码与3D模型,帮助创客深入理解机器人运动原理,实现稳健行走的8自由度机器狗。

weixin_30482383的博客 701

NX二次开发(python)-坯料尺寸(一)

一般在产品制造过程中,往往要判断一个模型在出模方向上的最小包容盒尺寸,在NX中可以用坯料尺寸命令实现,当然也有相应的代码实现,这或许可以帮助我们实现一些产品的坯料尺寸批量输出,节省人力。

dasfanfan的博客 816

Webpack热更新原理详解

在前端开发中,Webpack的热更新(Hot Module Replacement,简称HMR)是一种非常实用的功能,它允许在不刷新整个页面的情况下更新模块。这种技术可以显著提升开发效率,特别是在调试和快速迭代过程中。本文将深入探讨Webpack热更新的原理,并通过代码示例展示如何实现热更新。

weixin_55862073的博客 734

基于simulink的BMS系统中电池单体故障隔离与恢复建模

本文介绍了使用Simulink构建BMS电池单体故障诊断与容错控制模型的方法。主要内容包括:1)搭建12串锂电池组模型;2)实现单体故障注入(过压、断线等);3)设计故障诊断与隔离模块(采用Stateflow状态机);4)开发恢复判断逻辑(需满足电压、温度等条件);5)系统监控与仿真设置。文章还提供了工程实践建议,如防环流设计、通信冗余等,并指出进阶方向(多故障处理、AI预警等)。该模型适用于新能源汽车、储能系统的BMS设计,可提高系统可靠性和安全性。

xiaoheshang_123的博客 140

webpack热更新原理-连阿珍都看懂了

前端进阶的必看的模块热更新原理。了解hmr的运行机制,有助于对我们项目运行原理的理解,对项目优化有新的认知~

bigname22的博客 5473

【QNX Hypervisor 2.2 用户手册】2.6 处理qvm终止

你可以注册通知,以在qvm进程实例退出时得到通知。这样你就可以采取相应的措施来响应这种终止事件。

从0到1,突破自己 1106

【突变检验方法一】MATLAB实现Pettitt突变检验

MATLAB实现Pettitt突变检验及贝叶斯突变检测等

WW、forever的博客 1万+

Webpack HMR原理深度剖析

本文全面解析了Webpack的热模块替换(HMR)技术,主要包括以下内容:1. HMR核心价值:保持应用状态、提升开发效率、实现即时反馈和增量更新;2. 架构与工作流程:从文件变更检测、编译分析到WebSocket通信和客户端处理的完整链路;3. 关键技术实现:包括插件系统、模块替换策略、依赖图管理和状态保持机制;4. 框架集成方案:详细介绍了React和Vue的热更新实现原理;5. 性能优化与调试:提出了增量编译优化和智能更新策略,并提供了故障排查方法。HMR通过分层架构和协同工作机制,实现了高效的无刷新

油墨香^-^的博客 1988

五、实战pxe安装ubuntu 22.04 软raid1(实际生产pxe配置)

这段配置文件是一个cloud-init的自动安装配置,用于自动化部署Ubuntu服务器操作系统。它定义了从系统身份、键盘布局、区域设置到磁盘分区和RAID配置的一系列设置,并且包含了在安装过程的最后阶段执行的一些命令。基础设置version: 1指定了autoinstall配置文件的版本。source定义了安装源,这里是ubuntu-server。identity设置了主机名(hostname)、用户(username)和密码(password注意这里的密码是经过加密的。键盘与语言设置。

jundao1997的专栏 999

vite:什么是热更新?vite 和 webpack 有什么区别?vite常见配置和优化手段?

热更新(HMR)是前端开发中的关键技术,能在不刷新页面的情况下替换、添加或删除模块,保留应用状态并实现毫秒级更新反馈。其工作原理基于客户端-服务端通信机制,通过WebSocket推送变更并拉取补丁文件完成模块替换。Vite与Webpack在热更新上有显著差异:Webpack随项目增大变慢,而Vite利用原生ESM实现恒定速度更新。Vite通过依赖预构建和按需编译实现极速开发体验,配置简洁且内置优化手段,如分包策略、Gzip压缩等。对于新项目,Vite已成为首选工具,大幅提升开发效率。

qq_49581491的博客 527

jre9下载 jdk9

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

深度学习工具包 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")

Webpack 深度解析:从原理到工程实践

Webpack是现代前端工程的核心模块打包工具,其核心作用包括模块化打包、开发支撑和生产优化。构建流程分为初始化、编译与构建、输出三大阶段,通过Loader和Plugin实现模块转换和功能扩展。热更新(HMR)通过WebSocket实现无刷新模块替换。Webpack提供丰富的生命周期钩子,并支持Tree Shaking、代码分割等优化方案。相比Vite等新型工具,Webpack采用打包器范式,适合复杂项目但启动较慢。其强大的扩展性和成熟生态使其仍是主流前端构建工具。

LYFlied的博客 730

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

对Webpack的深度解析

在开发阶段,webpack-dev-server会启动一个本地开发服务器,所以我们的应用在开发阶段是独立运行在localhost的一个端口上,而后端服务又是运行在另外一个地址上,所以在开发阶段中,由于浏览器同源策略的原因,当本地访问后端就会出现跨域请求的问题,通过设置webpack proxy实现代理请求后,相当于浏览器与服务端中添加一个代理者,当本地发送请求的时候,代理服务器响应请求,并将请求转发到目标服务器,目标服务器响应数据后再将数据返回给代理服务器,最终再由代理服务器将数据响应给本地。

On the way 960

VC中sqlite的使用

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

webpack学习笔记

前端工程化已成为前端工程师必须要掌握的知识点。webpack凭借其强大的生态和优秀的功能慢慢形成主导地位(rollup和vite 也同样优秀),从开始学会如何使用配置,慢慢的进一步深入理解其原理和流程,从而对整个工程化流程有个全面且系统的认知,进而逐步消化形成自己的知识体系。webpack是一个JavaScript应用程序的静态模块打包器(module bundler)。它会通过递归形式构建一个资源与模块之间的依赖关系图(dependency graph),并根据此构建一个或多个bundle。模块打包。

Bennett_G博客 489

从零构建Vue脚手架:基于Webpack5的工程化实践

前端工程化是现代Web开发的核心环节,其中模块打包工具webpack通过loader和plugin机制实现了代码转译、资源优化等关键功能。其工作原理是基于依赖图谱分析,将各种静态资源转换为浏览器可执行的bundle文件。在Vue项目开发中,webpack配合vue-loader能高效处理单文件组件(SFC),实现开发环境热更新(HMR)和生产环境代码优化。这种技术组合特别适合需要深度定制构建流程的企业级应用,以及追求构建性能优化的微前端架构场景。通过合理配置webpack的splitChunks和cache

weixin_34034261的博客 443

从源码到部署:深入理解webpack-bin的工作原理

webpack-bin是一个功能强大的webpack代码沙箱工具,它允许开发者在浏览器中实时编写、编译和预览webpack项目,无需复杂的本地环境配置。本文将深入解析webpack-bin的工作原理,从源码结构到部署流程,帮助你全面了解这个便捷的开发工具。 ## 项目架构概览 webpack-bin的项目结构清晰,主要分为客户端和服务器端两大部分。客户端负责用户界面和交互,服务器端则处理代码编

gitblog_00424的博客 585

vue 学习20220323

vue webpack 学习

weixin_45793819的博客 232

Webpack与Vue.js完美结合:单文件组件处理

你是否还在为Vue单文件组件(SFC, Single-File Component)的构建配置而困扰?面对错综复杂的loader链和插件组合,是否感觉无从下手?本文将系统讲解Webpack处理Vue单文件组件的完整方案,从基础配置到高级优化,帮助你彻底掌握这一前端开发核心技能。读完本文,你将能够: - 从零搭建支持Vue单文件组件的Webpack环境 - 理解vue-loader的工作原理及内部...

gitblog_00330的博客 719

前端面试100问系列 | 第10章:工程化与构建工具考点

ESLint:代码质量检查(错误预防、风格统一),可自定义规则。Prettier:代码格式化(统一风格),零配置理念。对比ESLintPrettier作用检查代码质量 + 部分风格统一代码格式规则数量数百条(可配置)少量(几乎零配置)自动修复部分支持(--fix全部支持冲突可能与Prettier冲突可通过解决题号核心考点一句话记忆1Webpack流程初始化→编译→构建→输出2Loader转文件,Plugin扩流程3HMR原理WS通知→增量编译→模块替换→刷新回退4。

qq_39147931的博客 332

前端项目 `npm run dev` 全链路深度解析:从终端到浏览器

npm run dev全链路解析:现代前端工程化核心流程 本文深入剖析了npm run dev命令背后的完整工作流,揭示了现代前端工程化的核心技术架构: 命令执行阶段: npm解析package.json脚本,构建执行环境 自动注入NODE_ENV等关键环境变量 支持pre/post钩子脚本的生命周期管理 构建工具启动: Vite采用极速冷启动优化(100-500ms) 按需初始化插件系统和文件监听 依赖预构建机制显著提升性能(比Webpack快5-10倍) 开发服务器架构: 即时建立的HTTP服务器和We

老前端的功夫 1981

uniapp多模块开发必备:动态生成pages.json的3种实战方案对比

本文深度解析了Uniapp多模块开发中动态生成pages.json的三种工程化方案:Node.js脚本预生成、Webpack钩子实时注入与Vite插件热更新。通过对比各方案的原理、实现与适用场景,为不同项目阶段和构建工具的中大型Uniapp项目提供了清晰的选型指南,旨在解决配置文件冲突、提升团队协作效率和项目可维护性。

weixin_29230901的博客 403

【前端工程化】Webpack介绍

当然前端工程化包含的东西太多,思维导图里只是一部分我用过的选型。那从Webpack开始,如果有机会别的工具小鱼也会一点点的讲到。

cherry__yu的博客 1635

【前端工程化面试题目】webpack 的热更新原理

可以在顺便学习一下 vite 的热更新原理,请。首先有几个知识点需要明确。

有一棵树的博客 1154
上一篇: 工程化:Webpack 层面如何做性能优化
下一篇: WebSocket
小码哥・Martin
博客等级 码龄18年 10粉丝 225原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小码哥・Martin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值