React Native性能优化红宝书
一、React Native介绍
React Native 是Facebook在React.js Conf2015 推出的开源框架,使用React和应用平台的原生功能来构建 Android 和 iOS 应用。通过 React Native,可以使用 JavaScript 来访问移动平台的 API,使用 React 组件来描述 UI 的外观和行为。
JS实现调用的能力中间的适配层提供了一些桥接方案
1、RN优势
1.1 HTML/CSS/JS开发成本低,用统一的代码规范开发移动端程序,不用关注移动端差异
1.2 天然跨平台,开发一次,可以生成Android和ios两个系统上的APP,这减少了开发人员需要编写不同版本的应用程序的时间和工作量。
1.3 无审核热更新
1.4 可扩展
1.5 易学易用:React Native 基于 React,开发人员可以使用熟悉的 JavaScript 和 React 组件模型来构建应用程序,因此很容易学习和上手。
RN的本质是把中间的这个桥Bridge给搭好,让JS和native可以互相调用。
RN为我们提供了JS的运行环境,所以前端开发者们只需要关心如何编写JS代码,
画UI只需要画到virtual DOM 中,不需要特别关心具体的平台。
至于如何把JS代码转成native代码的脏活累活,RN底层全干了
2、RN劣势
2.1 不成熟,项目版本更新维护较频繁,学习成本高,试错成本高,有些问题较少解决方案,开发进度慢
2.2 性能:整体性能仍不如原生
2.3 兼容性:涉及底层的功能,需要针对Android和ios双端单独开发
2.4 有限的第三方库:尽管 React Native 社区不断增长,但相对于其他混合应用框架,第三方库和插件的数量还是有限的。这可能使开发人员在某些方面受到限制。
2.5 有些原生功能需要自己实现:虽然 React Native 提供了大量原生组件,但某些原生功能需要开发人员自己实现,这可能需要额外的时间和工作量。
3、跨平台框架比较
开发模式 | 原生开发 | 混合开发 | Web开发 |
运行环境 | Android、iOS、Windows | 混合App、 React Native,Weex、Flutter | 浏览器、WebView |
编程语言 | Java,Objective-C | JavaScript、Dart | HTML、CSS、JavaScript |
可移植性 | 差 | 一般 | 好 |
开发速度 | 慢 | 一般 | 快 |
性能 | 快 | 一般 | 慢 |
学习成本 | 高 | 一般 | 低 |
4、Hybrid App 优势
4.1 跨平台开发
4.2 离线访问
4.3 原生应用程序的用户体验
4.4 快速开发和迭代
混合应用程序结合了Web应用程序和本地应用程序的优点,既能够在原生应用程序环境中运行,也能够在 Web 浏览器中运行,并且具有更好的用户体验和功能。这种开发方式可以大大减少开发时间和成本,提高开发效率。
5、React Native 0.68之前的架构
5.1、整体UI渲染太过于依赖JsBridge,容易出现阻塞影响整体UI体验
5.2、性能和问题反馈最大的组件:
ScrollView:一次渲染不做任何回收,启动性能慢,占用内存大
FlatList:做了组件回收,快速滑动中容易出现白屏和卡顿
Shadow层最终呈现到原生的UI是异步的,滑动太快会有大量的UI
5.3、事件阻塞在JsBridge,导致了长时间白屏的出现
6、RN中的视图渲染
javascript:JS代码的执行线程,将源码通过Metro打包后传给JS引擎进行解析:
结构 样式 属性
- Main线程(UI线程或原生线程):主要负责原生渲染(Native UI)和调用原生模块(Native Modules
- Shadow 线程Layout线程:创建Shadow Tree来模拟Reac结构树(类似虚拟DOM),再由Yoga引擎将Flexbox等样式,解析成平台的布局方式:
宽高 位置
7、RN架构设计--新旧架构对比
7.1、JavaScript层:
支持React 16+新特性
增强JS静态类型检查(CodeGen)
引入JSI允许替换不同的JavaScript引擎
7.2、Bridge层:
划分了Fabric和TurboModules,分别负责管理UI和Native模块
7.3、Native层:
精简核心模块,将非核心部分拆除去,作为社区模块,独立维护
8、从 0.68 版本开始React Native 的新架构
8.1、JSI (JavaScript Interface)
一个用 C++ 写成的轻量级框架
实现JS引擎的互换
通过JS直接调用Native
减少不必要的线程通信,省去序列化和反序列化的成本,
减轻了通信压力,提高了通信性能
8.2、CodeGen
FaceBook推出的代码生成工具
加入了类型约束后,减少了数据类型错误
自动将 Flow 或 TS 有静态类型检查的 JS 代码转换为 Fabric 和 TurboModules 使用的原生代码
8.3、优化Bridge层
Fabric是整个框架中的新UI层,简化了之前的渲染
Turbo Modules通过JSI可以让JS直接调用Native模块,实现同步操作,实现Native模块按需加载,减少启动时间,提高性能
8.4、精简核心代码(LEAN Core)
将React Native核心包进行瘦身,非必要包移到社区单独维护
9、React介绍
Facebook,Learn Once,write anywhere
数据驱动,状态决定界面的变化,虚拟dom(抽象层)
虚拟dom的好处,首先是性能的优化,不直接操作Dom先进行一些比较,计算找出需要变化的部分,在实际的dom中进行操作
其次,这个抽象层,还提供了逻辑代码跨平台移植的可能性
虚拟dom的下方对接的,是网页,是移动端,是电视端,任何一个可以渲染的端,都可以做接口的适配,使得代码在任何地方使用
主要四个部分:
组件:类组件、函数式组件
属性Props
状态State
jsx:React 和 React Native 都使用JSX 语法,这种语法使得你可以在 JavaScript 中直接输出本质上也就是 JavaScript,所以你可以在其中直接使用变量元素,JSX
hook api: todo补充
生命周期: todo补充
二、性能优化点
1、RN加载的主要时间消耗
todo:补充
2、RN性能优化-拆包、分包
React Native 页面的 JavaScript 代码包是热更新平台根据版本号进行下发的,每次有业务改动,我们都需要通过网络请求更新代码包。
因此,我们在对JavaScript 代码进行打包的时候,需要将包拆分成两个部分:
2.1、Common 部分,也就是 React Native 源码部分;
2.2、业务代码部分,也就是我们需要动态下载的部分
具体操作:
- JavaScript 代码包中 React Native 源码相关的部分是不会发生变化的,所以我们不需要在每次业务包更新的时候都进行下发,在工程中内置一份就好了。
- Common 包内置到工程中
- 业务代码包进行动态下载
- 利用 JSContext 环境,在进入载体页后在环境中先加载 Common 包,再加载业务代码包就可以完整的渲染出 React Native 页面
todo:代码示例?
3、首屏渲染
通过拆包的方案,已经减少了动态下载的业务代码包的大小。但是还会存在部分业务非常庞大,拆包后业务代码包的大小依然很大的情况,依然会导致下载速度较慢,并且还会受网络情况的影响。
因此,我们可以再次针对业务代码包进行拆分
将一个业务代码包拆分为一个主包和多个子包的方式
在进入页面后优先请求主包的 JavaScript 代码资源,能够快速地渲染首屏页面,
紧接着用户点击某一个模块时,再继续下载对应模块的代码包并进行渲染,就能再进一步减少加载时间。
4、减少渲染的节点-通过组件懒加载提高应用性能
组件懒加载可以让 react 应用在真正需要展示这个组件的时候再去展示,有效的减少渲染的节点数,提高页面的加载速度
React 官方在 16.6 版本后引入了新的特性:React.lazy 和 React.Suspense,这两个组件的配合使用可以比较方便进行组件懒加载的实现
React.lazy 该方法主要的作用就是可以定义一个动态加载的组件,这可以直接缩减打包后 bundle 的体积,
并且可以延迟加载在初次渲染时不需要渲染的组件
Suspense组件中的 fallback 属性接受任何在组件加载过程中你想展示的 React 元素。
你可以将 Suspense 组件置于懒加载组件之上的任何位置,你甚至可以用一个 Suspense 组件包裹多个懒加载组件。 代码示例如下:
import React, {Suspense} from 'react';
const OtherComponent = React.lazy(() => import('./OtherComponent));
const AnotherComponent = React.lazy(() => import('./AnotherComponent));
function MyComponent() {return(<div><Suspense fallback={<div> loading...</div>}><section><OtherComponent/><AnotherComponent/></section></Suspense></div>)
}
使用懒加载可以减少bundle文件大小,
不同的文件打包到不同的页面组件当中,加快组件的呈现
import React, {lazy, Suspense} from 'react';
const OtherComponentLazy = lazy(() => import('./OtherComponent));
const AnotherComponentLazy = lazy(() => import('./AnotherComponent));
function Suspensed(lazyComponent) {return (props) {<Suspense fallback={<div></div>}><lazyComponent {...props} /></Suspense>}
}
export const OtherComponent = Suspensed(OtherComponentLazy)
export const AnotherComponent = Suspensed(AnotherComponentLazy)
5、提交阶段优化-避免重复无限渲染
当应用程序状态发生更改时,React会调用render方法。
如果在render方法中继续更改应用程序状态,就会发生render方法递归调用,导致应用报错。
Render方法应该作为纯函数,render方法的执行要根据状态的改变,保持组件的行为和渲染方法一致。
执行提交阶段钩子,会阻塞浏览器更新页面。
如果在提交阶段钩子函数中更新组件 State,会再次触发组件的更新流程,造成两倍耗时。
一般在提交阶段的钩子中更新组件状态的场景有:
- 类组件应使用 getDerivedStateFromProps 钩子方法代替,函数组件应使用函数调用时执行 setState的方式代替。
- 使用上面两种方式后,React 会将新状态和派生状态在一次更新内完成。
- 根据 DOM 信息,修改组件状态。在该场景中,除非想办法不依赖 DOM 信息,否则两次更新过程是少不了的,就只能用其他优化技巧了。
6、组件卸载前执行清理操作
React 组件性能优化的核心是减少渲染真实DOM节点的频率,减少Virtual DOM 比对的频率
在组件中为window注册的全局事件,以及定时器,在组件卸载前要清理掉,防止组件卸载后继续执行影响应用性能
import React,{Component
} from 'react';export default class Hello extends Component {componentDidMount() {this.timer = setTimeout(() => { console.log('把一个定时器的引用挂在this上'); },500);}componentWillUnmount() {// 如果存在this.timer,则使用clearTimeout清空。// 如果你使用多个timer,那么用多个变量,或者用个数组来保存引用,然后逐个clearthis.timer && clearTimeout(this.timer);}
};
7、通过使用占位符标记提升React组件的渲染性能
使用Fragment不对应具体的视图,减少了包含的额外标记的数量
仅仅是代表可以包装而已,跟空的标识符一样,视图层级关系减少有利于视图渲染,
满足在组件顶级具有单个父级的条件
<div>
...
</div>
// 上面会多出一个无意义标记
// 应该改为
<fragment>
...
</fragment>
// 或者写成下面这样也是可以的
<>
...
</>
8、缩小状态影响范围-状态下放到使用组件的内部
React不直接操作DOM,它在内存中维护一个快速响应的DOM描述,render方法返回一个DOM的描述
React能够计算出两个DOM描述的差异,然后更新浏览器中的DOM,这就是著名的DOM Diff。
就是说React在接收到属性(props)或者状态(state)更新时,就会通过前面的方式更新UI。所以React整个UI渲染是比较快的。但是这里面可能出现的问题是:
假设我们定义一个父组件,其包含了5000个子组件。我们有一个输入框输入操作,每次输入一个数字,对应的那个子组件背景色变红。
父组件更新默认触发所有子组件更新,子组件的props为空对象,{} === {} 永远会返回false
优化思想:将变的和不变的分开(state,props,context)
我们需要先手动创建一个有严重渲染性能的组件,如下所示:
import { useState } from 'react';export default function App() {let [color, setColor] = useState('red');return (<div><input value={color} onChange={(e) => setColor(e.target.value)} /><p style={{ color }}>Hello, world!</p><ExpensiveTree /></div>);
}function ExpensiveTree() {let now = performance.now();while (performance.now() - now < 100) {// Artificial delay -- do nothing for 100ms}return <p>I am a very slow component tree.</p>;
}
很显然,当 App 组件内的状态发生了改变,ExpensiveTree 组件会 re-render, 事实上 ExpensiveTree 组件的 props、state 并未发生改变,这并不是我们期望的结果。
export default function App() {let [color, setColor] = useState('red');return (<div><input value={color} onChange={(e) => setColor(e.target.value)} /><p style={{ color }}>Hello, world!</p><ExpensiveTree /></div>);
}
我们可以看到以上 ExpensiveTree 组件并不依赖 App 组件内部的状态,因此我们是否可以考虑,将依赖 color 的元素抽离到一个依赖 color 的组件中呢?
export default function App() {return (<><Form /><ExpensiveTree /></>);
}function Form() {let [color, setColor] = useState('red');return (<><input value={color} onChange={(e) => setColor(e.target.value)} /><p style={{ color }}>Hello, world!</p></>);
}
此时,将依赖 color 的元素提取到了 Form 组件中,Form 组件内部的状态不再影响 ExpensiveTree 组件的渲染,问题便得到了解决。
9、跳过不必要的组件更新-通过纯组件提升性能
- 类组件中使用PureComponent
- 函数式组件中使用React.memo
在 React 工作流中,如果只有父组件发生状态更新,即使父组件传给子组件的所有 Props 都没有修改,也会引起子组件的 Render 过程。
如果子组件的 Props 和 State 都没有改变,那么其生成的 DOM 结构和副作用也不应该发生改变。
纯组件会对组件输入数据进行浅层比较,如果当前输入数据和上次输入数据相同,组件不会重新渲染。
比较引用数据类型在内存中的引用地址是否相同,比较基本数据类型的值是否相同
为什么不直接进行diff操作?而要先进行浅比较?
浅比较只操作当前组件的state和props,diff操作会重新遍历整个VirtualDOM树
10、跳过不必要的组件更新-通过shouldComponentUpdate
纯函数只能进行浅层比较,要进行深层比较,
使用shouldComponentUpdate,它用于编写自定义比较逻辑
ShouldComponentUpdate(nextProps,nextState){if(nextProps……){return true}return false
}
11、跳过不必要的组件更新-通过memo纯组件提升性能
Memo基本使用:将函数组件变为纯组件,当前props和上一次的props进行浅比较,如果相同就阻止组件重新渲染
Memo函数是浅层数据比较,如果遇到引用数据类型,需要传递自定义比较逻辑,传给Memo函数的第二个参数
memo的第二个参数示例如下:
// 给memo传递第二个参数,自定义比较逻辑
import React, { memo, useEffect, useState } from 'react'
function App () {const [person, setPerson] = useState({ name: '张三', age: 20, job: 'waiter' })const [index, setIndex] = useState(0)useEffect(() => {let timer = setInterval(() => {setIndex(prev => prev + 1)setPerson({ ...person, job: 'chef' })}, 1000)return () => {clearInterval(timer)}}, [index, person])return (<div>{index}<ShowName person={person} /></div>)
}
function compare (prevProps, nextProps) {if (prevProps.person.name !== nextProps.person.name ||prevProps.person.age !== nextProps.person.age) {return false}return true
}
const ShowName = memo(function ({ person }) {console.log('render...')return (<div>{person.name} {person.age}</div>)
}, compare)
export default App
12、跳过不必要的组件更新- useMemo、useCallback缓存优化
useMemo、useCallback 实现稳定的 Props 值
useMemo 缓存上次计算的结果,当 useMemo 的依赖未发生改变时,就不会触发重新计算,一般用在非常耗时的场景中,
如:遍历大列表做统计信息。
useCallback ,将父组件传递给子组件时,子组件会因为重新render发生改变的时候,缓存一个值
useCallback 是 React 的一个 Hook,它用于记住函数的引用,避免在每次渲染时都创建一个新的函数实例。这可以帮助优化性能,因为避免不必要的重渲染和子组件的重新渲染。
使用场景:
当你有一个函数,它依赖于某些 props 或 state,但你不希望它在这些依赖发生变化时重新创建,你可以使用 useCallback 来保持引用不变。
如果你有一个子组件,它是纯的(不依赖外部状态,只依赖于传入的 props),并且你希望避免非必要的重渲染,你可以使用 useCallback 来保证传递给子组件的函数引用保持不变。
例子代码:
import React, { useCallback } from 'react';
function ParentComponent() {const [count, setCount] = useState(0);// 使用 useCallback 来避免在每次渲染时都创建一个新的函数实例const incrementCount = useCallback(() => {setCount(count + 1);
}, [count]);
return (<div><p>Count: {count}</p ><button onClick={incrementCount}>Increment</button>ChildComponent onIncrement={incrementCount} /></div>
);
}
function ChildComponent({ onIncrement }) {
// 这里我们不需要每次 ParentComponent 渲染时都创建一个新的函数实例
// 因为 onIncrement 引用没有变化return <button onClick={onIncrement}>Increment from Child</button>;
}
在这个例子中,incrementCount 是一个函数,用于增加计数。我们使用 useCallback 来保证在 ParentComponent 的多次渲染中,incrementCount 函数的引用是不变的,这样 ChildComponent 就不会因为 ParentComponent 的渲染而不必要地重新渲染。
13、列表使用Key属性
遍历展示视图时使用 key,key 帮助 React 识别哪些元素改变了,比如被添加或删除。因此你应当给数组中的每一个元素赋予一个确定的标识
const numbers = [1, 2, 3, 4, 5];
const listItems = numbers.map((number) =>
<li key={number.toString()}> {number} </li>);
使用 key 注意事项:
这个元素在列表中拥有的一个独一无二的字符串。通常,我们使用数据中的 id 来作为元素的 key
14、不要使用内联函数定义:
如果使用内联函数,函数是引用数据类型,在内存中的地址不会相同,则每次render函数时,都会创建一个新的函数实例
在渲染阶段会绑定新函数并将旧实例扔给垃圾回收,因此绑定内联函数,需要额外的垃圾回收和绑定到DOM的工作
1.Render(){Return (<input type=“button” onClick={(e)=>{this.setState({inputVal:e.target.value})}}>)
}2.setNewState=(e)->{this.setState({inputVal:e.target.value})}
//箭头函数被添加到类的实例对象属性而不是原型对象属性,如果组件被多次重用,每个实例都会有一个相同的函数实例,降低了函数实例的可重用性,造成了资源的浪费
Render(){Return (<input type=“button” onClick={(e)=>{this.setNewState}/> )
}3.Export default class a extends React.Component{constructor(){this.handleClick = this.handClick.bind(this)//构造函数只执行一次}
}
handleClick(){xxxxx}
<input type=“button” onClick={this.handleClick}/>
//render方法每次执行时都会调用bind方法生成新的函数实例
<input type=“button” onClick={this.handleClick.bind(this)}/>
15、避免使用内联样式
使用内联样式时,会被编译为JavaScript代码,JavaScript将样式规则映射到元素上,浏览器需要花费更多时间处理脚本和渲染UI。
它是在执行时为元素添加样式,而不是在编译时为元素添加样式。
因此,性能非常的低,更好的办法是将CSS文件导入组件。能通过css直接做的事情,就不要通过JavaScript去做,因为JavaScript操作DOM非常慢
16、事件节流和防抖
利用debounce、throttle 避免重复回调
节流:
意味着不会立即执行,在触发事件之前会加上几毫秒延迟,
throttle 更适合需要实时响应用户的场景中更适合,
如通过拖拽调整尺寸或通过拖拽进行放大缩小(如:window 的 resize 事件)。实时响应用户操作场景中,如果回调耗时小,
甚至可以用 requestAnimationFrame 代替 throttle。
页面滚动到底部的时候,使用节流,否则触发多个网络请求调用,导致性能问题
防抖:
在输入框中键入数据,直到用户不再输入数据为止,兼容网络调用提升性能
在搜索场景中,只需响应用户最后一次输入,无需响应用户的中间输入值,
debounce 更适合使用在该场景中。
相关文章:

React Native性能优化红宝书
一、React Native介绍 React Native 是Facebook在React.js Conf2015 推出的开源框架,使用React和应用平台的原生功能来构建 Android 和 iOS 应用。通过 React Native,可以使用 JavaScript 来访问移动平台的 API,使用 React 组件来描述 UI 的…...

后端不提供文件流接口,前台js使用a标签实现当前表格数据(数组非blob数据)下载成Excel
前言:开发过程中遇到的一些业务场景,如果第三方不让使用,后端不提供接口,就只能拿到table数据(Array),实现excel文件下载。 废话不多说,直接上代码,方法后续自行封装即可: functio…...

如何使用ChatGPT辅助设计工作
文章目录 设计师如何使用ChatGPT提升工作效率?25个案例告诉你!什么是 prompt?咨询信息型 prompt vs 执行任务 prompt编写出色 prompt 的基本思路撰写 prompt 的案例和技巧1、将 ChatGPT 视作专业人士2、使用 ChatGPT 创建表单3、使用 ChatGPT…...

hadoop服务器启动后无法执行hdfs dfs命令
集群启动后,无法正常使用hdfs的任何命令。使用jps查看进程,发现namenode没有启动,然后再进入到Hadoop的相应目录,打开里面的logs文件 打开Hadoop的master的log 再使用vi编辑器查看(也可以用less或者more命令查看&#…...

Flink 1.19.1 standalone 集群模式部署及配置
flink 1.19起 conf/flink-conf.yaml 更改为新的 conf/config.yaml standalone集群: dev001、dev002、dev003 config.yaml: jobmanager address 统一使用 dev001,bind-port 统一改成 0.0.0.0,taskmanager address 分别更改为dev所在host dev001 config.…...

【深度学习】GELU激活函数是什么?
torch.nn.GELU 模块在 PyTorch 中实现了高斯误差线性单元(GELU)激活函数。GELU 被用于许多深度学习模型中,包括Transformer,因为它相比传统的 ReLU(整流线性单元)函数能够更好地近似神经元的真实激活行为。…...

如何编译和运行您的第一个Java程序
如何编译和运行您的第一个Java程序 让我们从一个简单的java程序开始。 简单的Java程序 这是一个非常基本的java程序,它会打印一条消息“这是我在java中的第一个程序”。 public class FirstJavaProgram {public static void main(String[] args){System.…...

vscode用vue框架写一个登陆页面
目录 一、创建登录页面 二、构建好登陆页面的路由 三、编写登录页代码 1.添加基础结构 2.给登录页添加背景 3.解决填充不满问题 4.我们把背景的红颜色替换成背景图: 5.在页面中央添加一个卡片来显示登录页面 6.设置中间卡片页面的左侧 7.设置右侧的样式及…...

腾讯云API安全保障措施?有哪些调用限制?
腾讯云API的调用效率如何优化?怎么使用API接口发信? 腾讯云API作为腾讯云提供的核心服务之一,广泛应用于各行各业。然而,随着API应用的普及,API安全问题也日益突出。AokSend将详细探讨腾讯云API的安全保障措施&#x…...

在建设工程合同争议案件中,如何来认定“竣工验收”?
在建设工程合同争议案件中,如何来认定“竣工验收”? 建设工程的最终竣工验收,既涉及在建设单位组织下的五方单位验收,又需政府质量管理部门的监督验收以及竣工验收备案,工程档案还需递交工程所在地的工程档案馆归档。…...

Linux:多线程中的互斥与同步
多线程 线程互斥互斥锁互斥锁实现的原理封装原生线程库封装互斥锁 死锁避免死锁的四种方法 线程同步条件变量 线程互斥 在多线程中,如果存在有一个全局变量,那么这个全局变量会被所有执行流所共享。但是,资源共享就会存在一种问题࿱…...

数据仓库之主题域
数据仓库的主题域(Subject Area)是按照特定业务领域或主题对数据进行分类和组织的方式。每个主题域集中反映一个特定的业务方面,使得数据分析和查询更加清晰和高效。主题域通常与企业的关键业务过程相关,能够帮助用户在数据仓库中…...

【简易版tinySTL】 vector容器
文章目录 基本概念功能思路代码实现vector.htest.cpp 代码详解变量构造函数析构函数拷贝构造operatorpush_backoperator[]insertprintElements 本实现版本 和 C STL标准库实现版本的区别: 基本概念 vector数据结构和数组非常相似,也称为单端数组vector与…...

BRAVE:扩展视觉编码能力,推动视觉-语言模型发展
视觉-语言模型(VLMs)在理解和生成涉及视觉与文本的任务上取得了显著进展,它们在理解和生成结合视觉与文本信息的任务中扮演着重要角色。然而,这些模型的性能往往受限于其视觉编码器的能力。例如,现有的一些模型可能对某…...

使用 Verdaccio 建立私有npm库
网上有很多方法,但很多没标注nginx的版本所以踩了一些坑,下方这个文档是完善后的,对linux不是很熟练,所以不懂linux不会搭建的跟着做就可以了 搭建方法 首先需要一台云服务器 以139.196.226.123为例登录云服务器 下载node cd /usr/local/lib下载node 解压 下载 wget https://…...

个人职业规划(含前端职业+技术线路)
1. 了解自己的兴趣与长处 喜欢擅长的事 职业方向 2. 设定长期目标(5年) 目标内容 建立自己的品牌建立自己的社交网络 适量参加社交活动,认识更多志同道合的小伙伴寻求导师指导 建立自己的作品集 注意事项 每年元旦进行审视和调整永葆积极…...

LeetCode | 344.反转字符串
设置头尾两个指针,依靠中间变量temp交换头尾指针所指元素,头指针后移,尾指针前移,直到头尾指针重合或者头指针在尾指针后面一个元素 class Solution(object):def reverseString(self, s):""":type s: List[str]:r…...

一步一步用numpy实现神经网络各种层
1. 首先准备一下数据 if __name__ "__main__":data np.array([[2, 1, 0],[2, 2, 0],[5, 4, 1],[4, 5, 1],[2, 3, 0],[3, 2, 0],[6, 5, 1],[4, 1, 0],[6, 3, 1],[7, 4, 1]])x data[:, :-1]y data[:, -1]for epoch in range(1000):...2. 实现SoftmaxCrossEntropy层…...

vue学习(二)
9.vue中的数据代理 通过vm对象来代理data对象中的属性操作(读写),目的是为了更加方便操作data中的数据 基本原理:通过Object.defineProperty()把data对象所有属性添加到vm上,为每一个添加到vm上的属性,都增…...

Maven 介绍
Maven open in new window 官方文档是这样介绍的 Maven 的: Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a projects build, reporting and documentation fr…...

QT截图程序三-截取自定义多边形
上一篇文章QT截图程序,可多屏幕截图二,增加调整截图区域功能-CSDN博客描述了如何截取,具备调整边缘功能后已经方便使用了,但是与系统自带的程序相比,似乎没有什么特别,只能截取矩形区域。 如果可以按照自己…...

Unity的三种Update方法
1、FixedUpdate 物理作用——处理物理引擎相关的计算和刚体的移动 (1) 调用时机:在固定的时间间隔内,而不是每一帧被调用 (2) 作用:用于处理物理引擎的计算,例如刚体的移动和碰撞检测 (3) 特点:能更准确地处理物理…...

[Python学习篇] Python字典
字典是一种可变的、无序的键值对(key-value)集合。字典在许多编程(Java中的HashMap)任务中非常有用,因为它们允许快速查找、添加和删除元素。字典使用花括号 {} 表示。字典是可变类型。 语法: 变量 {key1…...

react项目中如何书写css
一:问题: 在 vue 项目中,我们书写css的方式很简单,就是在 .vue文件中写style标签,然后加上scope属性,就可以隔离当前组件的样式,但是在react中,是没有这个东西的,如果直…...

PostgreSQL源码分析——绑定变量
这里分析一下函数中应用绑定变量的问题,但实际应用场景中,不推荐这么使用。 prepare divplan2(int,int) as select div($1,$2); execute divplan2(4,2);语法解析 分别分析prepare语句以及execute语句。 gram.y中定义 /******************************…...

Zynq学习笔记--了解中断配置方式
目录 1. 简介 2. 工程与代码解析 2.1 Vivado 工程 2.2 Vitis 裸机代码 2.3 关键代码解析 3. 总结 1. 简介 Zynq 中的中断可以分为以下几种类型: 软件中断(Software Generated Interrupt, SGI):由软件触发,通常…...

吴恩达机器学习 第二课 week2 多分类问题
目录 01 学习目标 02 实现工具 03 概念与原理 04 应用示例 05 总结 01 学习目标 (1)理解二分类与多分类的原理区别 (2)掌握简单多分类问题的神经网络实现方法 (3)理解多分类问题算法中的激活函数与损失…...

112、路径总和
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。 叶子节点 是指没有子节点…...

Vue 封装组件之Input框
封装Input组件:MyInput.vue <template><div class"base-input-wraper"><el-inputv-bind"$attrs"v-on"$listeners"class"e-input":style"inputStyle":value"value":size"size"input&quo…...

一段代码让你了解Java中的抽象
我们先来看一道题! 计算几何对象的面积之和)编写一个方法,该方法用于计算数组中所有几何对象的面积之和。该方法的签名是: public static double sumArea(GeometricObject[] a) 编写一个测试程序,该程序创建一个包含四…...