Vue2源码梳理:关于静态类型检查工具flow

vue3流程图组件vue flow使用 vue3流程图组件、vue flow、typescript 阅读详情

关于flow


1 ) 概述

  • https://flow.org/en/docs/getting-started/
  • Flow 是 facebook 出品的 JavaScript 静态类型检查工具
  • Vue.js 的源码利用了 Flow 做了静态类型检查,所以了解 Flow 有助于我们阅读源码
  • vue的源码,它并不是用纯ES6写的,用了flow作为这个静态语法检查工具
  • 关于vue2的版本,在 vue@2.6.14 都在使用,在 vue@2.7.0 开始向vue3版本靠了,都不用一套构建流程了
  • 所以,我们用的都是 2.6.14 以下的版本

2 ) Why 使用

  • JavaScript 是动态类型语言,它的灵活性有目共睹
  • 但是过于灵活的副作用是很容易就写出非常隐蔽的隐患代码
  • 在编译期甚至看上去都不会报错,但在运行阶段就可能出现各种奇怪的 bug。
  • 类型检查是当前动态类型语言的发展趋势,所谓类型检查,就是在编译期尽早发现(由类型错误引起的)bug
  • 又不影响代码运行(不需要运行时动态检查类型),使编写 JavaScript 具有和编写 Java 等强类型语言相近的体验
  • 项目越复杂就越需要通过工具的手段来保证项目的维护性和增强代码的可读性
  • Vue.js 在做 2.0 重构的时候,在 ES2015 的基础上,除了 ESLint 保证代码风格之外,也引入了 Flow 做静态类型检查
  • 之所以选择 Flow,主要是因为 Babel 和 ESLint 都有对应的 Flow 插件以支持语法
  • 可以完全沿用现有的构建配置,非常小成本的改动就可以拥有静态类型检查的能力

3 )Flow 的工作方式

  • 通常类型检查分成 2 种方式:
    • 类型推断:通过变量的使用上下文来推断出变量类型,然后根据这些推断来检查类型
    • 类型注释:事先注释好我们期待的类型,Flow 会基于这些注释来判断

flow的类型推断

  • 它不需要任何代码修改即可进行类型检查,最小化开发者的工作量
  • 它不会强制你改变开发习惯,因为它会自动推断出变量的类型
  • 这就是所谓的类型推断,Flow 最重要的特性之一
  • 安装flow: $ npm i -g flow-bin
  • flow 工具还有一个配置文件 .flowconfig, 使用 $ flow init 来创建
    [ignore]
    
    [include]
    
    [libs]
    
    [lints]
    
    [options]
    
    [strict]
    
  • 写一些代码: index.js
    /*@flow*/
    function split(str) {
      return str.split(' ')
    }
    split(11)
    
  • 上述代码中,split被字符串来调用,如果传入的是number, 则会报错,执行:$ flow,可见报错
  • 备注:代码中的 /@flow/ 是有用的,如果不加,则不会进行检查
  • 这个就是非常简单的类型推断, 但是下面的代码是不会报错的
    /*@flow*/
    function add(x, y){
      return x + y
    }
    add('Hello', 11)
    
  • 其实我们希望上述代码报错,如何修改呢?需要借助类型注释

flow的类型注释

1 )number类型

  • 修改上述代码,如下
    /*@flow*/
    function add(x: number, y: number): number {
      return x + y
    }
    add('Hello', 11)
    
  • 经过上述修改,再次运行 flow 就会报错,这里是ES6 和 TS中的标准语法
  • 现在 Flow 就能检查出错误,因为函数参数的期待类型为数字,而我们提供了字符串

2 )数组类型

  • 给出如下代码
    /*@flow*/
    var arr: Array<number> = [1, 2, 3]
    arr.push('Hello')
    
  • 数组类型注释的格式是 Array,T 表示数组中每项的数据类型
  • 在上述代码中,arr 是每项均为数字的数组
  • 如果我们给这个数组添加了一个字符串,Flow 能检查出错误

3 ) 类和对象

  • 给出如下代码
    /*@flow*/
    class Bar {
      x: string;           // x 是字符串
      y: string | number | void;  // y 可以是字符串或者数字或者不传
      z: boolean;
    
      constructor(x: string, y: string | number | void) {
        this.x = x
        this.y = y
        this.z = false
      }
    }
    
    // var bar: Bar = new Bar('hello') // 这里y是void不传 也可
    var bar: Bar = new Bar('hello', 4)
    
    var obj: { a: string, b: number, c: Array<string>, d: Bar } = {
      a: 'hello',
      b: 11,
      c: ['hello', 'world'],
      d: new Bar('hello', 3)
    }
    
  • 上述代码是没有问题的,类的类型注释格式如上,可以对类自身的属性做类型检查,也可以对构造函数的参数做类型检查
  • 这里需要注意的是,属性 y 的类型中间用 | 做间隔,表示 y 的类型即可以是字符串也可以是数字
  • 对象的注释类型类似于类,需要指定对象属性的类型

4 ) Null

  • 若想任意类型 T 可以为 null 或者 undefined,只需类似如下写成 ?T 的格式即可
    /*@flow*/
    var foo: ?string = null
    
  • 此时,foo 可以为字符串,也可以为 null,
  • 目前我们只列举了 Flow 的一些常见的类型注释

5 )特殊类型

const a:'foo' = 'foo' // 字面量类型
const b: 'success'|'warnning'|'danger' = 'success'; // 联合指定类型
const c:string | number = 1 // 指定多个简单类型 或者等于一个字符串
const d: {foo: string, bar: number } = {foo: 'foo', bar: 100 } // 指定引用类型
// mixed 类型 所有类型的联合类型 是一个具体类型 编译阶段会检查 强类型,内部调用需要判断类型才能调用具体类型的方法
function e(value:mixed) {}
e('a')
e(1)
// any类型 接受所有类型 弱类型 编译阶段不会检查
function f(value: any) {}
f('a')
f(1)

6 ) 第三方库的使用

  • 如果引入第三方库,Flow检查时就会抛出错误,但这并不是我们期待的错误
  • 我们只需创建一个库定义(libdef)。libdef是包含第三方库声明的JS文件简称
  • 比如,Flow并不认识 $,所以会报错,要解决这个问题,我们需要引入jQuery的库定义
  • 使用flow-typed来解决,通过 $npm install -g flow-typed 安装flow-typed仓库
    • 它包含了众多流行的第三方库的 libdef
  • 只需在项目根目录下创建一个名为 flow-typed 的文件夹,并且下载相关的定义文件即可
  • 安装成功之后, 运行 $ flow-typed install 来检查 package.json文件
  • 并进行下载所有项目中用到的第三方库的libdef
  • 等下载完后,再 $ npm run flow,就会发现没有错误了
  • 如果你用的库并不在flow-typed仓库,你可以创建你自己的 libdef

7 )移除类型注释

7.1 使用 flow-remove-types 工具

  • 额外添加的类型注释不是正确的JavaScript语法,打包编译的时候需要在源码中移除

  • 可以通过flow-remove-types来剔除,或者如果你已经用Babel来转译JS

  • 你可以使用Babel preset来移除。我们只讨论第一种方法

  • 首先需要安装 flow-remove-types 作为项目依赖库

    • $ npm install --save-dev flow-remove-types
  • 之后,在package.json文件中添加另一个 script 入口

    "scripts": {
      "flow": "flow",
      "build": "flow-remove-types src/ -d dist/"
    }
    
  • 运行npm run build将剔除src文件夹下的所有类型注释,在dist文件夹中保存编译后的版本

  • 编译后的文件就是普通的能运行于浏览器的JavaScript文件

7.2 使用 babel-preset-flow

Flow 在Vue.js源码中的应用

  • 有时我们想引用第三方库,或者自定义一些类型,但 Flow 并不认识,因此检查的时候会报错
  • 为了解决这类问题,Flow 提出了一个 libdef 的概念,可以用来识别这些第三方库或者是自定义类型
  • 而 Vue.js 也利用了这一特性
  • 在 Vue.js 的主目录下有 .flowconfig 文件, 它是 Flow 的配置文件
  • 这其中的 [libs] 部分用来描述包含指定库定义的目录,默认是名为 flow-typed 的目录
  • 这里 [libs] 配置的是flow,表示指定的库定义都在 flow 文件夹,我们打开这个目录,会发现文件如下
    flow
    ├── compiler.js        # 编译相关
    ├── component.js       # 组件数据结构
    ├── global-api.js      # Global API 结构
    ├── modules.js         # 第三方库定义
    ├── options.js         # 选项相关
    ├── ssr.js             # 服务端渲染相关
    ├── vnode.js           # 虚拟 node 相关
    
  • 可以看到,Vue.js 有很多自定义类型的定义,在阅读源码的时候
  • 如果遇到某个类型并想了解它完整的数据结构的时候,可以回来翻阅这些数据结构的定义
  • 通过对 Flow 的认识,有助于我们阅读 Vue 的源码
  • 并且这种静态类型检查的方式非常有利于大型项目源码的开发和维护
  • 类似 Flow 的工具还有如 TypeScript
Vue 整合 Vue Flow:从零构建交互式流程图 本文详细介绍了如何在 Vue.js 项目中整合 Vue Flow,打造交互式流程图。文章从目的、适用场景入手,涵盖环境准备、基础组件、构建及自定义组件(矩形、菱形等)设计,重点讲解操作实现:拖拽节点、连线、删除节点、保存为 JSON及导入 JSON。通过代码示例和效果说明,展示了从侧边栏拖动节点、连接节点、删除选中节点到数据持久化的完整流程。另提供性能优化建议和常见问题解决方法。Vue Flow 的灵活性使其适用于工作流管理、数据可视化等场景,适合初学者和高级开发者参考。文章配有插图指导 阅读详情

相关推荐

vue3+ts 绘制流程图 vueflow 附代码及效果图

已完成渲染流程图,自定义模板内容(上下分级),自定义样式,新增节点addRandomNode,点击修改节点nodeClickHandler(从父组件传值)官网:https://vueflow.dev/guide/node.html#node-template 文档比较复杂,很多想找的方法没法一下就找到需要注意我装了三个,如果npm安装报错可以试试yarn add

1万+

Vue Flow 交互式流程图和图形世界的桥梁

vue-flow流程化开发 vite 版本最低 3.0.9 node 版本 18.2.0注意事项为了确保 Vue Flow 的显示正确,请确保包含必要的样式。

睡不着的可乐博客 8345

Part3-2-1 Vue.js 源码剖析-首次渲染过程

1

m0_38066007的博客 266

Vue Flow实现流程编辑器

vue flow实现流程编辑器,自定义节点、自定义边

weixin_71038844的博客 1万+

vue-flow-topology:Flow Topology 是基于Vue-cli3.0 + Ant Design Vue + JSPlumb开发的一个大数据流水线拓展流程工作台,该项目可以看做是一个独立的 Vue 项目,也可以嵌入到其他vue项目中使用,新版会作为优先版本持续迭代

vue-flow-topology 介绍 vue-flow-topology 该项目可以看做是一个独立的 Vue 项目(大数据流水线拓展流程工作台),也可以嵌入到其他vue项目中使用,新版会作为优先版本持续迭代。 版本一:基于 Vue-cli3.0 + view-design + JSPlumb 开发( master 分支 )。 版本二:基于 Vue-cli3.0 + Ant Design Vue + JSPlumb 开发( simple 分支 )。 特性 :check_mark_button: 支持画布重绘、拖拽、放大、缩小功能 :check_mark_button: 支持鼠标滚轮缩放画布功能 :check_mark_button: 支持拖拽、添加、删除节点功能 :check_mark_button: 支持不同连线类型进行关联节点功能 :check_mark_button: 支持删除连线、重绘连线功能 :check_mark_button: 支持点击画布设置属性功能 :check_mark_button: 支持点击节点设置属性功能 :check_mark_button: 支持点击线进

单细胞测序中pseudo bulk差异分析的实战指南与审稿人应对策略

本文提供了单细胞测序中pseudo bulk差异分析的完整实战指南,旨在应对审稿人对样本量统计效力的质疑。文章详细解析了从数据聚合、使用DESeq2进行差异分析,到与单细胞水平结果进行交叉验证的全流程,并给出了应对常见问题与撰写回复的策略,帮助研究者提升结论的稳健性与说服力。

weixin_29214199的博客 832

Vue源码解读(一):准备工作

前言 Vue3 出来也有好一整子了,但 Vue2 的源码原理学习,不论在升职加薪还是在另谋高就的路上,一直是一个必要的环节,正应了“面试造火箭,上班拧螺丝”这句话。尽管之前对 Vue2 的源码也有学习过,但是一直没有进行一个系统的总结,说白了就是懒。最近在掘金上看到 李永宁 大佬的 《Vue 源码解读》 系列文章后,又开始蠢蠢欲动了。这次主要是对核心实现的一个梳理,细节方面不会太过介绍。 源码地址 本次学习的 Vue源码 为 2.6.14 版本,git命令下载: git clone https://git

qq_35500568的博客 379

干法刻蚀工艺进阶:如何通过调节DC自偏压优化刻蚀速率和各向异性

本文深入探讨了干法刻蚀工艺中DC自偏压的精细调控艺术。DC自偏压是影响刻蚀速率和各向异性的关键因素,文章通过实战案例,详细分析了如何通过调节射频功率、频率、腔室压力及气体成分等参数,间接而有效地控制DC自偏压,从而优化高深宽比硅沟槽等复杂结构的刻蚀效果,实现工艺性能的精准提升。

weixin_28308325的博客 335

React Native Monthly 4 全记录:2017 年 9 月社区生态进展与 Text/TextInput 核心优化

本篇技术指南基于本仓库 [blog/2017-09-21-react-native-monthly-4.md](https://link.gitcode.com/i/7274e54c395226f62b1b9645a940cfed) 整理,对 2017 年 9 月的第四次 React Native 月度会议(React Native Monthly)各团队汇报进行了逐条解读,并结合当前仓库源码(`

gitblog_00338的博客 725

小土堆学习笔记1:Dataset类代码实践

上一页中反复提到“类”,这究竟是什么东西?按我的理解(肯定不准确也不正式),class类就是某一个东西的共性,而且是等待被确认的共性。比如每台手机都有它自己的品牌、框架、价格等等属性,class类正是这些尚不确定的属性;而一旦确认了这些属性,就能够确认这到底是一台什么型号什么状态的手机,在确认了全部属性后就知道,这是一台Apple 16 Pro Max。抽象的不确定的共性就是类,具体的确定的个性就是示例。这个共性可以被用于多个编程目的,只不过某一个具体的编程行为还有它自己的独特性。

qq_40525602的博客 1627

从工艺到器件:用Silvaco ATLAS仿真PIN二极管击穿电压的保姆级指南

本文详细介绍了使用Silvaco ATLAS仿真PIN二极管击穿电压的全流程指南,从工艺仿真基础搭建到器件结构构建,再到击穿特性仿真和结果分析。通过Silvaco工具链,工程师可以在设计阶段精准预测器件性能,优化击穿电压,提升研发效率。

weixin_34259816的博客 356

Flow Launcher:一个输入框搞定文件搜索与应用启动

Flow Launcher 是一款免费开源的 Windows 文件搜索与应用启动器:按 `Alt+Space` 呼出搜索框,输入文件名直接打开文件,输入应用名直接启动。适合想少用鼠标、多敲键盘的办公用户。 ## 三步装好,当场验证 1. 执行 `winget install "Flow Launcher"` 安装,scoop、choco 同样支持 2. 按 `Alt+Space`,搜索框出现在

gitblog_01057的博客 997

MTK 人工智能生态系统 <一> 简介

Neuropilot

New_Tank的博客 3498

Vibe Coding 时代的全栈开发导论:Easy-Vibe 项目中的计算机知识地图与工程师成长路径

> 本文基于 Easy-Vibe 开源仓库《全栈开发导论:Vibe Coding 时代的计算机知识地图》章节([docs/es-es/appendix/1-computer-fundamentals/vibe-coding-fullstack.md](https://link.gitcode.com/i/38f57b2811ac387573caa6c2ef35a22c))整理成文,并辅以仓库内配套

gitblog_00705的博客 126

FPGA实现串口升级及MultiBoot(五)通过约束脚本添加IPROG实例

上一篇文章种总结了MultiBoot 关键技术,分为:一个指令、二种位流、三种方式、四样错误。针对以上四句话我们接下来详细分析。在开始解析之前我们先准备两个文件,一个是控制LED闪烁的文件,通过更换引脚约束可以控制不同LED,这样就可以指示是启动MultiBoot位流还是Golden位流。还有一个文件就是uart发送文件,会指示启动的位流格式和启动地址。文件都比较简单,就不列举了,文件详见文后的链接。对于 IPROG 指令目前有三种实现方式,分别为:1)通过约束脚本添加;2)通过ICAPE2原语

OpenFPGA的博客 2106

YOLOv11涨点改进 | 全网独家首发、特征融合创新篇 | ACM 2025顶会 | 引入DAAttn差异感知注意力融合模块,通过动态调整注意力,使模型更准确地识别关键内容,提高精度、并减少冗余计算

本文提出了一种基于DAAttn(差异感知注意力融合)模块改进的YOLOv11模型,用于提升变化检测任务的性能。DAAttn模块通过动态加权特征差异,有效区分有意义变化与噪声(如光照、天气变化),显著提高了模型在复杂场景下的检测精度。该模块采用反转注意力机制,重点关注显著差异区域,同时减少计算冗余。实验表明,改进后的模型在保持计算效率的同时,能够更准确地识别小目标和细节变化。文章详细介绍了DAAttn的原理、优势、实现代码及其在YOLOv11中的集成方法,并提供了两种改进配置方案。

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

【附下载链接】CoolPack 1.5.0 制冷仿真软件:从安装到上手的完整指南

CoolPack 1.5.0 是一款制冷仿真软件,面向学习和从事制冷设计的用户:查物性、画焓湿图、做系统选型与仿真,一份安装包全部搞定。 ## 适合谁用:从课程作业到实际设计 如果你正在学制冷相关专业,需要频繁翻查制冷剂数据、核算循环,CoolPack 就是为这类场景准备的;如果你已经从业,手头有选型或验证系统表现的活儿,它同样能接住。原本要翻手册、手算的步骤,在这里被整合进一个界面里。 #

gitblog_00617的博客 223

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Kubai Icons图标站幕后:16种语言、按形状和含义搜索、ZIP整包下载是怎么做到的

Kubai Icons 是一个开源图标库与图标站项目,收录 2800+ 个统一风格的开源图标,覆盖 React、Vue 和 SVG 场景。它的网站是一个纯静态站点:支持 16 种语言,可以在浏览器里按"形状"和"含义"搜索图标,还能把收藏的图标一键打包成 ZIP 下载。这篇文章带你看懂这三件事在仓库里是怎么落地的。 [![Kubai Icons 图标站图标库网格预览:2800+ 统一风格的开源图

gitblog_01179的博客 935

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

蓝牙模块HM-10手册

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

REA 逆向分析工具:3 条命令装好,10 分钟接入你的 AI 智能体

装完 REA,你的终端会多出一条 `rea` 命令:拆解应用行为、分析 JavaScript 与 Electron 应用、深挖原生二进制,并把整套逆向分析能力接给 Claude Code、Codex、Cursor 等智能体。它覆盖 macOS、64 位 Linux 与 Windows,分析全程在本地运行。本文只讲安装与接入,源码原理不展开。 [![REA 逆向分析工具在 Hopper 中分析原生

gitblog_00376的博客 195

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

极致的灵活度满足工程美学:用Vue Flow绘制一个完美流程图

如何在前端用js绘制流程图?VueFlow是一个优质的选择。VueFlow是什么?VueFlow怎么用? Vue Flow的特点就是,什么都可以要,什么都要自己写。 相比于mermaid来说,Vue Flow接受的数据更复杂冗长,并且预定义的内容极少,连默认的布局都没有(节点通过position控制位置,很容易重叠)。但是Vue Flow提供的自定义API非常丰富并且强大。 如果您想发挥自己天马行空的想象力,或者满足复杂的项目流程需求,Vue Flow一定能满足您的预期。

RenGJ010617的博客 3万+

vue-flow绘制流程图

vue-flow绘制流程图

m0_50666077的博客 1万+

Vue Flow: 高效构建可视化工作流的利器

Vue Flow 是一个用于构建和操作节点连接图(node-based diagrams)的 Vue.js 组件库。它可以用来创建动态的工作流、流程图、组织结构图等。Vue Flow 提供了灵活的 API 和直观的界面,使得开发者能够轻松地定义节点、边和布局,并通过事件和钩子函数进行交互。Vue Flow 允许开发者自定义节点和边的样式和行为。

专注于全栈开发领域 5915

Vue Flow:绘制你的Vue 3流程图,让设计更自由!

定制你的Vue 3流程图,释放创造力!

2401_83063795的博客 4190

Vue Flow 是一个基于 Vue.js 和 D3.js 的可视化图表库,可以用于构建各种类型的流程图、组织结构图、网络拓扑图等。

技术分析 ------- Vue Flow 使用了 Vue.js 的组件化思想,将图表分解成多个小组件,使得图表的构建和维护更加简单。同时,Vue Flow 还使用了 D3.js 的数据驱动思想,通过数据的变化来更新图表的显示。 能用来做什么 -------- Vue Flow 可以用于构建各种类型的流程图、组织结构图、网络拓扑图等,比如: * 流程图:用于展示各种业务流程的执行步骤,帮助...

gitblog_00100的博客 1825

Vue底层原理

Observer (数据劫持) 核心是通过Obeject.defineProperty()来监听数据的变动,这个函数内部可以定义setter和getter。 每当数据发生变化,就会触发setter()。这时候 Observer 就要通过 Dep 通知 Watcher 订阅者。 Dep (发布者) 有 addWatcher() 和 notify() 两个方法,(收集 Watcher 依赖,并通知依赖变更)。 Dep 保存多个 Watcher,当 Dep 发现 Observer有更新时,Dep ...

edwardwzw的博客 4401
上一篇: Vue3源码梳理:运行时之基于h函数生成vnode的内部流程
下一篇: Vue2源码梳理:关于vue2的源码目录设计与相关模块作用分析
Wang's Blog
博客等级 码龄12年 7433粉丝 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、付费专栏及课程。

余额充值