当前位置: 首页 > news >正文

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引擎进行解析:

        结构 样式 属性

  1. Main线程(UI线程或原生线程):主要负责原生渲染(Native UI)和调用原生模块(Native Modules 
  2.  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 推出的开源框架&#xff0c;使用React和应用平台的原生功能来构建 Android 和 iOS 应用。通过 React Native&#xff0c;可以使用 JavaScript 来访问移动平台的 API&#xff0c;使用 React 组件来描述 UI 的…...

后端不提供文件流接口,前台js使用a标签实现当前表格数据(数组非blob数据)下载成Excel

前言&#xff1a;开发过程中遇到的一些业务场景&#xff0c;如果第三方不让使用&#xff0c;后端不提供接口&#xff0c;就只能拿到table数据(Array)&#xff0c;实现excel文件下载。 废话不多说&#xff0c;直接上代码&#xff0c;方法后续自行封装即可&#xff1a; functio…...

如何使用ChatGPT辅助设计工作

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

hadoop服务器启动后无法执行hdfs dfs命令

集群启动后&#xff0c;无法正常使用hdfs的任何命令。使用jps查看进程&#xff0c;发现namenode没有启动&#xff0c;然后再进入到Hadoop的相应目录&#xff0c;打开里面的logs文件 打开Hadoop的master的log 再使用vi编辑器查看&#xff08;也可以用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&#xff0c;bind-port 统一改成 0.0.0.0&#xff0c;taskmanager address 分别更改为dev所在host dev001 config.…...

【深度学习】GELU激活函数是什么?

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

如何编译和运行您的第一个Java程序

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

vscode用vue框架写一个登陆页面

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

腾讯云API安全保障措施?有哪些调用限制?

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

在建设工程合同争议案件中,如何来认定“竣工验收”?

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

Linux:多线程中的互斥与同步

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

数据仓库之主题域

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

【简易版tinySTL】 vector容器

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

BRAVE:扩展视觉编码能力,推动视觉-语言模型发展

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

使用 Verdaccio 建立私有npm库

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

个人职业规划(含前端职业+技术线路)

1. 了解自己的兴趣与长处 喜欢擅长的事 职业方向 2. 设定长期目标&#xff08;5年&#xff09; 目标内容 建立自己的品牌建立自己的社交网络 适量参加社交活动&#xff0c;认识更多志同道合的小伙伴寻求导师指导 建立自己的作品集 注意事项 每年元旦进行审视和调整永葆积极…...

LeetCode | 344.反转字符串

设置头尾两个指针&#xff0c;依靠中间变量temp交换头尾指针所指元素&#xff0c;头指针后移&#xff0c;尾指针前移&#xff0c;直到头尾指针重合或者头指针在尾指针后面一个元素 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对象中的属性操作&#xff08;读写&#xff09;&#xff0c;目的是为了更加方便操作data中的数据 基本原理&#xff1a;通过Object.defineProperty()把data对象所有属性添加到vm上&#xff0c;为每一个添加到vm上的属性&#xff0c;都增…...

Maven 介绍

Maven open in new window 官方文档是这样介绍的 Maven 的&#xff1a; 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截图程序&#xff0c;可多屏幕截图二&#xff0c;增加调整截图区域功能-CSDN博客描述了如何截取&#xff0c;具备调整边缘功能后已经方便使用了&#xff0c;但是与系统自带的程序相比&#xff0c;似乎没有什么特别&#xff0c;只能截取矩形区域。 如果可以按照自己…...

Unity的三种Update方法

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

[Python学习篇] Python字典

字典是一种可变的、无序的键值对&#xff08;key-value&#xff09;集合。字典在许多编程&#xff08;Java中的HashMap&#xff09;任务中非常有用&#xff0c;因为它们允许快速查找、添加和删除元素。字典使用花括号 {} 表示。字典是可变类型。 语法&#xff1a; 变量 {key1…...

react项目中如何书写css

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

PostgreSQL源码分析——绑定变量

这里分析一下函数中应用绑定变量的问题&#xff0c;但实际应用场景中&#xff0c;不推荐这么使用。 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 中的中断可以分为以下几种类型&#xff1a; 软件中断&#xff08;Software Generated Interrupt, SGI&#xff09;&#xff1a;由软件触发&#xff0c;通常…...

吴恩达机器学习 第二课 week2 多分类问题

目录 01 学习目标 02 实现工具 03 概念与原理 04 应用示例 05 总结 01 学习目标 &#xff08;1&#xff09;理解二分类与多分类的原理区别 &#xff08;2&#xff09;掌握简单多分类问题的神经网络实现方法 &#xff08;3&#xff09;理解多分类问题算法中的激活函数与损失…...

112、路径总和

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 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中的抽象

我们先来看一道题&#xff01; 计算几何对象的面积之和&#xff09;编写一个方法&#xff0c;该方法用于计算数组中所有几何对象的面积之和。该方法的签名是&#xff1a; public static double sumArea(GeometricObject[] a) 编写一个测试程序&#xff0c;该程序创建一个包含四…...

怎么查公司营业执照图片/seo网站有哪些

前言今天从github把我以前写的一个小demo下载下来了&#xff0c;第一次下载项目&#xff0c;摸索了一个多小时&#xff0c;才运行起来。下载有两种方法&#xff0c;通过git下载&#xff0c;或者直接压缩包下载&#xff0c;本文选的是压缩包下载,压缩包下载1. 解压项目2. 导入到…...

互联科技 行业网站/抖音关键词用户搜索排名靠前

扩展rhel5.9下使用lvm管理的根分区 核心步骤&#xff1a; 添加sdb----->pvcreate----->vgextend----->lvextend----->resize2fs 文件系统信息如下&#xff1a; [rootrhel59 ~]# df -hFilesystem Size Used Avail Use% Mounted on/dev/mapper/VolGr…...

宁波网站关键词优化公司/百度关键词搜索广告的优缺点

【原文】 Cache的基本用途 提到Cache&#xff0c;不得不说说它的主要功能&#xff1a;改善程序性能。 ASP.NET是一种动态页面技术&#xff0c;用ASP.NET技术做出来的网页几乎都是动态的&#xff0c;所谓动态是指&#xff1a;页面的内容会随着不同的用户或者持续更新的数据&…...

设计公司网站官网/一键优化大师

千呼万唤始出来&#xff0c;Eclipse总算出3.0版了...

怎么把wordpress的博客变成题目/网络营销的特点分别是

我使用的是delphi5的server控件&#xff0c;不知道各位有什么好方法没有&#xff0e;下面是我的代码&#xff0c;总是不能实现不知道这是为什么&#xff01;&#xff01;不好意识&#xff0c;没多少分了&#xff0e;全部奉上tryExcelApplication1.Connect;ExcelApplication1.Vi…...

建设银行税务网站/谷歌seo推广

Codrops 上面发布了一个深入的教程&#xff0c;就如何建立谷歌材料设计的径向操作规范中列出的涟漪效果&#xff0c;并基于 SVG 和 GreenSock 来实现。随着谷歌的材料设计的出现&#xff0c;带来了一个视觉语言&#xff0c;创建跨平台和设备的统一体验。在本教程中&#xff0c;…...