前端架构: 实现脚手架处理简单的命令注册和参数解析

TypeScript + React + Ink:构建现代化命令行工具的技术栈实践 在软件开发领域,命令行界面(CLI)工具是开发者与系统交互的重要桥梁。其核心原理在于通过终端接收指令并执行相应任务。随着工具复杂度的提升,传统的基于字符串拼接和命令式输出的开发模式在状态管理、界面维护和开发体验上面临挑战。TypeScript 作为 JavaScript 的超集,通过静态类型系统为工程化开发提供了坚实的类型安全保障,能有效减少运行时错误。React 的声明式 UI 和组件化模型,则将前端领域成熟的状态驱动视图范式引入终端开发,使得构建包含动态列表、进度条等复杂交互的界面变得直观高效。Ink 阅读详情

实现简单的命令注册和参数解析


1 )概述

  • 这里不会使用任何第三方工具,而是给大家讲解一下参数解析的一个实现原理
  • 实现两个目标
    • 第一目标是注册一个命令 $ xyzcli init 这个命令就可以完成一个自己的操作
    • 第二个是实现参数解析
      • 希望能够实现 --version 的一个参数解析
      • 以及 init -name 这样的一个参数解析

2 )实现

  • 那么问题来了,如何能识别到这个 init 命令 $ xyzcli init

  • 在nodejs中有一个 process 的内置库

  • 在 process 中会有一个 argv 参数,这个就会把我们所有的参数给罗列下来

    • 第1个返回值是:当前node命令的具体路径
    • 第2个返回值是:当前脚手架命令,如xyzcli的具体路径
    • 第3个返回值是:command, 在这里可以就是 init
      #!/usr/bin/env node
      
      // 定义执行命令的库
      const lib = {
        init() {
          console.log('init')
        }
      }
      
      // 获取并解析 argv
      const { argv } = require('process');
      // console.log(argv)
      const command = argv[2];
      // console.log(command); // init
      if (command && lib[command]) {
        lib[command](); // 执行
      } else {
        console.log('请输入命令')
      }
      
  • 通过以上方法,就可以解析出来 init 命令

  • 那如果需要解析出 --name ooo 这种参数呢?

    #!/usr/bin/env node
    
    const { argv } = require('process');
    
    const options = argv.slice(3); // 解析从第3个后面
    let [option, param] = options;
    option = option.replace('--', '');
    
    // 测试参数
    console.log('option: ', option); // name
    console.log('param: ', param); // ooo
    
  • 如何应用参数呢?

    #!/usr/bin/env node
    
    // 定义执行命令的库
    const lib = {
      init({ option, param }) {
        console.log('执行 init 流程', option, param)
      }
    }
    
    // 获取并解析 argv
    const { argv } = require('process');
    const command = argv[2];
    let option, param;
    const options = argv.slice(3);
    if (options) {
      [option, param] = options;
      option = option.replace('--', '');
    }
    if (command && lib[command]) {
      lib[command]({ option, param }); // 执行
    } else {
      console.log('请输入命令')
    }
    
  • 注意,实际参数解析往往比较复杂,比如:

    • $ xyzcli init --name -p 22 --test 33
    • 这种往往参数比较复杂,而且对应的值非常不确定,这个时候,参数处理就会变得非常困难
    • 如果自己开发和兼容此类问题,将会占用非常大的工作
    • 通常我们用一些库进行处理, 这里只做原理解析
  • 对全局命令的处理 $ xyzcli --version

    • 注意,这里 --version 属于 command, 也就是出现在了 argv 的第三位
    • 这种,就是顶级的或全局的 option
      #!/usr/bin/env node
      
      // 定义执行命令的库
      const lib = {
        init({ option, param }) {
          console.log('init');
          console.log('执行 init 流程', option, param);
        },
        version: '1.0.0' // 注意,这里的version需要读取package.json中的配置,这里只是简单演示
      }
      // 获取并解析 argv
      const { argv } = require('process');
      const command = argv[2];
      let option, param;
      const options = argv.slice(3);
      if (options.length) {
        [option, param] = options;
        option = option.replace('--', '');
      }
      
      // 执行命令
      if (command && lib[command]) {
        lib[command]({ option, param }); // 执行
      } else if(command.startsWith('--') || command.startsWith('-')) {
        // 这里是全局 options
        const globalOption = command.replace(/--|-/g, '');
        if (globalOption === 'version' || globalOption === 'V') {
          console.log(lib['version']);
        }
      } else {
        console.log('请输入命令')
      }
      
  • 以上演示,完成整个脚手架的一个初步版本开发

  • 注意这里不是成熟的案例,只是阐述如何做的原理

Ornith-1.0开源模型:智能体编程的技术突破与实践指南 在智能体编程领域,开发者们长期面临一个核心挑战:如何让AI模型不仅能够生成代码片段,还能像真正的软件工程师一样理解复杂任务、自主规划执行步骤并持续优化解决方案。Ornith-1.0开源模型家族的发布,正是针对这一痛点的重要突破。 1. Ornith-1.0模型家族概述 1.1 什么是Agentic Coding Agentic Coding(智能体编程)是指AI模型能够以智能体的方式执行编程任务,这超越了传统的代码补全或片段生成。智能体编程模型具备自主规划、工具使用、错误修复和持续优化的能力,能够处理从需求 阅读详情

相关推荐

第 17 课:cli 功能设计(上)

背景 相信前端小伙伴们都使用过诸如 vue-cli,create-react-app 等命令行工具。经过前面课程的学习,已经完成了项目模板的搭建,我们实现脚手架工具的第一步已经完成。接下来我们来实现一个 cli 命令,通过 cli 命令快速实现项目的初始化。 命令行工作流程 我们给命令行工具命名为 kgt-cli,下图是 kgt-cli 的工作流程图: 用户在终端中运行 kgt init te...

weixin_48109878的博客 292

前端创建脚手架-脚手架命令注册和参数解析-3

前端创建脚手架-脚手架命令注册和参数解析-3

l1134的博客 502

02-脚手架开发入门(前端架构师入门笔记)

前端架构师入门笔记:02-脚手架开发入门

前端-张冠的博客 1662

前端架构: 脚手架开发流程中的难点梳理

创建 npm 项目,创建脚手架入口文件,最上方添加:#!/usr/bin/env node,配置 package.json, 添加 bin 属性,编写脚手架代码,将脚手架发布到 npm

Wang的专栏 2115

别再写前端了!用Gradio 3.x + HuggingFace Spaces,5分钟把你的Python算法变成网页应用

本文介绍如何利用Gradio 3.x和HuggingFace Spaces快速将Python算法转化为网页应用,无需前端开发经验。通过5行代码和简单的Git命令,即可实现专业级Web界面部署,大幅提升算法展示效率。特别适合算法工程师和数据科学家快速分享模型成果。

weixin_33443333的博客 332

Maven

是一款自动化构建工具,专注于Java项目的构建、依赖的管理。

weixin_58738870的博客 2163

前端架构 —— 脚手架的开发流程

vue addOptions:-h, --helpOptions:......还有很多,比如:......

weixin_44045283的博客 427

ANSYS Fluent热边界条件避坑指南:为什么你的自然对流计算结果总出错?

本文深入剖析了在ANSYS Fluent中进行自然对流仿真时,导致计算结果出错或发散的核心原因与解决方案。重点解析了重力项与操作密度设置、Boussinesq与不可压缩理想气体模型的抉择、以及压力离散格式(推荐Body Force Weighted)这三大关键雷区,并结合电子机箱散热等实战案例,提供了一套稳定可靠的仿真设置流程与调试技巧。

weixin_28396629的博客 741

脚手架开发(2)-注册阶段

点击查看脚手架系列文章总览【正在更新】 个人网站:www.dengzhanyong.com 关注公众号【前端筱园】,不错过每一篇文章 在上篇文章,已经完成了第一个阶段:准备阶段,在准备阶段做了许多基础工作,目的为保证满足脚手架的运行环境。 现在开始进入第二阶段:注册阶段,主要功能是完成命令的解析,以及命令的动态加载的实现。 前期改造 首先介绍两个常用的脚手架命令行交互工具包:yargs、commander 他们给我们在开发脚手架提供了极大的方便,功能大致相同,本篇文章使用的是 commander 作为.

邓占勇的博客 1446

INS/伪距组合导航(1)

星间单差GNSS/INS伪距紧组合

u014430081的博客 877

基于 STM32 的乒乓球发球机控制系统设计与实现

乒乓球发球机是一种能够按照预设参数自动、连续发出乒乓球的训练设备。本系统以 STM32F103C8T6 为主控核心,通过控制实现球速调节、实现落点与旋转方向控制、实现出球节奏控制,并配合 OLED 显示与按键人机交互,实现速度、频率、落点、旋转四大参数的可调发球训练。

weixin_42300449的博客 212

从0搭建vue3组件库: 如何完整搭建一个前端脚手架?

开发组件库CLI工具

随便写写 1142

(2-4-01)目标检测与分割:地面提取(1)

请看下面的例子,生成了虚拟 LiDAR 点云数据,然后使用 DBSCAN 聚类方法进行 LiDAR 地面提取,并根据聚类结果可视化地面和非地面点云。首先生成虚拟 LiDAR 点云数据,然后基于设定的高程阈值进行地面提取,并通过 Open3D 可视化地面和非地面点云。地面提取是LiDAR(激光雷达)数据处理中的一个重要步骤,其目标是从点云数据中分离出地面点,即地面表面上的点。LiDAR点云数据通常包含地面点和非地面点(例如建筑物、树木等),地面提取的目标是从这些点中准确识别和提取地面点。

码农三叔 703

Vue CLI 不是脚手架:它是前端工程化操作系统内核

Vue CLI 本质是一个可配置、可扩展的前端工程化操作系统内核,它通过统一配置契约(vue.config.js)、插件机制(@vue/cli-plugin-*)和钩子系统,将 webpack、Babel、ESLint 等工具深度集成。其核心价值在于构建时序控制、配置优先级融合与跨工具协同——例如 Babel 作为 Vue 编译器前置哨兵保障 `<script setup>` 宏解析,webpack 模块联邦支撑微前端架构演进。这些能力使 Vue CLI 成为 Vue 3 项目稳定交付、性能优化与复杂场景(

weixin_33912246的博客 482

第一节:Vben Admin介绍和初次运行

本文是【实战Vben Admin + Python】的第一节,本文内容主要是介绍Vben Admin框架和我们后端使用的技术,开发环境和工具的准备本节文章的目的是Vben Admin的简单介绍,通过配置可以让项目前端运行起来,由于项目默认开启了mock,展示的都是静态模拟数据,我们在此基础上,下一节将研究分析下Vben Admin的目录。为我们后端搭建准备。

cuiwin的专栏 7420

ssm框架搭建

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

深入解析AI智能体框架CLI:从命令行到交互式REPL的实现

命令行界面(CLI)是开发者与复杂系统交互的核心入口,其设计直接影响工具的使用效率与体验。CLI通过解析用户输入的命令与参数,将后端功能封装为简洁的指令,是现代开发工作流中不可或缺的效率倍增器。其技术价值在于提供了自动化、可脚本化的操作方式,并能通过管道等机制灵活组合功能。在AI智能体等新兴领域,一个设计良好的CLI更是连接用户与智能能力的桥梁,它需要处理配置加载、模型初始化、插件管理等复杂任务,并最终驱动一个功能完备的交互式REPL环境。本文以**Hermes Agent**框架为例,深入剖析其**CLI

weixin_30632883的博客 338

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

前端工程化,你做了多少?

前端工程化是近几年比较热门的一个东西,大大小小的团队也在朝着这一方向发展,那么你的团队做了多少呢? 前端发展简史 石期时代 最初的前端页面都是一些静态页面,人们看到的网页就像报纸一样。 青铜时代 后端为主的时代,往往页面都是后端利用一些模版引擎来完成页面;对于有大量页面的项目,前端在写页面需要构造一定的环境,比如jsp,php等。 铁器时代 随着ajax的诞生,浏览器可以...

dianfenju4557的博客 389

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

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Node.js 自定义命令行工具

Node.js 自定义命令

原名又逢乱世。不要放下学习的脚步,毕竟比天天打牌、钓鱼、打游戏更能从内在充实自己。 880

腾讯IVWEB前端工程化工具feflow思考与实践

本篇文章主要介绍腾讯IVWEB团队从0到1在工程化的思考和实践。feflow的全称是Front-end flow(前端工作流),致力于提升研发效率和规范的工程化解决方案。愿景是通过feflow,可以使项目创建、开发、构建、规范检查到最终项目上线的整个过程更加自动化和标准化。 要解决的问题 项目的目录结构按约定生成 团队有一套开发规范进行约束 支持多种类型的构建,包括Fis构建和web...

banyan3646的博客 854

浅谈前端工程化

前端发展简史 石期时代 最初的前端页面都是一些静态页面,人们看到的网页就像报纸一样。 青铜时代 后端为主的时代,往往页面都是后端利用一些模版引擎来完成页面;对于有大量页面的项目,前端在写页面需要构造一定的环境,比如jsp,php等。 铁器时代 随着ajax的诞生,浏览器可以主动从服务端拉取数据,前后端分离的时代到来,SPA应运而生,前端可以处理一些复杂的交互、业务逻辑。 工业时代 随着前端扮演的角...

责任与担当 434

RTOS优先级反转导致机器人卡顿的根因与解决

实时操作系统(RTOS)中的任务调度机制是嵌入式实时控制的核心基础,其原理直接影响工业机器人、AGV等设备的响应确定性。当高优先级任务因共享资源竞争被低优先级任务间接阻塞时,便发生优先级反转——一种隐蔽却致命的实时性破坏现象。该问题不触发报错,却导致毫秒级不可预测延迟,典型表现为PID控制抖动、视觉-动作协同失步或力反馈异常。借助互斥信号量的优先级继承机制,可动态提升持有资源任务的优先级,压缩高优任务等待窗口;结合GD32F103等Cortex-M3平台的FreeRTOS配置实践,能有效驯服这一‘幽灵式’卡

weixin_34320724的博客 679

OpenClaw智能体框架:从核心架构到生产部署的完整指南

智能体(Agent)作为人工智能领域的关键技术,其核心在于让AI模型不仅能理解指令,还能自主规划并调用工具完成任务。这一原理通过模块化架构实现,将任务分解、工具调用、状态管理等复杂流程标准化,从而大幅提升开发效率与系统可控性。其技术价值在于将大语言模型的认知能力与具体业务工具无缝衔接,推动AI从对话走向实干。在实际应用场景中,智能体框架广泛应用于自动化客服、数据分析、智能运维和业务流程自动化等领域。本文聚焦的OpenClaw,正是一个践行此理念的开源智能体开发与部署框架。它通过解耦的LLM Core、Ski

weixin_30932215的博客 379

Node.js CLI工具箱:模块化设计与自动化开发实践

命令行工具(CLI)是现代开发工作流中提升效率的关键技术,它通过脚本化操作将重复任务自动化。其核心原理在于将复杂操作封装为可执行命令,利用参数解析和管道机制实现灵活调用。在工程实践中,CLI工具的价值体现在标准化开发流程、减少人为错误和提升团队协作效率。Node.js生态为此提供了完善支持,commander.js、inquirer.js等库简化了参数解析、交互界面等通用功能的开发。典型的应用场景包括项目脚手架生成、代码片段自动创建、文件批量处理等日常开发任务。rex-cli项目正是基于这种模块化思想构建的

weixin_28728279的博客 356
上一篇: 前端架构: 调试与发布本地脚手架最佳实践梳理
下一篇: Vue2源码梳理:关于数据驱动,与new Vue时的初始化操作
Wang's Blog
博客等级 码龄12年 7434粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

Wang's Blog

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

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

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

打赏作者

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

抵扣说明:

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

余额充值