模块化之CommonJs、AMD、CMD和ES6模块化

前端模块化,AMD,CMD,ES6 Module,CommonJS,ES6 模块与CommonJS 模块的差异 前端模块化 问题: 为什么前端要使用模块化? ​ 模块化: 是具有特定功能的一个对象( 广义理解 ) ​ 模块定义的流程: ​ 1.定义模块(对象) ​ 2.导出模块 ​ 3.引用模块 ​ 好处: 可以存储多个独立的功能块 复用性高 分类 1. AMD AMD规范采用异步方式加载模块,模块的加载不影响它后面语句的运行。所有依赖这个模块的语句,都定义在一个回调函... 阅读详情

模块是将一个复杂的程序依据一定的规则(规范)封装成几个块(文件), 并进行组合在一起。块的内部数据与实现是私有的, 只是向外部暴露一些接口(方法)与外部其它模块通信

模块化有两个重要的概念:模块的导出和模块的导入

  • 模块的导出:暴露接口的过程即模块的导出

  • 模块的导入:当通过某种语法或API去使用一个模块时,这个过程叫做模块的导入

1、CommonJS

因为CommonJs是node服务提出的模块化规范,所以我们首先需要安装node环境

安装nodeJs

官网地址:https://nodejs.org/zh-cn/

安装完成后在dos窗口中输入node命令验证

使用nodeJs

在node环境中运行index.js文件

node index.js

nodejs直接运行某个js文件,该文件被称之为入口文件

为什么要有CommonJS?

在nodejs中,由于有且仅有一个入口文件(启动文件),而开发一个应用肯定会涉及到多个文件配合,因此,nodejs对模块化的需求比浏览器端要大的多。由于nodejs刚刚发布的时候,前端没有统一的、官方的模块化规范,因此,它选择使用社区提供的CommonJS作为模块化规范。

CommonJS使用

CommonJS使用exports导出模块,导出的是一个对象,require导入模块

具体规范如下:

  1. 如果一个JS文件中存在exports或require,该JS文件是一个模块
  2. 模块内的所有代码均为隐藏代码,包括全局变量、全局函数,这些全局的内容均不应该对全局变量造成任何污染
  3. 如果一个模块需要暴露一些API提供给外部使用,需要通过exports导出,exports是一个空的对象,你可以为该对象添加任何需要导出的内容
//utils.js
function getNumber(){
    return 1
}
exports = {
    getNumber:getNumber  //导出getNumber方法
}
//等同于
exports.getNumber = function(){
    return 1; //导出一个方法叫getNumber
 }
//等同于
function getNumber(){
    return 1
}
module.exports = {getNUmber}
  1. 如果一个模块需要导入其他模块,通过require实现,require是一个函数,传入模块的路径即可返回该模块导出的整个内容
//index.js
const util = require("./utils.js")
//等同于
const {getNumber} = require("./utils.js")
//等同于
console.log(require("./utils.js").getNumber())

注意:必须加路径./或../不可省略,否则会报错!

nodejs对CommonJS的实现

为了实现CommonJS规范,nodejs对模块做出了以下处理

  1. 为了保证高效的执行,仅加载必要的模块。nodejs只有执行到require函数时才会加载并执行模块

  2. 为了隐藏模块中的代码,nodejs执行模块时,会将模块中的所有代码放置到一个函数中执行,以保证不污染全局变量。(node笔记中解释)

     (function(){
         //模块中的代码
     })()
    
  3. 为了保证顺利的导出模块内容,nodejs做了以下处理

    1. 在模块开始执行前,初始化一个值module.exports = {}
    2. module.exports即模块的导出值
    3. 为了方便开发者便捷的导出,nodejs在初始化完module.exports后,又声明了一个变量exports = module.exports
     (function(module){
         module.exports = {};
         var exports = module.exports;
         //模块中的代码
         return module.exports;
     })()
    
  4. 为了避免反复加载同一个模块,nodejs默认开启了模块缓存,如果加载的模块已经被加载过了,则会自动使用之前的导出结果

CommonJS的工作原理

当使用require(模块路径)导入一个模块时,node会做以下两件事情(不考虑模块缓存):

  1. 通过模块路径找到本机文件,并读取文件内容
  2. 将文件中的代码放入到一个函数环境中执行,并将执行后module.exports的值作为require函数的返回结果

正是这两个步骤,使得CommonJS在node端可以良好的被支持

可以认为,CommonJS是同步的,必须要等到加载完文件并执行完代码后才能继续向后执行

2、AMD

当浏览器遇到CommonJS

当想要把CommonJS放到浏览器端时,就遇到了一些挑战

  1. 浏览器要加载JS文件,需要远程从服务器读取,而网络传输的效率远远低于node环境中读取本地文件的效率。由于CommonJS是同步的,这会极大的降低运行性能
  2. 如果需要读取JS文件内容并把它放入到一个环境中执行,需要浏览器厂商的支持,可是浏览器厂商不愿意提供支持,最大的原因是CommonJS属于社区标准,并非官方标准

因为浏览器无法支持模块化。出现了AMD和CMD规范,有效的解决了浏览器模块化的问题。

AMD(Asynchronous Module Definition):异步模块加载机制

require.js实现了AMD规范

在AMD中,导入和导出模块的代码,都必须放置在define函数中

define([依赖的模块列表], function(模块名称列表){
    //模块内部的代码
    return 导出的内容
})

在AMD中,入口文件需要特殊指明,用data-amin属性标记

<body>
    <script data-main="./index.js" src="./require"></script>
</body>
AMD使用
//utils.js
define(function(){
    let data = []
    //...模块内部代码 进行一系列
    return {
        name:"导出的内容",
        data:data
    }
})
//index.js
define(['utils'], function(utils) {
    //等utils模块加载完成后执行自己的模块,参数utils是utils模块导出的内容
    return {
        name:"index模块的内容"
    }
});

如果多个文件都用到了同一个模块,模块只会读取一次,执行一次,会加入缓存中

后来,require也实现了CMD规范

//utils2.js
define(function(require, exprots,module) {
    const utils = require("./utils.js")
    console.log("utils模块代码",utils)
    module.exprots = "导出utils2模块的内容"    
});

注意:可以省略./,但最好不要省略

3、CMD

CMD(Common Module Definition):公共模块定义规范

sea.js实现了CMD规范

在CMD中,导入和导出模块的代码,都必须放置在define函数中,内部实现类似CommonJs

define(function(require, exports, module){
    //模块内部的代码
})
CMD简单使用
define(function(require, exprots,module) {
    const utils1 = require("./utils1.js")
    const utils2 = require("./utils2.js")
    module.exprots = "导出该模块的内容"    
});

通过异步方式导入模块

define(function(require, exprots,module) {
    require.async("./utils1.js",function(utils1){
        console.log(utils1)
    })
    require.async("./utils2.js",function(utils2){
        console.log(utils2)
    })
    module.exprots = "导出a模块的内容"    
});

4、ES6模块化

ECMA组织参考了众多社区模块化标准,终于在2015年,随着ES6发布了官方的模块化标准,后成为ES6模块化

模块化声明方式有两种

  1. 依赖延迟声明 ,如:commonjs
    1. 优点:某些时候可以提高效率
    2. 缺点:无法在一开始确定模块依赖关系(比较模糊)
  2. 依赖预声明 ,如: cmd,amd,es6模块
    1. 优点:在一开始可以确定模块依赖关系
    2. 缺点:某些时候效率较低

ES6模块化具有以下的特点

  1. 使用依赖预声明的方式导入模块
  2. 灵活的多种导入导出方式
  3. 规范的路径表示法:所有路径必须以./或…/开头

模块的引入

注意:这一部分非模块化标准

目前,浏览器使用以下方式引入一个ES6模块文件

<script src="入口文件" type="module">

ES6导入和导出

1、基本导入和导出

  • 基本导出:

基本导出可以有多个,每个必须有名称。export 声明表达式

// 基本导出,声明语句
export const name = "lkx" //导出name = "llx"
export function test(){
    console.log("导出函数test")
}

其他写法export {具名符号}

const age = 10
const sex = "男"
export {
    age,
    sex
}
//将age变量的名称作为导出的名称,将age的值,作为导出的值
// 等同于
export const age = 10
export const sex = "男"

也可以给导出变量起别名

const name = 10
export {
    name as name1
}

由于基本导出必须具有名称,所以要求导出内容必须跟上声明表达式或具名符号

  • 基本导入:

由于使用的是依赖预加载,因此,导入任何其他模块,导入代码必须放置到所有代码之前

(不在开头也可以,浏览器预编译时进行import导入提升)不是解构赋值

对于基本导出,如果要进行导入,使用下面的代码

import {导入的符号列表} from "模块路径" 
import {name,test} from "./until.js"
console.log(name)
console.log(test())

注意以下细节:

  1. 导入时使用的符号是常量,不可修改

  2. 导入时,可以通过关键字as对导入的符号进行重命名

import {name,test as t} from "./until.js"
console.log(t())
  1. 可以使用*号导入所有的基本导出,形成一个对象
import * as obj from "./b.js"
//会把所有导出的内容形成一个对象,必须使用as重命名
  1. 多个文件导入同一个模块,会加入缓存,不会重复运行
import "./init.js"
//这个导入语句,仅运行文件,不会导入模块,如果有缓存,不运行

2、默认导入和导出

  • 默认导出

每个模块,除了允许有多个基本导出之外,还允许有一个默认导出

默认导出类似于CommonJS中的module.exports,由于只有一个,因此无需具名

具体的语法是

export default 默认导出的数据
//或
export {默认导出的数据 as default}

基本使用

export default {
    name:name,
    age:18
}
  • 默认导入

需要想要导入一个模块的默认导出,需要使用下面的语法

import 接收变量名 from "模块路径"

由于默认导入时变量名是自行定义的,因此没有别名一说

import data from "./utils.js"
console.log(data)

基本导入和默认导入混合使用:

如果希望同时导入某个模块的默认导出和基本导出,可以使用下面的语法:

import 接收默认导出的变量, {接收基本导出的变量} from "模块路径"


export const sex = "fale"
export default {
    name:name,
    age:18
}

import data,{sex} from "./utils.js"
console.log(data,sex)

注:如果使用*号,会将所有基本导出和默认导出聚合到一个对象中,默认导出会作为属性default存在

//b.js
export const sex = "fale"
export default {
    name:name,
    age:18
}

import * as data from "./b.js"
console.log(data)
注意:
  1. 尽量导出不可变值

当导出一个内容时,尽量保证该内容是不可变的(大部分情况都是如此)。因为,虽然导入后,无法更改导入内容,但是在导入的模块内部却有可能发生更改,这将导致一些无法预料的事情发生

导入的模块是常量

import { name } from "./b.js"
name = 10 //报错
  1. 可以使用无绑定的导入用于执行一些初始化代码

如果我们只是想执行模块中的一些代码,而不需要导入它的任何内容,可以使用无绑定的导入:

import "模块路径"
  1. 可以使用绑定再导出,来重新导出来自另一个模块的内容

有的时候,我们可能需要用一个模块封装多个模块,然后有选择的将多个模块的内容分别导出,可以使用下面的语法轻松完成

export {绑定的标识符} from "模块路径"
ROS2实战:从零部署Cartographer激光SLAM系统 本文详细介绍了在ROS2 Humble环境下,从零开始部署Cartographer激光SLAM系统的完整实战流程。内容涵盖环境准备、Cartographer安装(APT与源码编译两种方式对比)、工作空间与功能包创建、核心启动文件与Lua配置文件编写、系统构建与可视化启动,以及地图保存与实战调参技巧,帮助开发者快速构建稳定可靠的机器人SLAM应用。 阅读详情

相关推荐

必看!wechat-article-exporter:轻松批量下载公众号文章

微信搜索“”关注公众号。在信息爆炸的时代,我们每天都会接触到大量优秀的微信公众号文章。有时候,我们想要将这些精彩的内容保存下来,以便日后回顾或者分享给更多的人。然而,微信公众号并没有提供直接的批量下载功能,这给我们带来了不少困扰。今天,我要给大家分享一款非常实用的软件——wechat-article-exporter,它能够帮助我们轻松地批量下载微信公众号文章,让你不再为文章的保存而烦恼。

王乐平 技术博客 4355

简述JavaScript模块化编程(二)

前置阅读:简述JavaScript模块化(一) 在前面一文中,我们对前端模块化所经历的三个阶段进行了了解: CommonJs,由于是同步的,所以主要应用于服务器端,以Node.js为代表。 AMD,异步模块定义,预加载,推荐依赖前置。以require.js为代表。 CMD,通用模块加载,懒加载,推荐依赖就近。以Sea.js为代表。 而在ES6已经大行其道的今天,ES...

weixin_30394669的博客 431

龙迅LT9611UXC芯片简介:Dual-Port MIPI DSI/CSI to HDMI2.0 with Audio

龙迅半导体推出的LT9611UXC是一款高性能MIPI转HDMI2.0转换器,支持DSI/CSI接口转换,兼容多种视频格式(RGB/YCbCr),最高支持4K@60Hz输出。该芯片集成音频处理(I2S/SPDIF)、色彩空间转换和3D功能,适用于机顶盒、电视盒子等消费电子及车载设备。提供工业级(-40℃~+85℃)和车规级(AEC-Q100认证)版本,采用QFN64封装。

MB16698594834的博客 1334

AMD规范、CMD规范、CommonJS

一、AMD规范 AMD规范,全称是Asynchronous Module Definition,即异步模块加载机制。完整描述了模块的定义,依赖关系,引用关系以及加载机制。 AMD的核心是预加载,先对依赖的全部文件进行加载,加载完了再进行处理。 实际上AMD 是 RequireJS 在推广过程中对模块定义的规范化的产出 优点: 适合在浏览器环境中异步加载模块。可以并行加载多个模块。 缺点: 提高了开发成本,并且不能按需加载,而是必须提前加载所有的依赖。 RequireJS主要解决了两...

zyz00000000的博客 2585

嵌入式系统存储体系

主要分为三种:高速缓存(cache)、主存和外存。

weixin_43586667的博客 2265

usb设备的定位信息获取

一个usb hub有20个口,每个口有一个标号,那么如果一个为X的标号插入了一个android设备,如何通过函数,得到这个X,代码实现如下,获取了location, 得到类似 Port_#0002.Hub_#0003 的字符串,然后,要对应一个表。

babytiger的专栏 2106

前端模块化CommonJS、AMD、CMD、ES6

在前端开发中,模块化是一种重要的代码组织方式,它有助于将复杂的代码拆分成可管理的小块,提高代码的可维护性和可重用性。CommonJS、AMD(异步模块定义)和CMD(通用模块定义)是三种不同的模块规范,它们在定义模块、加载模块以及依赖管理等方面存在差异,并适用于不同的场景。

警警的博客 2332

麦克风声源定位原理_声源定位—如何定位到噪声根源?

前言TPA(传递路径分析)专题系列已经开篇。其遵循方法论:源(Source)——路径(Path)——响应(Receiver)有人说TPA好,它可以识别出路径处甚至源的载荷特征,可以量化各个路径的贡献量。有人说声源定位好,不管东西南北中,“源”自其中。但是,声源定位识别出来色彩丰富的一个结果,这结果被您拿来应付工作了,还是真正帮您解决了问题?声源定位定位到了噪声的根源了么?对于一些声源现,...

weixin_39943678的博客 3973

CommonJS、AMD、CMD、ES6模块化区别详细总结

一、CommonJS、AMD、CMD、ES6知识点简单概述 (1)CommonJS NodeJS是CommonJS规范服务器端的实现,webpack也是CommonJS的形式书写。同步加载,服务器端从磁盘中读取速度快,运行在服务器端没有问题。 (2)AMD AMD是Asynchronous Module Definition异步模块定义。 基于CommonJS规范的node.JS是服务端模块化的实现。实现浏览器端的模块化就是AMD,且能与服务器端兼容最好。同一个模块在服务器端和浏览器端都可以维护运行,简单方

weixin_45709829的博客 7779

结合MATLAB/Simulink和多体动力学仿真软件UM(Universal Mechanism),建立高速列车轴箱轴承的动力学模型,并通过联合仿真分析其正常运行特性和典型故障模式

高速列车是现代交通运输的重要组成部分,其运行速度高、载客量大,对安全性和可靠性提出了极高的要求。轴箱轴承作为高速列车的关键部件之一,承担着传递载荷和支撑车轴的重要作用。然而,由于长期运行在高速、重载和复杂工况下,轴箱轴承容易出现疲劳磨损、润滑失效和裂纹等故障,从而影响列车的安全性。本项目旨在结合MATLAB/Simulink和多体动力学仿真软件UM(Universal Mechanism),建立高速列车轴箱轴承的动力学模型,并通过联合仿真分析其正常运行特性和典型故障模式。

xiaoheshang_123的博客 330

控制科学与工程(自动化)保研经验【4】——浙大篇

控制科学与工程(自动化)保研经验【4】——浙大篇

Control Everything 1万+

js模块化 Common.js / AMD / CMD / es6

js模块化

qq_43631129的博客 1155

2026.4.15:超详细自动安装Ubuntu-Server的保姆级教程

这篇教程详细介绍了如何创建无人值守的Ubuntu Server 26.04自动安装镜像。主要内容包括:从安装镜像中提取autoinstall-user-data文件并修改为user-data配置文件;使用mkpasswd生成加密密码;通过软碟通工具修改ISO镜像,添加自动安装所需的user-data和meta-data文件;编辑grub.cfg引导文件以启用自动安装模式。教程提供了完整的yaml配置示例,包含网络、存储、用户等设置,并演示了最终制作完成的自动安装镜像效果。

拥抱具身智能,昇腾Ascend C 747

javascript模块化之CommonJS、AMD、CMD、UMD、ES6

这是一篇关于js模块化编程的总结记录 javascript模块化之CommonJS、AMD、CMD、UMD、ES6

皖林的博客 2万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

前端模块化(CommonJS、AMD、CMD、ES6模块化区别)

什么是模块 模块化的进化过程 全局function模式 : 将不同的功能封装成不同的全局函数 namespace模式 : 简单对象封装 2.3IIFE模式:匿名函数自调用(闭包) 2.4IIFE模式增强 : 引入依赖 3.模块化的好处 4.引入多个script后出现出现问题 二、模块化规范 1.CommonJS 1.1基本语法 1.2模块的加载机制 2.AMD 2.1基本语法 2.2模块的加载机制 3.CMD 3.1基本语法 3.2模块的加载机制 4.ES6模块化 ES6 模块与 CommonJS 模块的差

LYFlied的博客 2107

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

前端模块化——CommonJS、AMD、CMD、ES6规范

前言        随着技术的发展,各种前端库层出不穷,前端代码日益膨胀。如果不对前端代码加以模块化规范去管理,维护将变得异常困难。本文的主要内容是理解什么是模块化、为什么要模块化、模块化的优缺点以及当下最流行的AMD、CMD、CommonJS、ES6规范。本文旨在用通俗易懂的语言介绍抽象的概念,希望对大家有所帮助。 什么是模块...

五撸超人的博客 2223

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

JS中的几种模块化规范(CommonJS、AMD、CMD、ES6 Module)

引入问题:为什么要进行模块化? 1)模块化就是将系统分离成独立功能的模块,这样我们需要什么功能,就加载什么功能 2)模块化的好处: 避免命名空间的冲突(减少命名空间的污染) 更好的分离,实现按需加载 提高可代码的复用性 提高了代码的维护性 JS模块化大致发展过程 CommonJS(服务端)=》AMD(浏览器)=》CMD=》ES6 Module模块化 模块化规范的种类 模块化规范的发展趋势 终极:现代工具webpack webpack自己实现了一套模块机制,无论是CommonJs模块的require

Amelian的博客 3483

JS | CommonJS、AMD、CMD、ES6-Module、UMD五种JS模块化规范

在JavaScript中,常用的模块化规范有以下几种:CommonJS规范:主要用于服务器端编程,是Node.js采用的模块化规范。通过require方法加载模块,通过module.exports和export对象输出模块。AMD规范:主要用于浏览器端编程,是RequireJS采用的模块化规范。通过定义方。ES6模块规范:是ECMAScript 6采用的模块化规范,是JavaScript官方标准。通过export关键字输出模块,通过import。

青春木鱼的博客 2333

模块化思想CommonJS、AMD、CMD、ES6模块化

模块化思想就是JS中将不同功能的代码封装在不同的文件中, 再互相引用时不会发生命名冲突的一种思想, 大多数情况下, 一个文件就是一个模块。

subsistent的博客 489

弄懂前端模块化,CommonJS,AMD,CMD及ES6模块化

前言 之前一直对于前端的模块化理解的不太透彻,平常一直用的也只有ES6模块化,对于其他几种模块化规范用的也少,理解不够深,但是经常会见到一些面试题是问这几种模块化规范的区别,所以这次做一个整理总结 一、对于模块化的理解 什么是模块化? 模块化开发是一种管理方式,是一种生产方式,一种解决问题的方案,一个模块就是实现特定功能的文件,有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块,但是模块开发需要遵循一定的规范,否则就都乱套了,因此,才有了后来大家熟悉的AMD规范,CMD规范,以及ES

index_zhao的博客 787

【模块化】 js 模块化(CommonJS, AMD, UMD, CMD, ES6)

将介绍几种 js 模块化的规范,以及它们各自的优缺点和差异…

weixin_44100002的博客 1740

前端模块化:AMD, CMD, CommonJS, ES6 Module

模块化就是将一个大的功能拆分为多个块,每一个块都是独立的,你不需要去担心污染全局变量,命名冲突什么的,它们只是向外暴露特定的变量和函数。 模块化的好处:①解决命名冲突 ②依赖管理 ③代码更加可读 ④提高复用性 目前流行的js模块化规范有AMD、CMD、CommonJS以及ES6的模块系统。 本文重点掌握AMD与CMD的区别、CommonJS与ES6 Module的区别 一、AMD A...

若水弹丸之地 701

JavaScript之模块化( AMD、CMD、CommonJs 、ES6)

JavaScript之模块化( AMD、CMD、CommonJs 、ES6)

在所有的事情背后,要有一颗坚定的的本心,要有一颗应对变革和提升自我的本心,世界瞬息万变,本心要坚持到底,保持学习,时刻复盘 1163

AMD、CMD、UMD、CommonJS、ES6模块化☀️

AMD: 异步模块定义,AMD是RequireJs在推广过程中对模块定义的规范化产出,它是一个概念,RequireJs是对这个概念的实现。 //定义没有依赖的模块 define(function(){ return 模块 }) //定义有依赖的模块 define(['module1','module2'],function(m1,m2){ return 模块 }) CMD: 是SeaJs在推广过程中对模块定义的规范化产出,模块的加载是异步的。SeaJs是淘宝团队提供的一个模块开发框架。模块

imber___zsk的博客 511

模块化-CommonJs、AMD、CMD、ES6

在了解AMD,CMD规范前,还是需要先来简单地了解下什么是模块化,模块化开发?模块化是指在解决某一个复杂问题或者一系列的杂糅问题时,依照一种分类的思维把问题进行系统性的分解以之处理。模块化是一种处理复杂系统分解为代码结构更合理,可维护性更高的可管理的模块的方式。可以想象一个巨大的系统代码,被整合优化分割成逻辑性很强的模块时,对于软件是一种何等意义的存在。对于软件行业来说:解耦软件系统的复杂性,使得不管多么大的系统,也可以将管理,开发,维护变得“有理可循”。 模块化理解 1. 什么是模块 将复杂的程序依据一

qq_35500568的博客 494

JS模块化加载方式 ,AMD、CMD、CommonJS、ES6四者间的异同

1、异同对比 2、四种模块化加载方式的详说 2.1 AMD AMD 是 RequireJS 在推广过程中对模块定义的规范化产出。 步骤如下: 1、引入require.js,并用data-main指定入口的js文件。 2、在入口的js文件内用require.config配制各个模块的路径。 3、define定义js模块文件 4、require引入js模块文件 注意: require([ ],callback)首先异步加载数组内的模块,随后才会去执行callback; 例子如下: index.html &

yiyueqinghui的博客 4832
上一篇: Fetch概述-升级的网络请求
下一篇: Git简介以及简单使用
七钥
博客等级 码龄9年 744粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值