前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >刚刚,React 19 正式发布!

刚刚,React 19 正式发布!

作者头像
程序员鱼皮
发布于 2024-12-09 05:21:15
发布于 2024-12-09 05:21:15
87002
代码可运行
举报
文章被收录于专栏:鱼皮客栈鱼皮客栈
运行总次数:2
代码可运行

12 月 6 日,React 19 正式发布,本文来看看该版本都带来了那些更新!

React 19 更新详情:https://react.dev/blog/2024/12/05/react-19 翻译、整理:前端充电宝 友情提示:文末查看省流版(总结)

React 19 更新内容

Actions

Actions 是一种简化请求数据处理的方法统称。

在 React 应用中,一个很常见的用例是执行数据变更,然后根据响应更新状态。例如,当用户提交表单以更改其姓名时,需要发起 API 请求,并处理响应结果。在过去,需要手动处理等待状态、错误、乐观更新以及顺序请求等。

例如,可以使用 useState 来管理等待和错误状态:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
function UpdateName({}) {
  const [name, setName] = useState('');
  const [error, setError] = useState(null);
  const [isPending, setIsPending] = useState(false);

  const handleSubmit = async () => {
    setIsPending(true);
    const error = await updateName(name);
    setIsPending(false);
    if (error) {
      setError(error);
      return;
    } 
    redirect('/path');
  };

  return (
    <div>
      <input value={name} onChange={(event) => setName(event.target.value)} />
      <button onClick={handleSubmit} disabled={isPending}>
        Update
      </button>
      {error && <p>{error}</p>}
    </div>
  );
}

在 React 19 中,增加了对在转换中使用异步函数的支持,以自动处理等待状态、错误、表单和乐观更新。

例如,可以使用useTransition来自动处理等待状态:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
function UpdateName({}) {
  const [name, setName] = useState('');
  const [error, setError] = useState(null);
  const [isPending, startTransition] = useTransition();

  const handleSubmit = () => {
    startTransition(async () => {
      const error = await updateName(name);
      if (error) {
        setError(error);
        return;
      } 
      redirect('/path');
    })
  };

  return (
    <div>
      <input value={name} onChange={(event) => setName(event.target.value)} />
      <button onClick={handleSubmit} disabled={isPending}>
        Update
      </button>
      {error && <p>{error}</p>}
    </div>
  );
}

异步转换会立即将isPending状态设置为true,发起异步请求,并在任何转换完成后将isPending切换回false。这样就可以在数据变更时保持当前 UI 的响应性和交互性。

在 React 19 中,基于 Actions 的概念,引入了useOptimistic来管理乐观更新,以及一个全新的 Hook React.useActionState用于处理常见的 Actions 场景。在react-dom中,添加了<form> Actions 来自动管理表单,以及useFormStatus来支持表单中常见的 Actions 场景。

在 React 19 中,上面的例子可以简化为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
function ChangeName({ name, setName }) {
  const [error, submitAction, isPending] = useActionState(
    async (previousState, formData) => {
      const error = await updateName(formData.get('name'));
      if (error) {
        return error;
      }
      redirect('/path');
      return null;
    },
    null,
  );

  return (
    <form action={submitAction}>
      <input type='text' name='name' />
      <button type='submit' disabled={isPending}>Update</button>
      {error && <p>{error}</p>}
    </form>
  );
}

全新 Hook:useActionState

为了更简单的处理常见的 Actions 场景,React 19 引入了一个全新的 Hook useActionState

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
const [error, submitAction, isPending] = useActionState(
  async (previousState, newName) => {
    const error = await updateName(newName);
    if (error) {
      // 可以返回Action的任何结果
      // 在这里,只返回错误
      return error;
    }
    
    // 处理成功情况
    return null;
  },
  null,
);

useActionState接受一个函数(即 Action),并返回一个包装后的 Action 以供调用。当调用包装后的 Action 时,useActionState将返回Action的最后结果作为data,并返回Action的等待状态作为pending

React DOM: <form> Actions

在 React 19 中,Actions 被集成到了 react-dom 新引入的 <form> 功能中。现在支持将函数作为 <form><input><button> 元素的 actionformAction 属性传递,以使用 Actions 自动提交表单:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
<form action={actionFunction}>

<form>相关的 Action 执行成功时,React 会自动重置那些不受控组件的表单。如果需要手动重置<form>,可以调用新的 React DOM API requestFormReset

React DOM 全新 Hook:useFormStatus

在设计系统中,通常需要编写设计组件,这些组件需要获取其所处 <form> 表单的相关信息,但又不想通过 props 逐级向下传递。虽然可以通过 Context 来实现这一点,但为了让这种常见情况更简单,React 19 添加了一个全新的 Hook:useFormStatus

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
import {useFormStatus} from 'react-dom';

function DesignButton() {
  const {pending} = useFormStatus();
  return <button type='submit' disabled={pending} />
}

useFormStatus可以读取父级<form> 的状态,就好像该表单是一个 Context 提供者一样。

全新 Hook:useOptimistic

在执行数据变更操作时,另一种常见的 UI 模式是:在异步请求正在进行的过程中,以乐观的方式展示最终状态。在 React 19 中,新增了一个名为useOptimistic的 Hook,以简化这一过程:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
function ChangeName({currentName, onUpdateName}) {
  const [optimisticName, setOptimisticName] = useOptimistic(currentName);

  const submitAction = async formData => {
    const newName = formData.get('name');
    setOptimisticName(newName);
    const updatedName = await updateName(newName);
    onUpdateName(updatedName);
  };

  return (
    <form action={submitAction}>
      <p>Your name is: {optimisticName}</p>
      <p>
        <label>Change Name:</label>
        <input
          type='text'
          name='name'
          disabled={currentName !== optimisticName}
        />
      </p>
    </form>
  );
}

useOptimistic Hook 将在 updateName 请求过程中立即渲染 optimisticName。当更新完成或出现错误时,React 将自动切换回 currentName 值。

全新 API:use

在 React 19 中,引入了一个新 API 来在渲染过程中读取资源:use

例如,可以使用 use 来读取一个 Promise,React 将挂起,直到promise成功解析:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
import {use} from 'react';

function Comments({commentsPromise}) {
  // “use”会进行“挂起”操作,直到“Promise”被成功解析。
  const comments = use(commentsPromise);
  return comments.map(comment => <p key={comment.id}>{comment}</p>);
}

function Page({commentsPromise}) {
  // 当“Comments”组件中“use”进行“挂起”操作时,
  // 这个“Suspense”边界(组件)将会被显示出来。
  return (
    <Suspense fallback={<div>Loading...</div>}>
      <Comments commentsPromise={commentsPromise} />
    </Suspense>
  )

我们还可以使用 use 来读取 Context,这使得你可以有条件地读取 Context,例如在提前返回之后读取:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
import {use} from 'react';
import ThemeContext from './ThemeContext'

function Heading({children}) {
  if (children == null) {
    return null;
  }
  
  // 由于存在提前返回的情况,使用useContext是行不通的。
  const theme = use(ThemeContext);
  return (
    <h1 style={{color: theme.color}}>
      {children}
    </h1>
  );
}

use API 只能在渲染过程中调用,类似于 Hooks。与 Hooks 不同的是,use 可以有条件地调用。未来计划支持更多使用 use 在渲染过程中消费资源的方式。

新的 React DOM 静态 API

React 19 为react-dom/static添加了两个新的 API,用于静态网站生成:

  • prerender
  • prerenderToNodeStream

这两个新 API 改进了 renderToString,通过等待数据加载来生成静态 HTML。它们被设计为与流环境(如 Node.js Streams 和 Web Streams)一起工作。例如,在 Web Stream 环境中,可以使用 prerender 将 React 组件树预渲染为静态 HTML:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
import { prerender } from 'react-dom/static';

async function handler(request) {
  const {prelude} = await prerender(<App />, {
    bootstrapScripts: ['/main.js']
  });
  return new Response(prelude, {
    headers: { 'content-type': 'text/html' },
  });
}

prerender API 会在返回静态 HTML 流之前等待所有数据加载完成。流可以被转换为字符串,或者通过流式响应进行发送。它们不支持在加载内容时进行流式传输,而现有的 React DOM 服务端渲染 API 是支持这种流式传输的。

React Server Components

服务器组件

服务器组件是一个新的选项,它允许在打包之前,在与客户应用或服务端渲染(SSR)服务器分离的环境中预先渲染组件。这个分离的环境就是 React 服务器组件中的“服务器”。服务器组件既可以在持续集成(CI)服务器上构建时运行一次,也可以在使用Web服务器时针对每个请求运行。

React 19 包含了从 Canary 版本引入的所有 React 服务器组件功能。这意味着,现在提供服务器组件的库可以将 React 19 作为对等依赖项,并使用 react-server 导出条件,以便在支持全栈 React 架构的框架中使用。

服务器 Actions

服务器 Actions 允许客户端组件调用在服务器上执行的异步函数。

当使用 “use server” 指令定义一个服务端 Actions 时,框架会自动创建一个指向服务器函数的引用,并将这个引用传递给客户端组件。当客户端调用这个函数时,React 会发送一个请求到服务器执行该函数,并返回结果。

服务器 Actions 可以在服务器组件中创建,并通过 props 传递给客户端组件,也可以被导入并在客户端组件中使用。

其他更新

ref 作为 prop

从 React 19 开始,可以在函数组件中通过 prop 访问 ref

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
function MyInput({placeholder, ref}) {
  return <input placeholder={placeholder} ref={ref} />
}

//...
<MyInput ref={ref} />

新的函数组件将不再需要 forwardRef,React 团队将发布一个代码转换工具(codemod),以自动更新组件,使其使用新的 ref prop。在以后的版本中,将弃用并移除 forwardRef

水合错误的差异信息展示

React 19 还改进了 react-dom 中针对水合错误的报错报告。例如,之前在开发环境(DEV)中,并不会展示任何关于不匹配情况的信息,而是记录多个错误;

现在,改为记录一条包含不匹配差异信息的消息:

作为提供者

在 React 19 中,可以将<Context>作为提供者,而不必使用<Context.Provider>

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
const ThemeContext = createContext('');

function App({children}) {
  return (
    <ThemeContext value='dark'>
      {children}
    </ThemeContext>
  );  
}

新的 Context 提供者可以使用 <Context>,React 团队将发布一个代码转换工具(codemod)来转换现有的提供者。在未来的版本中,将弃用 <Context.Provider>

refs 的清理函数

在 React 19 中,支持从 ref 的回调函数中返回一个清理函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
<input
  ref={(ref) => {
    // 引用已创建

    // 新增:返回一个清理函数,以便在元素从DOM中移除时重置引用。
    return () => {
      // 执行引用清理操作
    };
  }}
/>

当组件卸载时,React 会调用从 ref 回调函数中返回的清理函数。这适用于 DOM 引用、指向类组件的引用以及useImperativeHandle的情况。

由于引入了 ref 清理函数,现在从 ref 回调函数中返回其他任何内容都会被 TypeScript 拒绝。解决办法通常是停止使用隐式返回,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
- <div ref={current => (instance = current)} />
+ <div ref={current => {instance = current}} />

原代码返回了HTMLDivElement的实例,而 TypeScript 无法判断这是否是一个清理函数,或者你并不想返回清理函数。

useDeferredValue 初始值

在 React 19 中,为useDeferredValue添加了一个initialValue选项:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
function Search({deferredValue}) {
  // 在初始渲染时,值为 ''
  // 然后会基于 deferredValue 进行重新渲染
  const value = useDeferredValue(deferredValue, '');
  
  return (
    <Results query={value} />
  );
}

当提供 initialValue 时,useDeferredValue 将在组件的初始渲染中将其作为值返回,并在后台计划用返回的 deferredValue 进行重新渲染。

支持文档元数据

在HTML文档中,诸如<title><link><meta>等元数据标签通常被专门放置在<head>部分。然而,在 React 中,确定并应用恰当的元数据可能会变得复杂,因为这些组件可能远离实际渲染<head>标签的位置,甚至 React 本身可能并不直接渲染<head>。过去,这些元素需要在副作用中手动插入,或者通过像 react-helmet 这样的库来处理,并且在服务端渲染 React 应用时需要小心处理。

在 React 19 中,增加了对在组件中原生渲染文档元数据标签的支持:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
function BlogPost({post}) {
  return (
    <article>
      <h1>{post.title}</h1>
      <title>{post.title}</title>
      <meta name='author' content='Josh' />
      <link rel='author' href='https://twitter.com/joshcstory/' />
      <meta name='keywords' content={post.keywords} />
      <p>
        Eee equals em-see-squared...
      </p>
    </article>
  );
}

当 React 渲染这个组件时,它会识别 <title><link><meta> 标签,并自动将它们提升到文档的 <head> 部分。通过原生支持这些元数据标签,能够确保它们在仅限客户端应用、流式服务端渲染和服务器组件中正常工作。

样式表支持

无论是外部链接的样式表(如<link rel='stylesheet' href='...'>)还是内联样式表(如<style>...</style>),由于样式优先级规则的存在,它们在 DOM 中的放置位置都需要谨慎。构建一个允许在组件内部进行组合的样式表功能是很困难的,所以用户往往要么将所有样式加载到距离可能依赖它们的组件很远的地方,要么使用封装了这种复杂性的样式库。

在 React 19 中,解决了这种复杂性,并通过内置对样式表的支持,在客户端的并发渲染以及服务端流式渲染方面实现更深入的集成。如果你告知 React 样式表的优先级,它将会管理样式表在 DOM 中的插入顺序,并确保样式表(如果是外部样式表的话)在显示依赖于这些样式规则的内容之前加载该样式表。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
function ComponentOne() {
  return (
    <Suspense fallback='loading...'>
      <link rel='stylesheet' href='foo' precedence='default' />
      <link rel='stylesheet' href='bar' precedence='high' />
      <article class='foo-class bar-class'>
        {...}
      </article>
    </Suspense>
  )
}

function ComponentTwo() {
  return (
    <div>
      <p>{...}</p>
      <link rel='stylesheet' href='baz' precedence='default' />  <!-- 将被插入到 foo 和 bar 之间 -->
    </div>
  )
}

在服务端渲染期间,React 将把样式表包含在 <head> 中,这确保了浏览器在加载完成后才会绘制。如果在开始流式传输后发现样式表,React 将确保在客户端的 <head> 中插入样式表,然后才显示依赖于该样式表的 Suspense 边界的内容。

在客户端渲染期间,React 将等待新渲染的样式表加载完成后再提交渲染。如果在应用的多个地方渲染这个组件,React 将只在文档中包含一次样式表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
function App() {
  return <>
    <ComponentOne />
    ...
    <ComponentOne /> // 不会导致 DOM 中出现重复的样式表链接
  </>
}

对于习惯于手动加载样式表的用户来说,这是一个将样式表放置在依赖它们的组件旁边的好机会,这样能更便于局部分析,也更容易确保只加载实际依赖的样式表。

样式库和与打包工具的样式集成也可以采用这一功能,因此即使不直接渲染自己的样式表,当使用的工具升级以使用该功能时,仍然可以从中受益。

支持异步脚本

在 HTML 中,普通脚本(<script src='...'>)和延迟脚本(<script defer='' src='...'>)按照文档顺序加载,这使得在组件树的深处渲染这些类型的脚本变得具有挑战性。然而,异步脚本(<script async='' src='...'>)会以任意顺序加载。

在 React 19 中,通过允许在组件树的任意位置渲染异步脚本,提供了对异步脚本更好的支持,即在实际依赖该脚本的组件内部渲染它们,而无需管理脚本实例的重新定位和去重。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
function MyComponent() {
  return (
    <div>
      <script async={true} src='...' />
      Hello World
    </div>
  );
}

function App() {
  return (
    <html>
      <body>
        <MyComponent>
      ...
        <MyComponent> // 不会导致DOM中出现重复的脚本
      </body>
    </html>
  );
}

在所有的渲染环境中,异步脚本都会进行去重处理,所以即便它被多个不同的组件渲染,React 也只会加载并执行该脚本一次。

在服务端渲染过程中,异步脚本会被包含在<head>部分,并优先级排在更关键的资源之后,这些资源会阻塞绘制,如样式表、字体和图片预加载。

支持预加载资源

在初始文档加载以及客户端更新期间,尽早告知浏览器它可能需要加载的资源,会对页面性能产生显著的影响。

React 19 包含了许多用于加载和预加载浏览器资源的新 API,旨在尽可能简便地打造优质的用户体验,避免因资源加载效率低下而受到影响。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
import { prefetchDNS, preconnect, preload, preinit } from 'react-dom';

function MyComponent() {
  preinit('https://.../path/to/some/script.js', { as: 'script' }); // 积极加载并执行此脚本
  preload('https://.../path/to/font.woff', { as: 'font' }); // 预加载此字体
  preload('https://.../path/to/stylesheet.css', { as: 'style' }); // 预加载此样式表
  prefetchDNS('https://...'); // 当你实际上可能不会从此主机请求任何内容时
  preconnect('https://...'); // 当你将请求某些内容但不确定是什么时
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
<html>
  <head>
    <!-- 链接/脚本根据其对早期加载的有用性进行优先级排序,而不是调用顺序 -->
    <link rel='prefetch-dns' href='https://...'> 
    <link rel='preconnect' href='https://...'> 
    <link rel='preload' as='font' href='https://.../path/to/font.woff'> 
    <link rel='preload' as='style' href='https://.../path/to/stylesheet.css'> 
    <script async='' src='https://.../path/to/some/script.js'></script> 
  </head>
  <body>
    ...
  </body>
</html>

这些 API 可用于优化初始页面加载,比如将字体等额外资源的发现过程从样式表加载环节中分离出来。它们还能通过预取预期导航将会用到的资源列表,然后在点击甚至悬停操作时就立即预加载这些资源,从而加快客户端更新的速度。

与第三方脚本和扩展的兼容性

在 React 19 中,改进了 hydration(水合,即客户端激活)以适应第三方脚本和浏览器扩展。

在水合过程中,如果在客户端渲染的元素与服务端生成的 HTML 中的元素不匹配,React 将强制客户端重新渲染以修正内容。以前,如果元素是由第三方脚本或浏览器扩展插入的,它将触发不匹配错误并导致客户端重新渲染。

在 React 19 中,<head><body> 中的意外标签将被跳过,避免了不匹配错误。如果 React 需要由于与水合不相关的错误而重新渲染整个文档,它将保留由第三方脚本和浏览器扩展插入的样式表。

更好的错误报告

React 19 中改进了错误处理,以消除重复并提供处理捕获和未捕获错误的选项。例如,当渲染过程中出现错误并被 Error Boundary 捕获时,以前 React 会抛出错误两次(一次是原始错误,然后是在尝试自动恢复失败后再次抛出),然后调用 console.error 显示错误发生位置的信息。

这导致每个捕获的错误都有三个错误:

在 React 19 中,只会记录一个包含所有错误信息的单一错误:

在 React 19 中,引入了三个新的根选项来补充 onRecoverableError

  • onCaughtError:当 React 在 Error Boundary 中捕获错误时调用。
  • onUncaughtError:当抛出错误并且未被 Error Boundary 捕获时调用。
  • onRecoverableError:当抛出错误并自动恢复时调用。
支持自定义元素

React 19 增加了对自定义元素的完整支持,并通过了Custom Elements Everywhere的所有测试。

在以前的版本中,由于 React 将未识别的 props 视为 HTML 属性而不是 JavaScript 属性,所以在 React 中使用自定义元素一直很困难。在 React 19 中,增加了对 JS 属性的支持,这在客户端和服务端渲染(SSR)中都有效,具体策略如下:

  • 服务端渲染:传递给自定义元素的 props 如果是原始值类型,如字符串、数字,或者值为 true,它们将作为 HTML 属性渲染。具有非原始值类型(如对象、符号、函数)或值为 falseprops 将被省略。
  • 客户端渲染:与自定义元素实例上的属性匹配的 props 将被分配为 JS 属性,否则它们将被分配为 HTML 属性。

React 19 更新总结

  • Actions:
    • useActionState Hook:接受一个函数(Action),返回包装后的 Action 供调用,调用时返回结果和等待状态,用于简化常见的 Actions 场景处理。
    • useOptimistic Hook:在执行数据变更的异步请求时,以乐观方式展示最终状态,更新完成或出错后自动切换回原值,优化用户界面反馈。
    • <form> Actions 集成:在react-dom中,支持将函数作为<form><input><button>元素的相关属性传递,实现自动提交表单,成功时自动重置不受控组件表单,也可手动调用requestFormReset API 重置。
    • useFormStatus Hook:方便编写设计组件获取所处<form>表单信息,无需层层传递 props,可像读取 Context 提供者状态一样读取表单状态。
  • use API:用于在渲染时读取资源,可读取 Promise 并让 React 挂起直至其解析,也能读取 Context,且可条件性调用。
  • 新的 React DOM 静态 APIprerenderprerenderToNodeStream用于静态网站生成,改进renderToString功能,会等待数据加载后生成静态 HTML,适配 Node.js Streams 和 Web Streams 等流环境。
  • React Server Components:提供在独立于客户端应用或 SSR 服务器环境中提前渲染组件的新选择,相关库可将 React 19 作为对等依赖,应用于支持全栈 React 架构的框架。
  • ref 作为 prop:现在可以在函数组件中直接使用 ref 作为 prop
  • 水合错误改进:改进了客户端渲染和服务端渲染之间的水合错误报告。
  • <Context> 作为提供者:可以直接使用 <Context> 作为提供者,而不是 <Context.Provider>
  • ref 的清理函数:现在可以从 ref 回调中返回一个清理函数。
  • useDeferredValue 的初始值:为 useDeferredValue 添加了 initialValue 选项。
  • 文档元数据支持:支持在组件中渲染 <title><link><meta> 标签,并自动提升到文档的 <head> 部分。
  • 样式表支持:提供了对样式表的内置支持,包括外部链接和内联样式。
  • 异步脚本支持:改进了对异步脚本的支持,允许在组件树的任何位置渲染它们。
  • 资源预加载支持:包括 prefetchDNSpreconnectpreloadpreinit 等 API,用于优化资源加载。
  • 与第三方脚本和扩展的兼容性:改进了水合以适应第三方脚本和浏览器扩展。
  • 更好的错误报告:改进了错误处理,减少了重复错误,并提供了处理捕获和未捕获错误的选项。
  • 对自定义元素的支持:增加了对自定义元素的全面支持。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-12-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员鱼皮 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
三种方法!教会你用DeepSeek绘制各种图表,真的太好用了(建议收藏)
我以前就特别头疼做图表,要么就是Excel那些看起来十分古朴的柱状图,要么就是被各种专业可视化工具的复杂操作折磨得死去活来。你以为学个Tableau、Power BI就能解决问题?别闹了,光是入门就够你喝一壶的!
一臻AI
2025/04/06
7000
三种方法!教会你用DeepSeek绘制各种图表,真的太好用了(建议收藏)
技术文档破局之道:从新手到高手的蜕变
在技术的广袤宇宙中,技术文档宛如那默默闪烁的星辰,虽不总是吸引众人瞩目的焦点,却在幕后支撑着整个技术生态系统的有序运转,是名副其实的 “技术领域的隐形翅膀”。
正在走向自律
2025/06/09
290
技术文档破局之道:从新手到高手的蜕变
干货!3个案例教你使用DeepSeek制作可视化图表,相当酷炫
DeepSeek作为生产力爆棚的AI工具,已经被用于各种办公场景,作为平时接触数据比较多的我来说,它其实是一个数据可视化的利器,能自主制作各种数据可视化图表,而且颜值还非常高。
派大星的数据屋
2025/03/17
6210
干货!3个案例教你使用DeepSeek制作可视化图表,相当酷炫
一句话!教会你用腾讯元宝+DeepSeek绘制各种图表,99%的人都不知道
你是否经常为制作专业图表而焦头烂额?Excel操作太复杂,配色不够专业,交互效果做不出来...
一臻AI
2025/04/07
5840
一句话!教会你用腾讯元宝+DeepSeek绘制各种图表,99%的人都不知道
在日常生活、工作中deepseek能帮我们解决哪些问题
DeepSeek极大降低了普通人使用AI的门槛,让AI快速渗透到人们的工作和生活中,无论是专业场景提效、教育学术赋能、商业创新甚至日常生活,都变得更加轻松。
星哥玩云
2025/03/04
6110
在日常生活、工作中deepseek能帮我们解决哪些问题
【AGI-Eval学习干货 NO.2】DeepSeek小白必看指南,隐藏1000个提示词参考(建议收藏)
这个热搜#博主卖 DeepSeek 相关课程 1 天收入 50000#,我看到之后感觉得做一期干货内容,DeepSeek 的玩法现在都在摸索阶段,和大家一起学习探索。
AGI-Eval评测社区
2025/03/14
1590
【AGI-Eval学习干货 NO.2】DeepSeek小白必看指南,隐藏1000个提示词参考(建议收藏)
强烈推荐!一个可以把文本生成漂亮图表的AI做图神器
人类大脑处理图像比文字快60,000倍!一张精良图表3秒内能传达需5分钟才读完的内容。
一臻AI
2025/04/21
5710
强烈推荐!一个可以把文本生成漂亮图表的AI做图神器
ChatGPT 中文调教指南
ChatGPT是由OpenAI 训练的一款大型语言模型,能够和你进行任何领域的对话。
用户10399177
2023/03/28
1.5K2
【AGI-Eval行业干货 NO.2】DeepSeek使用必看指南,隐藏1000个提示词参考(建议收藏)
昨天,一款热搜词条#博主卖 DeepSeek 相关课程 1 天收入 50000 元#引起热议。看了热搜描述的课程内容,我感觉最近各路媒体发的公众号干货内容不得赚它个10万8万的,真不至于花钱,今天免费给大家提供一些玩法和思路,不花钱的干货才是最香的。
AGI-Eval评测社区
2025/02/19
1570
【AGI-Eval行业干货 NO.2】DeepSeek使用必看指南,隐藏1000个提示词参考(建议收藏)
DeepSeek R1 Zero中文复现教程来了!
项目代码可见:unlock-deepseek/Datawhale-R1(https://github.com/datawhalechina/unlock-deepseek),欢迎关注和 star!
Datawhale
2025/02/07
2.9K1
DeepSeek R1 Zero中文复现教程来了!
干货!TAPD编辑器完整使用攻略
说到产品经理的基本技能,很多人第一时间都会想到【需求文档】。好的需求文档可以最大限度降低开发人员/设计人员对产品需求的理解难度,保证各部门沟通有序进展。同时,一份逻辑清晰、结构完整的需求文档沉淀下来,也会成为团队宝贵的财富,为后续团队内部的信息互通、产品质量把控、团队复盘等等场景提供有力依据,持续不断地为团队研发赋能。 那么,如何才能让需求文档更加逻辑清晰、结构完整、有图有依据呢?所谓“工欲善其事必先利其器”,需求编辑器的使用体验,与需求文档最终的呈现效果息息相关。接下来,我们将送上一份超实用攻略,
TAPD敏捷研发
2021/10/13
3.1K1
要想做好架构可视化,你必须弄懂这十个关系
在企业数字化转型过程中,做好企业级架构的治理至关重要。而架构的可视化是其中关键的一环。围绕可视化的架构,干系人能够更好地理解和沟通企业中不同组织、系统和技术组件的结构和关系。以便不断对企业的系统架构进行优化。 在 ArcSummit 全球架构师峰会(上海站)2023 上,InfoQ 邀请了 Thoughtworks 首席咨询师钟敬,他以《企业级架构可视化实践》为主题展开了分享,本文为分享整理~期待对您在企业中开展架构治理工作有所启发。
深度学习与Python
2023/08/09
6050
要想做好架构可视化,你必须弄懂这十个关系
DeepSeek上手指南:普通人也能轻松驾驭AI
在人工智能的蓬勃发展的时代,新的技术和工具不断涌现,DeepSeek 便是其中一颗耀眼的新星。它是由杭州深度求索人工智能基础技术研究有限公司开发的人工智能大模型,自问世以来,便凭借其卓越的性能和独特的优势,在 AI 领域迅速崭露头角,吸引了全球目光。
天涯学馆
2025/02/20
3550
DeepSeek上手指南:普通人也能轻松驾驭AI
如果你不知道做什么,那就学一门杂学吧
多年以后,面对人工智能研究员那混乱不堪的代码,我会想起第一次和S君相见的那个遥远的下午。那时的B公司,还是一个仅有6个人的小团队,Mac和显示器在桌上依次排开,大家坐在一起,不需要称呼姓名,转过脸去,对方就知道你在和他说话。一切看起来都那么美好,我们所有人,都希望自己和这个公司能够一起成长。
青南
2018/10/13
7920
腾讯云WeData Notebook:数据科学家的最佳拍档
在大数据领域,随着技术的不断进步和数据的爆炸性增长,数据分析和数据探查已成为企业和组织决策制定的关键因素。在当前的数据分析场景中,Notebook 类的数据分析和探索工具已经成为数据科学家和分析师们的首选。市面上常用的交互式数据分析 Notebook 工具有 Jupyter Notebook、Apache Zeppelin和Databricks Notebook 等,它们在数据分析和探索领域都有自己独特的特点和适用场景,其中最火的当属 Jupyter Notebook。
腾讯QQ大数据
2024/07/29
2940
腾讯云WeData Notebook:数据科学家的最佳拍档
免费、好用、好看的思维导图软件综合测评:Draw.io、Gitmind、Xmind、MindMaster、Effie、Scapple、Miro、Excalidr
思维导图从上个世纪九十年代传入中国大陆。从此之后,基于思维导图理念的各种产品如雨后春笋般涌现。在这些产品中,既有基于思维导图理念的专业思维导图工具,比如 MindMaster,也有与思维导图相关的流程图工具,比如 Processon(这类产品一般都囊括了思维导图)。此外,一些云笔记软件也内置了思维导图功能,比如印象笔记。在这些百花齐放的思维导图工具中,具体应该怎么选择呢?
数字花园
2022/06/29
4.2K0
免费、好用、好看的思维导图软件综合测评:Draw.io、Gitmind、Xmind、MindMaster、Effie、Scapple、Miro、Excalidr
企业架构 | TOGAF内容框架
TOGAF 9之前的版本中没有企业架构的具体内容相关的论述,需要与其他具有企业架构内容描述的框架(例如Zachman框架)进行配合。随着内容框架(Content Framework)的引入,以及企业架构开发方法与该内容框架的相互结合,TOGAF已经成为一个独立完备的企业架构框架标准。
架构之家
2022/07/12
4.5K0
企业架构 | TOGAF内容框架
OpenAI官方提示词教程与实战指南
该指南分享了获取更好结果的策略和战术,适用于像GPT-4这样的大型语言模型(有时也称为GPT模型)。这里描述的方法有时可以组合使用以获得更好的效果。我们鼓励进行试验,找到最适合您的方法。
山行AI
2023/12/28
9410
OpenAI官方提示词教程与实战指南
高效速搭基于DeepSeek的招标文书智能写作Agent
如果你一直在跟着博主的脚步探索AI大模型的相关内容,从最初的大模型Prompt工程解析,到实际的开发部署,再到深入NL2SQL、知识图谱大模型和ChatBI等更高阶应用,应该已经感受到了我们一步一个脚印,从迈过一道道技术难关,到搭建起属于自己的技术桥梁的过程。如今,我们或许对大模型的开发已经有些轻车熟路,但也必须承认,技术的迭代速度实在太快了。要想跟上AI技术发展的步伐,把最新的人工智能技术融入现有业务和应用场景才是我们追求的最终目标。
fanstuck
2025/02/23
1.7K6
高效速搭基于DeepSeek的招标文书智能写作Agent
人生苦短、程序员必备神器!从开发到部署的主流工具全景图
以上介绍的工具涵盖了从开发、测试到部署的完整工作流程,每类工具中都有多个选项,可以根据具体需求和个人偏好选择合适的工具。
Ai学习的老章
2024/11/19
1790
人生苦短、程序员必备神器!从开发到部署的主流工具全景图
推荐阅读
相关推荐
三种方法!教会你用DeepSeek绘制各种图表,真的太好用了(建议收藏)
更多 >
LV.0
这个人很懒,什么都没有留下~
目录
  • React 19 更新内容
    • Actions
    • 全新 Hook:useActionState
    • React DOM: <form> Actions
    • React DOM 全新 Hook:useFormStatus
    • 全新 Hook:useOptimistic
    • 全新 API:use
    • 新的 React DOM 静态 API
    • React Server Components
      • 服务器组件
      • 服务器 Actions
    • 其他更新
      • ref 作为 prop
      • 水合错误的差异信息展示
      • 作为提供者
      • refs 的清理函数
      • useDeferredValue 初始值
      • 支持文档元数据
      • 样式表支持
      • 支持异步脚本
      • 支持预加载资源
      • 与第三方脚本和扩展的兼容性
      • 更好的错误报告
      • 支持自定义元素
  • React 19 更新总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档