阅读视图
pkg.pr.new 快速验证第三方包-最新修复
pkg.pr.new 是什么?
-
pkg.pr.new 是一个为 GitHub 仓库提供**即时预览包(preview packages)**的服务。
-
每当有新的 commit 推送或 Pull Request 创建时,它会自动生成一个可通过 npm 兼容 URL 直接安装的临时包。
- 示例:
npm i https://pkg.pr.new/vite@main
- 示例:
-
支持与 StackBlitz WebContainers 集成,允许用户在完全隔离的浏览器环境中试用这些预览包。
存储管理策略
-
pkg.pr.new 不是永久包注册表,而是临时预览服务。
-
自动清理机制:
- 超过 1 个月未被下载 的包会被删除。
- 超过 6 个月 的包也会被自动移除。
-
这一策略有效控制了存储成本,未来在 Cloudflare 支持下可适当放宽限制。
用 pkg.pr.new 快速验证 Element Plus 的 Tree 内存泄漏修复
背景:一个真实的性能问题
在 Element Plus 的 PR #23055 中,开发者 @rzzf 发现并修复了一个 el-tree 组件在数据更新后可能引发内存泄漏 的问题。
这个问题的表现是:
- 当频繁更新 tree 的 data 时,旧节点引用未被正确释放;
- 导致内存持续增长,尤其在 Chrome 130 等新版本浏览器中更为明显(见 Issue #23059)。
修复本身并不复杂——关键在于确保事件监听器和节点缓存在数据变更时被清理。但作为用户或 Reviewer,我们最关心的是:
这个修复真的有效吗?我能不能在自己的项目里快速试一下?
传统方式 vs pkg.pr.new
过去,要测试一个未发布的 PR,你需要:
- 拉取 PR 分支;
- 本地构建 element-plus;(切对应的node环境,繁琐)
- 链接到你的项目(
npm link或yalc); - 重启开发服务器……
整个过程繁琐且容易出错。
而现在,有了 pkg.pr.new,一切变得极其简单。
一行命令,直接安装 PR 构建包
对于 PR #23055,你可以直接运行:
npm install https://pkg.pr.new/element-plus/element-plus@23055
pnpm add https://pkg.pr.new/element-plus/element-plus@23055
yarn add https://pkg.pr.new/element-plus/element-plus@23055
✅ 这个 URL 会自动指向该 PR 对应的最新 CI 构建产物,完全兼容 npm 安装流程。
等到官方发布了 最新的版本, 可以重新回归到 正常的版本号的 正轨
生态支持
- 已生成 超过 100 万个预览包
结语
PR #23055 不仅修复了一个关键的内存问题,更展示了现代开源项目的高效协作范式:
代码提交 → 自动构建 → 在线预览 → 社区验证 → 合并发布
相关链接
TanStack Router 文件命名约定
基于文件的路由要求你遵循一些简单的文件命名约定,以确保正确生成路由。这些约定所启用的概念在 路由树与嵌套 指南中有详细介绍。
| 特性 (Feature) | 描述 (Description) |
|---|---|
__root.tsx |
根路由文件必须命名为 __root.tsx,并且必须放置在配置的 routesDirectory 的根目录下。 |
. 分隔符 |
路由可以使用 . 字符来表示嵌套路由。例如,blog.post 将生成为 blog 的子路由。 |
$ 标记 |
带有 $ 标记的路由片段是参数化的,并将从 URL 路径名中提取值作为路由 param(参数)。 |
_ 前缀 |
带有 _ 前缀的路由片段被视为无路径布局路由,在将子路由与 URL 路径名匹配时不会使用它。 |
_ 后缀 |
带有 _ 后缀的路由片段将该路由排除在任何父路由的嵌套之外(即非嵌套路由)。 |
- 前缀 |
带有 - 前缀的文件和文件夹将从路由树中排除。它们不会被添加到 routeTree.gen.ts 文件中,可用于在路由文件夹中共存逻辑代码。 |
(folder) 文件夹名模式 |
匹配此模式的文件夹被视为路由组,防止该文件夹包含在路由的 URL 路径中。 |
[x] 转义 |
方括号用于转义文件名中具有路由含义的特殊字符。例如,script[.]js.tsx 变为 /script.js,api[.]v1.tsx 变为 /api.v1。 |
index 标记 |
以 index 标记结尾(在任何文件扩展名之前)的路由片段,当 URL 路径名精确匹配父路由时,将匹配父路由。这可以通过 indexToken 配置选项进行配置,参见 [suspicious link removed]。 |
.route.tsx 文件类型 |
当使用目录组织路由时,route 后缀可用于在目录路径处创建路由文件。例如,blog.post.route.tsx 或 blog/post/route.tsx 可用作 /blog/post 路由的路由文件。这可以通过 routeToken 配置选项进行配置,参见 [suspicious link removed]。 |
💡 记住: 项目的文件命名约定可能会受到所配置的 [suspicious link removed] 的影响。
[!NOTE]
要转义尾随下划线(例如 /posts[_].tsx),需要使用升级后的 非嵌套路由。
动态路径参数 (Dynamic Path Params)
动态路径参数可用于扁平路由和目录路由,以创建可以匹配 URL 路径动态片段的路由。动态路径参数由文件名中的 $ 字符表示:
| 文件名 (Filename) | 路由路径 (Route Path) | 组件输出 (Component Output) |
|---|---|---|
| ... | ... | ... |
ʦ posts.$postId.tsx
|
/posts/$postId |
<Root><Posts><Post> |
我们将在 路径参数 指南中了解更多关于动态路径参数的信息。
无路径路由 (Pathless Routes)
无路径路由用逻辑或组件包裹子路由,而不需要 URL 路径。无路径路由由文件名中的 _ 字符表示:
| 文件名 (Filename) | 路由路径 (Route Path) | 组件输出 (Component Output) |
|---|---|---|
ʦ _app.tsx
|
||
ʦ _app.a.tsx
|
/a | <Root><App><A> |
ʦ _app.b.tsx
|
/b | <Root><App><B> |
要了解更多关于无路径路由的信息,请参阅 路由概念 - 无路径路由 指南。
美FTC批准英伟达50亿美元投资英特尔
TanStack Router 基于文件的路由
TanStack Router 的大部分文档都是基于“基于文件的路由”这一视角编写的,旨在帮助你深入理解如何配置它以及其背后的技术细节。虽然基于文件的路由是配置 TanStack Router 的首选和推荐方式,但如果你愿意,也可以使用 基于代码的路由。
什么是基于文件的路由?
基于文件的路由是一种利用文件系统来配置路由的方式。你不需要通过代码定义路由结构,而是通过一系列代表应用程序路由层级的文件和目录来定义路由。这带来了许多好处:
-
简单性 (Simplicity):对于新手和经验丰富的开发者来说,基于文件的路由都在视觉上更直观且易于理解。
-
组织性 (Organization):路由的组织方式直接镜像了应用程序的 URL 结构。
-
可扩展性 (Scalability):随着应用程序的增长,基于文件的路由使得添加新路由和维护现有路由变得容易。
-
代码分割 (Code-Splitting):基于文件的路由允许 TanStack Router 自动对路由进行代码分割,以获得更好的性能。
-
类型安全 (Type-Safety):基于文件的路由通过自动生成和管理路由的类型链接,极大提升了类型安全的上限,而在基于代码的路由中,这通常是一个繁琐的过程。
-
一致性 (Consistency):基于文件的路由强制执行一致的路由结构,使得维护、更新应用程序以及在不同项目间迁移变得更加容易。
/ 还是 . ?
虽然目录长期以来一直用于表示路由层级,但基于文件的路由引入了一个额外的概念:在文件名中使用 . 字符来表示路由嵌套。这允许你避免为少量深度嵌套的路由创建目录,同时继续为更广泛的路由层级使用目录。让我们看一些例子!
目录路由 (Directory Routes)
目录可用于表示路由层级,这对于将多个路由组织成逻辑组以及减少大量深度嵌套路由的文件名长度非常有用。
请看下面的例子:
| 文件名 (Filename) | 路由路径 (Route Path) | 组件输出 (Component Output) |
|---|---|---|
ʦ __root.tsx
|
<Root> |
|
ʦ index.tsx
|
/ (精确匹配) |
<Root><RootIndex> |
ʦ about.tsx
|
/about |
<Root><About> |
ʦ posts.tsx
|
/posts |
<Root><Posts> |
📂 posts
|
||
┄ ʦ index.tsx
|
/posts (精确匹配) |
<Root><Posts><PostsIndex> |
┄ ʦ $postId.tsx
|
/posts/$postId |
<Root><Posts><Post> |
📂 posts_
|
||
┄ 📂 $postId
|
||
┄ ┄ ʦ edit.tsx
|
/posts/$postId/edit |
<Root><EditPost> |
ʦ settings.tsx
|
/settings |
<Root><Settings> |
📂 settings
|
||
┄ ʦ profile.tsx
|
/settings/profile |
<Root><Settings><Profile> |
┄ ʦ notifications.tsx
|
/settings/notifications |
<Root><Settings><Notifications> |
ʦ _pathlessLayout.tsx
|
<Root><PathlessLayout> |
|
📂 _pathlessLayout
|
||
┄ ʦ route-a.tsx
|
/route-a |
<Root><PathlessLayout><RouteA> |
┄ ʦ route-b.tsx
|
/route-b |
<Root><PathlessLayout><RouteB> |
📂 files
|
||
┄ ʦ $.tsx
|
/files/$ |
<Root><Files> |
📂 account
|
||
┄ ʦ route.tsx
|
/account |
<Root><Account> |
┄ ʦ overview.tsx
|
/account/overview |
<Root><Account><Overview> |
扁平路由 (Flat Routes)
扁平路由赋予你使用 . 来表示路由嵌套层级的能力。
当你有大量独特的深度嵌套路由,并且希望避免为每一个路由都创建目录时,这非常有用:
请看下面的例子:
| 文件名 (Filename) | 路由路径 (Route Path) | 组件输出 (Component Output) |
|---|---|---|
ʦ __root.tsx
|
<Root> |
|
ʦ index.tsx
|
/ (精确匹配) |
<Root><RootIndex> |
ʦ about.tsx
|
/about |
<Root><About> |
ʦ posts.tsx
|
/posts |
<Root><Posts> |
ʦ posts.index.tsx
|
/posts (精确匹配) |
<Root><Posts><PostsIndex> |
ʦ posts.$postId.tsx
|
/posts/$postId |
<Root><Posts><Post> |
ʦ posts_.$postId.edit.tsx
|
/posts/$postId/edit |
<Root><EditPost> |
ʦ settings.tsx
|
/settings |
<Root><Settings> |
ʦ settings.profile.tsx
|
/settings/profile |
<Root><Settings><Profile> |
ʦ settings.notifications.tsx
|
/settings/notifications |
<Root><Settings><Notifications> |
ʦ _pathlessLayout.tsx
|
<Root><PathlessLayout> |
|
ʦ _pathlessLayout.route-a.tsx
|
/route-a |
<Root><PathlessLayout><RouteA> |
ʦ _pathlessLayout.route-b.tsx
|
/route-b |
<Root><PathlessLayout><RouteB> |
ʦ files.$.tsx
|
/files/$ |
<Root><Files> |
ʦ account.tsx
|
/account |
<Root><Account> |
ʦ account.overview.tsx
|
/account/overview |
<Root><Account><Overview> |
混合扁平路由和目录路由
极有可能 100% 的目录结构或 100% 的扁平路由结构都不完全适合你的项目,这就是为什么 TanStack Router 允许你将扁平路由和目录路由混合使用,从而创建一个结合两者优点的路由树。
请看下面的例子:
| 文件名 (Filename) | 路由路径 (Route Path) | 组件输出 (Component Output) |
|---|---|---|
ʦ __root.tsx
|
<Root> |
|
ʦ index.tsx
|
/ (精确匹配) |
<Root><RootIndex> |
ʦ about.tsx
|
/about |
<Root><About> |
ʦ posts.tsx
|
/posts |
<Root><Posts> |
📂 posts
|
||
┄ ʦ index.tsx
|
/posts (精确匹配) |
<Root><Posts><PostsIndex> |
┄ ʦ $postId.tsx
|
/posts/$postId |
<Root><Posts><Post> |
┄ ʦ $postId.edit.tsx
|
/posts/$postId/edit |
<Root><Posts><Post><EditPost> |
ʦ settings.tsx
|
/settings |
<Root><Settings> |
ʦ settings.profile.tsx
|
/settings/profile |
<Root><Settings><Profile> |
ʦ settings.notifications.tsx
|
/settings/notifications |
<Root><Settings><Notifications> |
ʦ account.tsx
|
/account |
<Root><Account> |
ʦ account.overview.tsx
|
/account/overview |
<Root><Account><Overview> |
扁平路由和目录路由可以混合在一起,以便在合理的地方结合两者的优点来创建路由树。
[!TIP]
如果你发现默认的基于文件的路由结构不符合你的需求,你始终可以使用 虚拟文件路由 (Virtual File Routes) 来控制路由的来源,同时仍然享受基于文件路由带来的出色性能优势。
开始使用基于文件的路由
要开始使用基于文件的路由,你需要配置你项目的打包工具(Bundler)以使用 TanStack Router Plugin 或 TanStack Router CLI。
要启用基于文件的路由,你需要在使用 React 的同时使用受支持的打包工具。请查看下面的配置指南,看看你的打包工具是否在列表中。
- Installation with Vite
- Installation with Rspack/Rsbuild
- Installation with Webpack
- Installation with Esbuild
当通过受支持的打包工具使用 TanStack Router 的基于文件的路由时,插件将通过打包工具的开发和构建过程自动生成你的路由配置。这是使用 TanStack Router 路由生成功能最简单的方法。
TanStack Router 路由匹配
路由匹配遵循一致且可预测的模式。本指南将解释路由树是如何进行匹配的。
当 TanStack Router 处理你的路由树时,你的所有路由都会被自动排序,以便优先匹配**最具体(most specific)**的路由。这意味着无论你定义路由树的顺序如何,路由总是会按照以下顺序进行排序:
-
索引路由 (Index Route)
-
静态路由 (Static Routes)(从最具体到最不具体)
-
动态路由 (Dynamic Routes)(从最长到最短)
-
Splat/通配符路由 (Splat/Wildcard Routes)
考虑以下的伪路由树(定义时的顺序):
Root
- blog
- $postId
- /
- new
- /
- *
- about
- about/us
排序后,这个路由树将变为:
Root
- / (根索引路由,优先级最高)
- about/us (最具体的静态路由)
- about (较短的静态路由)
- blog (静态路由)
- / (Blog 的索引路由)
- new (Blog 下的静态路由)
- $postId (Blog 下的动态路由)
- * (Splat/通配符,优先级最低)
这个最终顺序代表了基于特异性(specificity)进行路由匹配的顺序。
使用上述排序后的路由树,让我们来看看几个不同 URL 的匹配过程:
-
/blogRoot ❌ / ❌ about/us ❌ about ⏩ blog ✅ / - new - $postId - * -
/blog/my-postRoot ❌ / ❌ about/us ❌ about ⏩ blog ❌ / ❌ new ✅ $postId - * -
/Root ✅ / - about/us - about - blog - / - new - $postId - * -
/not-a-routeRoot ❌ / ❌ about/us ❌ about ❌ blog - / - new - $postId ✅ *
TanStack Router 路由概念
TanStack Router 支持许多强大的路由概念,使你能够轻松构建复杂且动态的路由系统。
每一个概念都非常实用且强大,我们将在这个章节深入探讨它们。
路由的剖析
除了 根路由(Root Route) 之外,所有其他路由都是使用 createFileRoute 函数配置的,这在基于文件的路由中提供了类型安全:
import { createFileRoute } from '@tanstack/react-router'
export const Route = createFileRoute('/')({
component: PostsComponent,
})
createFileRoute 函数接受一个参数,即作为字符串的文件路由路径。
❓❓❓ “等等,你要我把路由文件的路径传给 createFileRoute?”
是的!但别担心,这个路径是由路由器通过 TanStack Router Bundler Plugin 或 Router CLI 为你自动写入和管理的。 因此,当你创建新路由、移动路由或重命名路由时,路径会自动为你更新。
需要这个路径名的原因完全在于 TanStack Router 神奇的类型安全机制。如果没有这个路径名,TypeScript 根本不知道我们在哪个文件里!(我们希望 TypeScript 对此有内置支持,但目前还没有 🤷♂️)
根路由 (The Root Route)
根路由是整个树中最顶层的路由,并将所有其他路由作为子路由封装起来。
-
它没有路径
-
它总是被匹配
-
它的
component总是被渲染
即使它没有路径,根路由也可以访问与其他路由相同的所有功能,包括:
-
组件 (components)
-
加载器 (loaders)
-
搜索参数验证 (search param validation)
-
等等
要创建一个根路由,请调用 createRootRoute() 函数并将其作为 Route 变量在你的路由文件中导出:
// 标准根路由
import { createRootRoute } from '@tanstack/react-router'
export const Route = createRootRoute()
// 带 Context 的根路由
import { createRootRouteWithContext } from '@tanstack/react-router'
import type { QueryClient } from '@tanstack/react-query'
export interface MyRouterContext {
queryClient: QueryClient
}
export const Route = createRootRouteWithContext<MyRouterContext>()
要了解更多关于 TanStack Router 中的 Context,请参阅 路由上下文 (Router Context) 指南。
基础路由 (Basic Routes)
基础路由匹配特定的路径,例如 /about、/settings、/settings/notifications 都是基础路由,因为它们精确匹配路径。
让我们看一个 /about 路由:
// about.tsx
import { createFileRoute } from '@tanstack/react-router'
export const Route = createFileRoute('/about')({
component: AboutComponent,
})
function AboutComponent() {
return <div>About</div>
}
基础路由简单直接。它们精确匹配路径并渲染提供的组件。
索引路由 (Index Routes)
索引路由专门用于当父路由被精确匹配且没有子路由被匹配的情况。
让我们看一个针对 /posts URL 的索引路由:
// posts.index.tsx
import { createFileRoute } from '@tanstack/react-router'
// 注意末尾的斜杠,它用于定位索引路由
export const Route = createFileRoute('/posts/')({
component: PostsIndexComponent,
})
function PostsIndexComponent() {
return <div>Please select a post!</div>
}
当 URL 精确为 /posts 时,此路由将被匹配。
动态路由片段 (Dynamic Route Segments)
以 $ 开头并跟随一个标签的路由路径片段是动态的,会将 URL 的该部分捕获到 params 对象中,供你的应用程序使用。例如,路径名 /posts/123 将匹配 /posts/$postId 路由,并且 params 对象将是 { postId: '123' }。
这些参数随后可以在你的路由配置和组件中使用!让我们看一个 posts.$postId.tsx 路由:
import { createFileRoute } from '@tanstack/react-router'
export const Route = createFileRoute('/posts/$postId')({
// 在 loader 中使用
loader: ({ params }) => fetchPost(params.postId),
// 或者在组件中使用
component: PostComponent,
})
function PostComponent() {
// 在组件中!
const { postId } = Route.useParams()
return <div>Post ID: {postId}</div>
}
🧠 动态片段在路径的每个片段都能工作。例如,你可以有一个路径为
/posts/$postId/$revisionId的路由,每个$片段都会被捕获到params对象中。
Splat / 捕获所有 (Catch-All) 路由
路径仅为 $ 的路由被称为 “splat” 路由,因为它 总是 捕获从 $ 开始到结束的 URL 路径名的 任何 剩余部分。捕获的路径名随后可在 params 对象中的特殊 _splat 属性下获得。
例如,针对 files/$ 路径的路由就是一个 splat 路由。如果 URL 路径名是 /files/documents/hello-world,则 params 对象将在特殊 _splat 属性下包含 documents/hello-world:
{
'_splat': 'documents/hello-world'
}
⚠️ 在路由器的 v1 版本中,为了向后兼容,splat 路由也可以用
*代替_splat键来表示。这将在 v2 中移除。
🧠 为什么要用
$?多亏了像 Remix 这样的工具,我们知道尽管*是表示通配符的最常见字符,但它们与文件名或 CLI 工具的配合并不好,所以就像他们一样,我们决定使用$代替。
可选路径参数 (Optional Path Parameters)
可选路径参数允许你定义 URL 中可能存在也可能不存在的路由片段。它们使用 {-$paramName} 语法,并提供灵活的路由模式,其中某些参数是可选的。
// posts.{-$category}.tsx - 可选的 category 参数
import { createFileRoute } from '@tanstack/react-router'
export const Route = createFileRoute('/posts/{-$category}')({
component: PostsComponent,
})
function PostsComponent() {
const { category } = Route.useParams()
return <div>{category ? `Posts in ${category}` : 'All Posts'}</div>
}
此路由将同时匹配 /posts(category 为 undefined)和 /posts/tech(category 为 "tech")。
你也可以在单个路由中定义多个可选参数:
// posts.{-$category}.{-$slug}.tsx
export const Route = createFileRoute('/posts/{-$category}/{-$slug}')({
component: PostsComponent,
})
此路由匹配 /posts、/posts/tech 和 /posts/tech/hello-world。
🧠 带有可选参数的路由优先级低于精确匹配,确保像
/posts/featured这样更具体的路由会在/posts/{-$category}之前被匹配。
布局路由 (Layout Routes)
布局路由用于使用额外的组件和逻辑包裹子路由。它们通常用于:
-
用布局组件包裹子路由
-
在显示任何子路由之前强制执行
loader要求 -
验证并向子路由提供搜索参数 (search params)
-
为子路由提供错误组件或挂起 (pending) 元素的回退 (fallbacks)
-
向所有子路由提供共享上下文 (context)
-
等等!
让我们看一个名为 app.tsx 的布局路由示例:
routes/
├── app.tsx
├── app.dashboard.tsx
├── app.settings.tsx
在上面的树中,app.tsx 是一个布局路由,它包裹了两个子路由:app.dashboard.tsx 和 app.settings.tsx。
这种树结构用于用布局组件包裹子路由:
import { Outlet, createFileRoute } from '@tanstack/react-router'
export const Route = createFileRoute('/app')({
component: AppLayoutComponent,
})
function AppLayoutComponent() {
return (
<div>
<h1>App Layout</h1>
<Outlet />
</div>
)
}
下表显示了基于 URL 将渲染哪些组件:
| URL Path | Component |
|---|---|
/app |
<AppLayout> |
/app/dashboard |
<AppLayout><Dashboard> |
/app/settings |
<AppLayout><Settings> |
由于 TanStack Router 支持混合扁平路由和目录路由,你也可以在目录中使用布局路由来表达应用程序的路由:
routes/
├── app/
│ ├── route.tsx
│ ├── dashboard.tsx
│ ├── settings.tsx
在这个嵌套树中,app/route.tsx 文件是布局路由的配置,它包裹了两个子路由:app/dashboard.tsx 和 app/settings.tsx。
布局路由还允许你对动态路由片段强制执行组件和加载器逻辑:
routes/
├── app/users/
│ ├── $userId/
| | ├── route.tsx
| | ├── index.tsx
| | ├── edit.tsx
无路径布局路由 (Pathless Layout Routes)
像 布局路由 一样,无路径布局路由用于使用额外的组件和逻辑包裹子路由。但是,无路径布局路由不需要在 URL 中有匹配的 path,它们用于包裹子路由而无需 URL 路径匹配。
无路径布局路由以前划线 (_) 为前缀,表示它们是“无路径”的。
🧠
_前缀之后的部分用作路由的 ID,这是必需的,因为每个路由必须是唯一可识别的,特别是在使用 TypeScript 时,以避免类型错误并有效地实现自动完成。
让我们看一个名为 _pathlessLayout.tsx 的路由示例:
routes/
├── _pathlessLayout.tsx
├── _pathlessLayout.a.tsx
├── _pathlessLayout.b.tsx
在上面的树中,_pathlessLayout.tsx 是一个无路径布局路由,它包裹了两个子路由:_pathlessLayout.a.tsx 和 _pathlessLayout.b.tsx。
_pathlessLayout.tsx 路由用于用无路径布局组件包裹子路由:
import { Outlet, createFileRoute } from '@tanstack/react-router'
export const Route = createFileRoute('/_pathlessLayout')({
component: PathlessLayoutComponent,
})
function PathlessLayoutComponent() {
return (
<div>
<h1>Pathless layout</h1>
<Outlet />
</div>
)
}
下表显示了基于 URL 将渲染哪个组件:
| URL Path | Component |
|---|---|
/ |
<Index> |
/a |
<PathlessLayout><A> |
/b |
<PathlessLayout><B> |
由于 TanStack Router 支持混合扁平路由和目录路由,你也可以在目录中使用无路径布局路由来表达应用程序的路由:
routes/
├── _pathlessLayout/
│ ├── route.tsx
│ ├── a.tsx
│ ├── b.tsx
但是,与布局路由不同,由于无路径布局路由不基于 URL 路径片段进行匹配,这意味着这些路由不支持将 动态路由片段 作为其路径的一部分,因此无法在 URL 中进行匹配。
这意味着你不能这样做:
routes/
├── _$postId/ ❌
│ ├── ...
相反,你必须这样做:
routes/
├── $postId/
├── _postPathlessLayout/ ✅
│ ├── ...
非嵌套路由 (Non-Nested Routes)
非嵌套路由可以通过在父文件路由片段后加上 _ 后缀来创建,用于将路由从其父级中取消嵌套 (un-nest) 并渲染其自己的组件树。
考虑以下的扁平路由树:
routes/
├── posts.tsx
├── posts.$postId.tsx
├── posts_.$postId.edit.tsx
下表显示了基于 URL 将渲染哪个组件:
| URL Path | Component |
|---|---|
/posts |
<Posts> |
/posts/123 |
<Posts><Post postId="123"> |
/posts/123/edit |
<PostEditor postId="123"> |
-
posts.$postId.tsx路由正常嵌套在posts.tsx路由下,将渲染<Posts><Post>。 -
posts_.$postId.edit.tsx路由与其他路由不共享相同的posts前缀,因此将被视为顶层路由,并将渲染<PostEditor>。
[!NOTE]
虽然在基于文件的路由中使用非嵌套路由已经非常出色,但在某些条件下可能会出现异常行为。
其中许多限制已经在下一主要版本的 TanStack Router 中得到解决并将发布。
要尽早享受这些好处,你可以在路由器插件配置中启用实验性的
nonNestedRoutes标志:export default defineConfig({ plugins: [ tanstackRouter({ // some config, experimental: { nonNestedRoutes: true, }, }), ], })重要提示:这确实会导致在 useParams、useNavigate 等中引用非嵌套路由的方式发生轻微变化。因此,这已作为功能标志发布。
路径中不再预期包含尾随下划线:
以前:
useParams({ from: '/posts_/$postId/edit' })现在:
useParams({ from: '/posts/$postId/edit' })
从路由中排除文件和文件夹
可以通过在文件名后附加 - 前缀来将文件和文件夹从路由生成中排除。这使你能够在路由目录中共存逻辑代码。
考虑以下的路由树:
routes/
├── posts.tsx
├── -posts-table.tsx // 👈🏼 被忽略
├── -components/ // 👈🏼 被忽略
│ ├── header.tsx // 👈🏼 被忽略
│ ├── footer.tsx // 👈🏼 被忽略
│ ├── ...
我们可以从排除的文件中导入内容到我们的 posts 路由中:
import { createFileRoute } from '@tanstack/react-router'
import { PostsTable } from './-posts-table'
import { PostsHeader } from './-components/header'
import { PostsFooter } from './-components/footer'
export const Route = createFileRoute('/posts')({
loader: () => fetchPosts(),
component: PostComponent,
})
function PostComponent() {
const posts = Route.useLoaderData()
return (
<div>
<PostsHeader />
<PostsTable posts={posts} />
<PostsFooter />
</div>
)
}
排除的文件不会被添加到 routeTree.gen.ts 中。
无路径路由组目录 (Pathless Route Group Directories)
无路径路由组目录使用 () 作为一种将路由文件分组的方式,无论其路径如何。它们纯粹是组织性的,不会以任何方式影响路由树或组件树。
routes/
├── index.tsx
├── (app)/
│ ├── dashboard.tsx
│ ├── settings.tsx
│ ├── users.tsx
├── (auth)/
│ ├── login.tsx
│ ├── register.tsx
在上面的示例中,app 和 auth 目录纯粹是组织性的,不会以任何方式影响路由树或组件树。它们用于将相关的路由分组在一起,以便于导航和组织。
下表显示了基于 URL 将渲染哪个组件:
| URL Path | Component |
|---|---|
/ |
<Index> |
/dashboard |
<Dashboard> |
/settings |
<Settings> |
/users |
<Users> |
/login |
<Login> |
/register |
<Register> |
如你所见,app 和 auth 目录纯粹是组织性的,不会以任何方式影响路由树或组件树。
三部门发布《互联网平台价格行为规则》
公募大手笔分红,全年逼近2300亿元
26 元/小时,人人喊贵,广州终于要对天价停车费出手了

有时候经常被朋友问,「你不是做汽车相关内容的嘛,为什么不见你开车上班?」
其实很多时候不是不想开,而是真的停不起。
公司所在的广州塔附近大概是全广州停车收费最高的地区之一,露天停车场白天工作时间段 16 元一小时,月保在千元左右,晚上回到家的小区内稍微低一点,临停 5 元一小时,月保 600 元。
也就是说如果每天开车通勤加上周末偶尔去商场,光停车费一项,每月额外支出就要接近 2000 元,足够在广州再租个一居室。
正因如此,尽管公司有位已提车 1000 天的理想车主,我却始终未能蹭到他的车,十分遗憾。

▲ 广州塔小车收费 16 元/小时
长期以来,广州的停车费一直居高不下。几年前,界面新闻曾做过一项统计,广州重点区域路边停车场的平均成本高达 26 元/小时,这一数据在全国遥遥领先。作为对比,同为一线城市的上海、深圳约为 20 元/小时,北京仅为 10 元/小时,而新一线城市武汉的 4 元/小时甚至排到了全国第十一名。

理论上来讲,深圳本应是停车更难、更贵的城市。
深圳的土地面积仅为广州的三分之一,却承载了更多的汽车。截至 2025 年 8 月,深圳机动车保有量已达 460 万辆,远超广州的 404 万辆。在人均 GDP 和居民收入均高于广州的背景下,深圳的支付能力理应更强,土地资源理应更稀缺。
然而,现实却给出了相反的答案。
在深圳的一类区域(如福田 CBD ),停车场收费大多为第一小时 15 元,此后每小时 5 元。而在广州同类区域,往往起步就是每小时 16 元甚至更高,且阶梯涨价更猛烈。

深圳这种「地更少、人更富、车更多,停车反而更便宜」的现象,恰恰说明了广州的高价并非完全由供需决定,更多是由于定价机制的传导失效与存量管理的粗放。
以广州天河 CBD 珠江新城为例,这里的停车费被车主们戏称为「天价刺客」。临时停车费最高可达 26 元/小时,单日封顶 328 元。而在一些更高端的商业场所,价格直逼 30 元/小时且不设上限。

▲ 广州太古汇停车场,周末 20 元一小时,不设最高限价
小区的月保车位也不便宜。
有网友分享,其在越秀某小区的停车场月租为 1800 元/月,周边小区多数也都在 1500 元往上,而且还要靠抢。

▲2000 元的非固定月租车位
高昂的停车成本,迫使大量市民在出行方式上做出妥协。
大部分的广州家庭往往采用「一辆四轮+一辆两轮」的出行配置。毕竟骑着电鸡出门,不仅可以避开拥堵,还可以避开无法预估的停车费账单。毕竟,任何时间、任何地点,电鸡随便停且免费。

价格高不过只是表象。停车难、停车贵的归根结底,是城市空间资源的极度稀缺与分配不均。
官方数据显示,截至 2025 年 6 月,广州全市停车位约 437.8 万个,小汽车保有量约 404.4 万辆。乍看之下,1.08 的车位比似乎意味着供需基本平衡。
但汽车是流动的,一个高效运转的城市交通网络,要求一辆车不仅要有一个「家」(居住停车位),还需要有「办公室」(工作停车位)和「游乐场」(商业/公共停车位)。
通常认为,理想的城市停车位供需比应达到 1.2 甚至更高,才能应对车辆流动带来的潮汐式需求。
但在广州,停车资源往往是失衡的。越是核心、越是老旧的区域,停车矛盾越是尖锐。
在越秀、荔湾等老城区,以及医院、学校、商圈周边,停车难是常态化的「重灾区」。对于居住在老旧小区的居民来说,每天下班回家就是一场现实版的「抢车位」游戏。由于车位极度匮乏,车辆不得不层层叠叠地停放。
这里衍生出了一种独特的「熟人社会治理模式」,管停车场的大爷,手里往往握着全小区几十把车钥匙。哪辆车要出,哪辆车要进,全凭大爷运筹帷幄,「开完你的,开他的」。
因为车位属于稀缺资源,很多地方甚至出现了「寻租」空间,有的业主甚至需要私下「打点」物业,才能勉强在小区里拥有一个车位。
即便是在硬件条件较好的新建住宅区,矛盾也同样存在。部分住宅停车收费随意定价、强行涨价的现象屡见不鲜,物业方利用信息不对称和管理优势,单方面提高停车费,让业主们苦不堪言。前段时间,某豪宅物业甚至做出了业主不同意涨停车费就不放车辆通行的离奇操作。
高得无法理解,涨得毫无道理,呈现出一种反正就是贵,反正我要涨的神奇局面。

▲ 老小区停车现状
面对各种问题交织的困境,即将于 2026 年 2 月实施的《广州市停车场条例》试图通过一套组合拳来打破僵局。
通读新规,可以清晰地看到立法者试图在「存量挖掘」和「规则重塑」两个维度上寻找突破口。

首先是「存量挖掘」。
广州市人大常委会法工委有关负责人在解读中提到,资源利用效率不高是导致车位紧缺与闲置并存的重要原因。
为此,新条例要求「要求本市国家机关、事业单位的自用停车场与办公场所分开管理的,应当在非工作时间有序向社会开放」。并且这些车位需要置明显标识,并将泊位信息接入全市停车信息管理系统,所得收益上缴财政。
这一举措若能落地,将极大缓解老城区夜间「一位难求」的现状。
其次是支持支持和鼓励社会力量投资建设公共停车场。
对于社会力量投资建设公共停车场的,不仅可以给予适当的资金支持,还可以在在不改变用地性质、不减少停车位的前提下,配建不超过公共停车场建筑面积百分之二十的附属商业设施。
第三,在我们最为关注的定价权博弈方面,新条例引入了「协商议价」机制。如果停车场经营者想制定或提高收费标准,必须与业委会或业主大会协商。
为了保证这一条款不沦为一纸空文,新规设定了高额的违法成本,未依法协商议价的,最高可处 50 万元罚款。
最后,是对路面秩序的「收权」。
针对路内泊位「乱划线」的乱象,新条例明确了区交通运输行政主管部门的唯一管理权,严禁任何单位和个人擅自划设或撤除。对于私自圈地划线的行为,个人最高罚款 5000 元,单位最高罚款 2 万元,并没收违法所得。
这意味着,过去那种随便拿桶油漆就在路边圈地收钱的「混乱时代」,将彻底终结。

即使在 2026 年 2 月之后,广州车主可能还是会为找车位发愁,老城区的巷子依然窄,医院门口的车龙也不会一夜消失。
但至少,规则更清楚了,住宅停车费不能全由物业说了算,得和业主商量;路边划线谁有权、谁违规,也有了明确罚则;机关单位的停车场在晚上能不能用,也不再是「内部事务」。
这些变化未必立刻缓解一位难求的窘境,但至少让市民在面对涨价、占位或混乱管理时,知道该找谁、依据是什么。
在一座常住人口超过 1800 万、机动车保有量已突破 400 万辆的城市里,「停好一辆车」从来不是小事。它牵涉空间规划、公共资源分配、社区治理,甚至日常生活的尊严感。
新规无法凭空变出车位,但若能推动闲置资源流动起来、遏制随意定价、减少管理盲区,就已经是在复杂现实里往前走了一步。
#欢迎关注爱范儿官方微信公众号:爱范儿(微信号:ifanr),更多精彩内容第一时间为您奉上。
情绪消费快速崛起 上市公司加码布局
金饰克价涨到1362元
封关首日,三亚免税销售额1.18亿元
美股三大指数集体收涨,大型科技股普涨
红杉中国收购“小脏鞋”Golden Goose,成控股股东
9点1氪丨字节跳动面向全球员工涨薪;飞天茅台价格暴跌,黄牛半个月亏损超30万元;上海电信回应“罗永浩吐槽网速”
今日热点导览
- 马斯克说燃油车将会逐渐消亡
- 哪吒汽车破产重整新进展
- 中国成为《疯狂动物城2》全球最大票仓
- 机构:预计2026年智能手机平均售价将同比增长6.9%
- 周大福一年涨价三次
- 小米汽车已获L3级道路测试牌照
TOP 3大新闻
字节跳动面向全球员工涨薪:2025年奖金投入提升35%
36氪获悉,12月19日,字节跳动发布面向全球员工的内部邮件,宣布继续加大人才投入,提高薪酬竞争力、提升期权激励力度。具体包括四大措施:增加奖金(含绩效期权)投入,2025全年绩效评估周期相比上个周期提升35%;大幅增加调薪投入,较上个周期提升1.5倍;提高所有职级薪酬总包的下限(起薪)和上限(天花板)。字节跳动还将推行新职级体系,将原有的5级10档体系(1-1至5-2),更新为10级体系(L1-L10),其中将原有的“1-1”“1-2”职级合并为“L1”,并在原有对应职级外新增“L10”。
飞天茅台价格暴跌黄牛损失惨重:半个月亏损超30万元
近日,53度飞天茅台在郑州百荣世贸商城等批发渠道的成交价经历了一轮明显波动。虽然价格在短暂触及1499元官方指导价下方后有所回升,但市场的观望情绪依然浓厚。记者了解到,曾经“买到就是赚到”的硬通货,如今成了部分囤货者手中的“烫手山芋”。有前期高价囤货的商户因价格回调,单批出货亏损超30万元,相当于赔掉一辆豪华汽车。
一家白酒销售门店负责人坦言,从业八年来,第一次见到飞天茅台的批发价真正触及指导价下方。“以前1499元是心理底线,大家觉得跌到这儿肯定有支撑,但这次直接探底了,虽然很快拉了回来,但让大家变得更加谨慎了。”(大河报)
上海电信回应“罗永浩吐槽网速”
据报道,知名博主罗��浩日前在朋友圈吐槽,称自己搬到上海开了电信的独享千兆宽带半年多来,绝大多数时候只有不到一百兆的网速,每次找来客服,不管是官方的还是非官方的,都是管用三五天,然后又回到九十多兆。12月19日晚间,上海电信发布题为“上海电信关心您的上网感知”的文章,表示用户在日常宽带使用中可能遇到室内不同房间WIFI速率不达标的困扰,造成这种情况的原因是多种多样的,比如户型结构、室内面积、墙体屏蔽、信号干扰、设备位置、自购WIFI路由器标准、电脑终端等。遇到这些情况,可以直接拨打10000号,公司将进行免费、专业的网络检测和维修服务。(界面新闻)
图源:网络
大公司/大事件
顺丰主动退出抖音电商退货业务
36氪获悉,知情人士透露,顺丰并未参与2026年抖音电商退货服务,系其主动放弃该业务市场。后续,抖音电商退货履约将逐步由京东、中通、圆通等物流服务商承接。行业分析指出,此次变化主要源于顺丰自身业务与战略调整,业务增长压力下,顺丰正持续收缩退货业务。
2027年前苹果折叠屏iPhone或面临缺货困境
12月19日,据环球网转引9to5mac报道,天风证券分析师郭明錤近期披露了苹果折叠屏iPhone Fold的最新进展:用户大概率要等到2027年才能顺利买到。其表示该产品开发进度滞后,虽预计2026年下半年发布,但2026年底前或面临缺货困境。郭明錤表示,苹果认为,在智能眼镜取代智能手机之前,折叠屏是手机行业的核心演进方向。所以苹果内部将折叠屏iPhone Fold定为明年“必推产品”,但其发布与量产环节或许将不同步,量产和大规模销售将延迟。(界面新闻)
马斯克说燃油车将会逐渐消亡
近日,马斯克在社交媒体上称,驾驶非自动驾驶的燃油车,就像“骑马时使用翻盖手机”一样过时。他认为传统燃油车只会逐渐消亡,最终汽车的竞争力将来源于智能化。分析认为,这一表态与马斯克本人的长期观点一致,他近期重申这一点可能与传统汽车行业战略回调有关。(央视网)
千问App辟谣:全员大会吃豆包图是AI生成的
36氪获悉,12月19日下午,一张疑似“千问全员广场大会”的图片在社交平台流传,引起网友热议。千问App刚刚通过官方账号正式辟谣:图片是AI生成的,是假的。里面的Logo和工牌是错的。
拼多多升级治理架构,赵佳臻出任联席董事长
36氪获悉,12月19日,拼多多集团年度股东大会宣布升级治理架构,实行联席董事长制度。经董事会批准,赵佳臻获任联席董事长,与陈磊共同担任联席董事长兼联席CEO。
字节跳动正推进与多家厂商的AI手机合作
12月19日,据媒体报道,字节跳动正推进与vivo、联想、传音等硬件厂商开展AI手机的合作,为其设备预装AIGC插件,从而获得用户入口,扭转当前AI在执行层面的被动局面。
媒体向字节跳动、vivo、联想、传音等厂商求证,截至发稿,以上厂商对此消息皆无回应。但有联想内部人士对新浪科技透露,联想集团一直与豆包、火山引擎等字节系业务保持紧密合作。目前,联想相关业务也一直在与豆包在智能终端领域的合作保持密切沟通。(每日经济新闻、新浪科技)
哪吒汽车“复活”新进展:已选定经营管理受托方,每月报酬不超过10万元
12月18日,哪吒汽车母公司合众新能源发布关于经营管理受托方公开招募结果的公告。公告提到,共有两家意向机构提交了报名材料。评审委员会从专业资质与相关经验、经营管理方案可行性、资金安排合理性三个方面对两家机构进行了当场评分。根据评审结果,遴选了其中一家意向机构作为经营管理受托方。后续,管理人将依法与受托方签订《经营管理委托协议》,履行监督与协助职责,共同推进委托经营管理工作,确保本案破产重整程序顺利实施。(红星新闻)
用户反馈AirPods Pro 3静电噪音未彻底修复
12月19日,科技媒体MacRumors发布博文,报道称有不少AirPods Pro 3用户反馈,即便升级到最新固件,耳机在开启主动降噪(ANC)模式后,依然会出现类似静电的噪音、爆裂声以及间歇性的高频啸叫。
苹果曾于11月推送固件版本8B25,随后又在12月10日推出固件版本8B30。不过,这两次更新的说明文档仅含糊提及“错误修复和其他改进”,并未明确指出针对上述噪音问题。除了噪音干扰,故障范围还在进一步扩大。部分用户报告称,在使用AirPods Pro 3观看视频时,出现了明显的音频延迟和音画不同步现象。(IT之家)
阿里钉钉启动“D计划”项目,或剑指AI硬件新形态
阿里巴巴旗下智能办公平台钉钉启动一项代号为“D计划”的秘密项目,或涉足AI硬件领域。而“D计划”这一代称近期在钉钉内部及供应链相关人士中流传,被被猜测将推出类似“豆包手机”的产品。对于外界热议的“豆包手机”传闻及“D计划”的具体所指,钉钉官方回应称:“‘豆包手机’听说了,‘D计划’没听说。公司内部确实对部分创新项目的保密等级要求非常高。”(财联社)
中国成为《疯狂动物城2》全球最大票仓,凸显中国电影市场战略价值
迪士尼动画电影《疯狂动物城2》自上映以来在中国市场持续引发观影热潮,票房表现屡创新高。截至12月18日,据猫眼专业版数据,该片在中国内地累计票房已突破36亿元人民币,观影人次达到9106.4万,超越《复仇者联盟4:终局之战》此前保持的8681.2万人次纪录,成为中国影史进口片观影人次榜首。多家海外媒体指出,中国市场已成为该片全球最重要的票房来源地之一,并再次凸显中国电影市场的活力与战略价值。(央视新闻)
三亚新房成交均价3.1万每平方米,海南楼市呈现跑赢全国行情
今年以来,海南楼市摆脱此前平淡态势,呈现跑赢全国行情。海南省统计局数据显示,1—10月,全省新建商品房销售额1279.51亿元,同比增长17.4%;销售面积775.18万平方米,同比增长8.0%;成交均价16506元/平方米,同比上涨8.7%,每平方米较去年提升1323元。而在海南众多城市中,三亚的“顶流”地位依旧无可撼动。
1—10月,三亚经济圈销售额达742.45亿元,同比飙升48.4%,增速领跑全省四大经济圈;三亚市新房销售额同比增长56.4%,成交均价达31467元/平方米,同比上涨超30%。大华集团海南区域一位人士向每经记者透露,因看好项目产品力以及海南发展潜力,有来自山东的客户购买了大华锦绣海岸项目上百套小户型商办产品。(每日经济新闻)
特朗普签署行政命令,重申2028年登月目标
当地时间12月18日,美国白宫发表声明称,特朗普当日签署了一项行政命令,为“美国优先”的太空政策制定了愿景,以确保美国在太空探索、安全和商业领域“引领世界”。该命令要求美国人到2028年重返月球,并在2030年前建立永久月球前哨站的初始设施,指示在月球和轨道上部署核反应堆。该命令通过升级发射基础设施和开发商业途径,以在2030年前取代国际空间站,从而刺激私营部门的创新和投资。(央视新闻)
机构:预计2026年智能手机平均售价将同比增长6.9%
36氪获悉,根据Counterpoint Research最新《全球智能手机出货追踪与预测》,零部件成本上升预期将影响终端需求,2026年全球智能手机出货量可能出现2.1%的下滑。此次2.1%的年减幅度,相当于该机构将2026年出货预测下修2.6个百分点。在成本转嫁与产品组合调整的影响下,该机构预期2026年智能手机平均售价将年增6.9%,较2025年9月发布的前一版预测(3.9%)上修。
周大福一年涨价三次
近日,周大福天猫官方旗舰店在首页不显眼的位置发布了一条提示:受市场因素影响,部分商品即将提价。点击进入后,商品介绍显示,调价窗口是12月19日。周大福今年于3月和10月底进行了两次调价,加上本次,年内累计已涨价三次。最近一周,周大福各大门店已经陆续收到新价签。根据柜姐在社交平台陆续晒出的新旧标签,大部分产品上调的幅度在4%—15%之间。(南方日报)
小米汽车已获L3级道路测试牌照
据报道,《北京市自动驾驶汽车年度评估报告(2024-2025)》(以下简称“报告”)中的信息显示,小米汽车已在北京市获得L3级自动驾驶道路测试牌照,并持续开展了常态化L3级道路测试。《报告》中介绍,截至2025年9月底,小米等23家企业的750辆自动驾驶乘用车累计运行里程超6027万公里。(新浪汽车)
美股三大指数集体收涨:大型科技股普涨,甲骨文涨超6%
当地时间12月19日,美股三大指数集体收涨,道指涨0.38%,本周累计下跌0.67%;纳指涨1.31%,本周累计上涨0.48%;标普500指数涨0.88%,本周累计上涨0.1%。大型科技股普涨,甲骨文涨超6%,英伟达涨近4%,博通涨超3%,谷歌涨超1%。加密矿企、半导体、金属与采矿涨幅居前,美国黄金公司涨超11%,Hut 8涨超14%,世纪铝业涨超7%,美光科技、AMD、Circle涨超6%,超微电脑涨超5%,美洲白银公司涨近4%,戴尔科技、Coinbase涨超2%。多元保险、鞋服、房地产开发跌幅居前,耐克跌超10%,伯克希尔跌超1%。(界面新闻)
南京卫协回应“导航集体失灵”
12月19日,南京卫星协会微信公众号发布关于12月17日南京区域导航信号异常情况的技术性探讨分析称,本次导航失灵的核心原因是GNSS卫星信号(含北斗、GPS)受到临时干扰压制,而非网络信号中断,因此下载��线地图并无实际意义。本次干扰精准针对北斗、GPS民用频段,导致定位信号无法被接收机识别。
此外,本次信号异常仅涉及民用GNSS频段,北斗军用频率完全不受干扰。(第一财经)
贵州证监局依法严肃查处贵州百灵财务造假案
12月19日消息,中国证券监督管理委员会贵州监管局近日对贵州百灵企业集团制药股份有限公司涉嫌定期报告财务数据存在虚假记载作出行政处罚及市场禁入事先告知。
经查,贵州百灵未以权责发生制为基础,按照收入成本费用配比原则确认当期销售费用,导致2019年至2021年期间少计销售费用,累计虚增利润65472.60万元,2023年多计销售费用,虚减利润45941.10万元。对贵州百灵多年财务造假,严重违反证券法律法规行为,贵州证监局依法拟对贵州百灵责令改正,给予警告,处以1000万元罚款;拟对姜伟等10名责任人给予警告,处以罚款合计1560万元,同时拟对姜伟采取10年证券市场禁入措施。(界面新闻)
美司法部开始公布爱泼斯坦案文件
当地时间12月19日,美国司法部开始公布爱泼斯坦案相关的调查文件。司法部在其发布文件链接的网页上添加了一条说明,称已“尽一切合理努力”对受害者的个人信息进行编辑,但警告称,部分信息可能会无意中泄露。
据悉,司法部副部长布兰奇在致国会的一封信件中表示,在对档案进行全面审查过程中,司法部共识别出1200多名受害者及其家属,所有相关姓名和身份信息均已依法删去。
布兰奇当天早些时候表示,19日将公布数十万份文件,但完整披露可能还需要“数周时间”。(央视新闻)
抖音上线长辈防走失模式
12 月 19 日消息,抖音集团官宣,抖音“ 长辈模式 ”下增设“ 长辈防走失模式 ”。
该功能支持 60 岁及以上用户开通,验证个人信息后,用户可绑定一位紧急联系人,设置安全区域中心地址及安全区域范围。当防走失系统识别到用户脱离既定范围,紧急联系人会收到抖音弹窗消息等提醒,如确认家人走失,可在抖音一键发起寻找。( 新浪科技 )
汇源集团:已申请财产保全
国民果汁品牌汇源重组案又起波澜。12月19日晚,汇源集团发布公告,称重整投资人文盛资产违约,并向北京市第三中级人民法院提起诉讼并申请财产保全。业内看来,汇源商标的归属是双方未来争夺的关键。公告显示,汇源集团指称在北京汇源食品饮料有限公司重整案中,重整投资人上海文盛资产管理股份有限公司(下称 文盛资产)及其指定主体诸暨市文盛汇自有资金投资有限公司(下称 诸暨文盛汇)未能按约定投入全部资金,已构成违约。(第一财经)
AI最前沿
微软、谷歌等24家公司加入美国政府的人工智能“创世使命”
二十四家顶尖人工智能公司已同意加入美国联邦政府的“创世使命”,这是特朗普政府为促进人工智能技术在科学发现和能源项目中的应用而发起的一项举措。OpenAI、微软、英伟达、Amazon Web Services和Alphabet子公司谷歌等企业已与政府签署了谅解备忘录、已与能源部或国家实验室有现有项目往来、或表达了加入该计划的意愿。(新浪财经)
OpenAI据悉计划以8300亿美元估值筹资至多1000亿美元
据报道,OpenAI计划筹资至多1000亿美元以支持其增长计划,这轮仍处于早期阶段的融资若按目标全额筹集,公司估值或将高达8300亿美元。OpenAI计划最早于第一季度末完成此轮融资,但交易条款仍有可能发生变化,且目前尚不清楚是否有足够的投资者需求来达成这一目标。(界面新闻)
ChatGPT移动应用用户支出突破30亿美元新里程碑
应用数据分析公司Appfigures的估算数据显示,ChatGPT移动应用的全球用户支出已突破30亿美元,创下全新里程碑。该数据统计的是这款应用自2023年5月上线以来,在苹果iOS和安卓两大系统平台的累计用户支出;值得一提的是,这款应用最初仅登陆了iOS平台。(新浪财经)
CreateAI旗下Animon荣登全球权威视频模型榜单
36氪获悉,12月19日,由CreateAI打造的全球首个专注动漫领域的AI视频生成平台Animon,在评估机构Artificial Analysis发布的“Image to Video Leaderboard”中排名第21位。该榜单共收录40款全球主流视频生成模型。
上市进行时
大族数控
36氪获悉,中国证监会国际合作司发布关于深圳市大族数控科技股份有限公司境外发行上市备案通知书,公司拟发行不超过88,625,200股境外上市普通股并在香港联合交易所上市。
埃斯顿
36氪获悉,埃斯顿公告,公司正推进发行境外上市外资股(H股)并在香港联交所主板挂牌上市工作。2025年12月17日,香港联交所上市委员会举行上市聆讯,审议该申请。12月18日,独家保荐人收到香港联交所信函,指出上市委员会已审阅申请,但该信函不构成正式批准,香港联交所仍有权提进一步意见。本次发行并上市尚需取得相关监管机构和交易所最终批准,存在不确定性。
天数智芯
36氪获悉,上海天数智芯半导体股份有限公司披露聆讯后资料集,已通过香港联合交易所上市聆讯。
溜溜果园
36氪获悉,中国证监会国际合作司发布关于溜溜果园集团股份有限公司境外发行上市及境内未上市股份“全流通”备案通知书,公司拟发行不超过19,362,400股境外上市普通股并在香港联合交易所上市。
岸迈生物
36氪获悉,港交所文件显示,岸迈生物科技有限公司-B向港交所提交上市申请书,联席保荐人为中信证券、招银国际。
大公司财报
耐克:二季度营收124亿美元
12月19日,耐克发布2026财年第二季度财报。财报显示,本季度全球营收达124亿美元,其中大中华区营收14.23亿美元。耐克正在大中华区推进一系列主动调整,通过运动和创新进一步强化品牌差异化,结合深度的本地洞察,在更加整合的市场中持续释放优势,推动线上与线下渠道的协同发展。耐克集团总裁兼首席执行官贺雁峰表示:“中国是全球运动领域最具长期潜力的市场之一,在本财年以及未来,耐克将持续优化在中国市场的运营,为未来奠定坚实基础。”(界面新闻)
黑莓第三财季净利润1370万美元,同比扭亏
当地时间12月18日,黑莓公司公布截至2025年11月30日的2026财年第三季度业绩:公司总营收为1.418亿美元,同比减少180万美元;GAAP净利润为1370万美元,上年同期为净亏损1050万美元,调整后净利润为2680万美元。(界面新闻)
联邦快递第二财季净利润为9.6亿美元
当地时间12月18日,联邦快递(FedEx)公布截至11月30日2026财年第二季度合并业绩:营收为235亿美元,上年同期为220亿美元;净利润为9.6亿美元,上年同期为7.4亿美元。(界面新闻)
投融资
谷歌与英伟达领投“氛围编程”初创公司Lovable,估值达66亿美元
谷歌与英伟达旗下风投部门参与投资瑞典“氛围编程”初创公司Lovable的B轮融资,融资金额3.3亿美元,公司投后估值达66亿美元。此消息印证了美国消费者新闻与商业频道(CNBC)于12月16日披露的相关细节。本轮融资后,Lovable公司2025年累计融资额突破5亿美元,估值较今年7月上一轮融资时增长超两倍。(新浪财经)
银河通用机器人完成超3亿美元新一轮融资
36氪获悉,据银河通用机器人官微消息,银河通用机器人已于近期完成新一轮超3亿美元融资。本轮融资由中国移动链长基金领投,中金资本、中科院基金、苏创投、央视融媒体基金、天奇股份等联合注资,并同步获得来自新加坡、中东的国际投资机构及老股东的加注。
酷产品
Haivivi官宣第三代新品奥特曼AI互动对话器
36氪获悉,12月18日,在上海举办的火山引擎冬季FORCE原动力大会上,Haivivi联合创始人高峰正式官宣了旗下第三代旗舰新品——“光之召唤”奥特曼AI互动对话器,该产品搭载奥特曼角色AI互动对话、无限距离组队对讲、感应式AI主题游戏、语音电话四大核心功能,将于明年1月正式开售。
整理|爆浆豆腐
国内唯一专注量子基础软件产业化团队,中科院技术转化,曾牵头科技部重大专项|36氪首发
作者丨欧雪
编辑丨袁斯来
硬氪获悉,北京中科弧光量子软件技术有限公司(下称“弧光量子”)近日完成数千万元A轮融资。本轮由北京信息产业发展投资基金独家投资。资金将用于扩大团队,加快研发,以应对行业发展带来的软件新需求。重点包括两方面:一是适配分布式芯片等新趋势,与硬件协同设计协议和解决方案;二是加快建设高效量子计算算法库,扩充人才库。
弧光量子成立于2020年,专注于量子软件与量子计算应用,依托于中国科学院软件研究所,开展量子软件的科研及产业化落地。
公司核心团队中,超过80%的成员毕业于清华大学、北京大学、中国科学院等知名高校及科研院所,硕博士学历人员占比高达90%。公司创始人兼董事长应圣钢毕业于清华大学,获博士学位,并曾于悉尼科技大学从事博士后研究,现为中国科学院软件研究所正高级工程师。
自2020年起,中国量子计算发展进入快车道,成功研制出量子计算原型机“九章”。其算力表现卓越,在处理特定问题时速度达到当时全球第一超算“富岳”的一百万亿倍,也远超谷歌2019年发布的53比特量子计算原型机“悬铃木”一百亿倍,标志着我国正式实现“量子优越性”,成为量子计算领域的重要里程碑。
量子软件作为连接实际应用与量子计算机的桥梁,对量子设备的高效运行至关重要。它须契合量子物理底层原理与算法逻辑,专业性强、具有高度特异性,主要包括量子程序编译器、量子测控软件等。
硬氪了解到,弧光量子产品主要分为三大板块:面向底层硬件,为量子芯片研发团队提供EDA工具、测控系统等基础软件;面向量子程序开发人员,提供以量子编译器为核心的量子程序开发生态产品;服务于上层应用,则推出量子云平台,直接赋能终端用户及行业客户,提供标准化产品服务,从量子计算应用探索开始,逐步形成量子应用软件工具。目前,弧光量子从已有业务场景(金融、医药、能源、材料等)的深入开发到更多业务(航天、物流、气象等)的探索。
作为国内专注量子基础软件产业化团队,团队在量子编译器的程序理论研究和工程化开发方面处于世界前列,部分成果达到世界领先水平。
依托多年技术的积累,团队自主研发了国内首个量子程序设计与验证平台“isQ”,集设计、编译、验证与模拟于一体。其中国际首创的定理证明器,大幅提升了量子程序的验证能力,为国产量子软硬件协同发展奠定了重要基础。
(图源/企业)
据了解,弧光量子是目前国内唯一覆盖多条芯片路线、贯穿产业全链条的量子计算软件企业,产品已部署于国盾量子(超导)、华翊量子(离子阱)等主流量子计算系统;各类客户包含中电信量子、中移动量子研究院、中国石化、国药生物等大型企业。此外,应圣钢还牵头承担了国家重大任务中的相关课题,负责量子软件开发工具链。
在市场表现方面,公司自成立以来,量子软件业务保持高速增长,目前处于盈亏平衡状态,研发投入占营收约80%,显示出强劲的技术驱动属性。
应圣钢表示,从行业趋势看,随着量子芯片规模持续扩大,传统编译优化模块难以满足复杂算法的处理需求,亟需引入高性能计算与人工智能方法以提升效率与实用性。另一方面,分布式量子计算正成为突破单芯片限制的重要路径,IBM等机构已在该领域积极布局。
“在当前背景下,量子软件需求显著增长,生态日趋完善,产品会走向多样与细分。”应圣钢认为,未来几年市场将迎来规模化爆发,量子技术有望实现阶跃式发展。面对这一机遇,公司会重点加大研发与人才储备,以应对日益迫切的技术与市场挑战——这也是弧光量子持续发展的核心战略。
投资人观点:
信产基金表示:“量子计算是新质生产力的重要引擎,正掀起新一轮科技革命浪潮,我们坚定看好这一颠覆性技术。弧光量子由中科院软件所优秀量子软件团队发起创立,拥有领先的量子软件理论研究与技术开发能力,自主设计及开发各类量子计算软件,已为国内各路线主流量子计算机提供软件支持。信产基金期待与弧光量子共同推动量子计算产业发展,为北京市量子计算产业提供软件支撑,助力北京打造国际科技创新高地。”
早报|曝字节推进AI手机合作:vivo员工证实/拼多多架构升级,目标「三年再造一个拼多多」/小米汽车获北京L3路测牌照


曝字节跳动推进 AI 手机合作:vivo 员工证实,联想密切沟通

小米汽车获北京 L3 自动驾驶测试牌照,已开展常态化路测

新华社揭晓 2025 年度字词,「韧」与「深度求索(DeepSeek)」当选

字节跳动涨薪:奖金投入增 35%,调薪加码 1.5 倍

拼多多实行联席董事长制度:锚定中国供应链,目标「3 年再造一个拼多多」

《科学》杂志评选 2025 年度突破:可再生能源登顶,中国引领全球转型

飞书在广州峰会发布「粤企一齐飞」计划,物理 AI 企业加速组织升级

OPPO x 小红书发布 2026 影像趋势

XR 专利「第一案」宣判:XREAL 专利诉讼一审胜诉,VITURE Pro 欧盟九国禁售

追觅手机 E1 通过欧盟认证:1.08 亿主摄、还有 3.5 mm 耳机孔

男子一年退 12 部手机起诉被驳回,法院:违背诚信原则

LinkedIn CEO:AI 时代「五年职业规划」已过时,短期学习更有效
周末也值得一看的新闻
曝字节跳动推进 AI 手机合作:vivo 员工证实,联想密切沟通

据界面新闻报道,字节跳动正推进与 vivo、联想、传音等硬件厂商的 AI 手机合作,在设备中预装 AIGC 插件以获取用户入口、改善其在执行层面的被动局面。多位 vivo 员工证实双方已确认合作、正在讨论具体细节。
联想内部人士称,联想集团与「豆包」、火山引擎等字节系业务一直保持紧密合作,目前在智能终端领域与「豆包」的合作也保持密切沟通。另据 21 世纪经济报道,联想与字节系在相关业务上确有密切往来。
知情人士透露,字节跳动此举并非单纯追求业务增长,而在于构建新的流量变现路径,让手机厂商参与流量分发与会员订阅等收益。
讨论中的模式包括不收取定制化开发费或 Token 销售分成,并给予手机厂商二次流量的分成收益,方案仍处早期。
该项目拟先对 2000 元以上中端机型进行「投量」,与手机厂商发布新机,随后通过 OTA 覆盖更多机型;规模达到 1.5–2 亿后,再与其他互联网厂商竞争。
消息人士称,字节跳动在海外渠道具优势,AI 手机投放大概率也会优先布局海外;内部对该项目高度重视,系统与标注部门各自超过 500 人。此前,字节跳动曾就相关合作与 OPPO 沟通,但遭拒绝。
「豆包手机助手」于 12 月 1 日正式推出技术预览版,并与中兴通讯联合推出 nubia M153 工程样机。该产品支持在用户指令下跨应用调用服务,如点外卖、订机票、比价购物、回复微信消息及操作小程序游戏等。
问世不久后,微信、淘宝、大众点评、拼多多等 App 相继禁止在「豆包手机」上使用,引发对 AI 终端商业生态走向的讨论。
同期,IDC 数据显示,联想旗下摩托罗拉在 2025 年第三季度出货量为 1600 万台、全球份额 4.9%,位列全球智能手机市场第八。
字节跳动先前回应称,「豆包」正在与多家手机厂商洽谈助手合作,且没有自行开发手机的计划;官方披露的手机合作方仅有中兴手机。值得注意的是,魅族科技曾在微博发文表达合作意向,期待「进一步探索更好用的 AI 手机」。
小米汽车获北京 L3 自动驾驶测试牌照,已开展常态化路测

据北京日报昨日报道,小米汽车已在北京市获得 L3 级自动驾驶道路测试牌照,并已在指定路段开展常态化 L3 级道路测试。
这一牌照主要面向北京市智能网联汽车高快速路测试路段,允许符合条件的车型在有条件自动驾驶模式下上路测试,探索更安全、更智能的个人出行服务形态。
此次测试牌照限定在「北京市智能网联汽车测试高快速路」范围内。根据不同企业的申请区域,北京目前在亦庄、顺义、通州等片区的高速及城市快速路(设计时速 ≥ 60 km/h)提供道路测试支持。
这类道路车速较高、匝道数量多、货车比例大,相比城市主干道更考验车辆的环境感知距离、纵向控制能力以及冗余安全策略,对自动驾驶系统整体稳定性提出了更高要求。
小米方面表示,已在相关路段持续开展常态化 L3 级道路测试,车辆以接近日常运营的方式排班行驶,通过长期路测积累真实路况数据。
持续常态化测试也意味着测试车队、后台监控以及数据回灌体系已经打通,可以在实际道路环境中对自动驾驶算法进行迭代验证和优化,为后续规模化应用奠定基础。
报道指出,L3 级自动驾驶道路测试牌照属于行政许可,并非所有车企都能获得。该牌照由北京市经信、交管、交通等相关主管部门联合核发,仅面向已完成封闭场地测试、网络安全评估、数据合规审查等一系列前置审查环节的车型。
小米此次获批,意味着其提交的 L3 系统方案(包括软硬件冗余、远程监管、数据记录等环节)已经通过北京市准入门槛,具备在公开道路上进行自动驾驶测试的资质。
新华社揭晓 2025 年度字词,「韧」与「深度求索(DeepSeek)」当选

昨天,新华社揭晓「汉语盘点 2025」活动「年度字词」:年度国内字为「韧」、「深度求索(DeepSeek)」入选媒体十大热词和十大网络流行语,成为年度国内词。
该活动由国家语言资源监测与研究中心、商务印书馆、新华网联合主办,体现网民推荐、语料库大数据提取与专家评议的综合结果。
新华社指出,「韧」强调在政治、经济与技术不确定性交织的时代,以坚韧不拔、抗压应变与回弹性为核心要义;
而「深度求索(DeepSeek)」作为国产标志性大语言模型的代表,被视为中国在 AI 领域技术主权与自主生产力的重要标识,折射本土企业在人工智能上的崛起。
今年是该活动举办第 20 年,主办方称将继续以汉语为媒,推动文化传承与文明互鉴。
据介绍,本次「汉语盘点 2025」同步发布年度中国媒体十大热词、年度十大网络流行语与年度十大新词语,勾勒出以新闻价值、社会生活创新与年轻群体网络文化为维度的年度语言「全景图」。
其中,「苏超」「票根经济」兼列媒体十大热词与十大新词语,体现时代焦点与创新发展的交汇。
字节跳动涨薪:奖金投入增 35%,调薪加码 1.5 倍

据澎湃新闻、界面新闻报道,字节跳动向全球员工发出内部邮件,宣布在 2025 年继续加大人才与激励投入:全年绩效奖金(含期权)总投入较上个周期提升 35%,调薪投入提升 1.5 倍,并统一提高各职级薪酬总包的下限与上限,以在全球各市场保持「领先于头部水平」。
公司称,此举旨在强化吸引与保留高绩效人才,直面全球人才竞争。
字节跳动明确细化了绩效激励区间的上限与下限:
- 全年绩效获评「M」的激励月数上限增加 1.5 个月;
- 「M+」下限增加 1.5 个月、上限增加 2.5 个月;
- 「E」下限增加 3.5 个月、上限增加 3 个月。
半年激励方面,「E」及以上员工的激励计算基数由月薪调整为月总包(含月期权),对应激励力度同步提升。
在薪酬结构上,公司将职级体系由原「5 级 10 档(1-1 至 5-2)」调整为「10 级体系(L1–L10)」,其中合并原「1-1/1-2」为「L1」,并新增「L10」。
在新体系下,即使不晋级,员工也能获得较过去更大的涨薪空间,晋级带来的涨薪幅度亦扩大。与此同时,本周期调薪投入提升至上周期的 1.5 倍,并同步抬升各职级薪酬总包区间的上下限,以兼顾在职激励与招聘竞争力。
今年 6 月,字节跳动发布「6 条人才观」,强调在招聘、用人、培养、激励与回报各环节保持「高人才密度」,并在 2024 年初迭代绩效与激励政策,加大对高绩效的识别与区分度。
公司长期进行每年两轮期权回购(一般在 4 月与 10 月),期权价格自 2019 年以来累计上调超 400%。今年 10 月在职员工回购价为 200.41 美元/股、离职员工为 180.37 美元/股(分别约合人民币 1424.01 元/股、1281.62 元/股)。
同月,公司还针对中国内地因组织调整被动离职的正式员工上线保障方案:在经济补偿之外,向符合条件者提供最长 6 个月、最高 1.2 万元/月的过渡性补贴,总额最高可达 7.2 万元。
关于组织稳定性,坊间曾有「字节员工平均在职时间 7 个月」的说法。对此,字节跳动在 7 月底的内部交流会上披露在职员工工龄中位数为 2.9 年,这是公司首次内部披露此项数据,以澄清相关不实传闻并强化对外的人才稳定预期。
拼多多实行联席董事长制度:锚定中国供应链,目标「3 年再造一个拼多多」

据凤凰网科技报道,拼多多集团在昨天的年度股东大会上宣布升级治理架构,实行联席董事长制度,赵佳臻获任联席董事长,与陈磊共同担任联席董事长兼联席 CEO。同时,公司任命王密为集团工程高级副总裁、李炯为集团财务总监。
赵佳臻表示,联席治理有利于集团进入「下一个阶段的升级再造」,并围绕「聚焦、重投供应链升级,高质量发展」的整体战略推进落地。
会上陈磊透露,Temu 已在不同国家形成一定市场规模,「3 年走完了拼多多国内电商 10 年的路」。
赵佳臻称,今年是拼多多创业第十年,业务、技术与服务持续积累,业务已触达全球大部分国家;公司下一阶段的核心将更聚焦于中国供应链。
他强调,Temu 的快速成长源于中国供应链产业红利,为国内供应链发展与拼多多、Temu 的再造带来契机,集团将集中资源推动供应链运营模式的整体升级,向高质量与品牌化方向迈进,目标是在「下一个 3 年再造一个拼多多」。
陈磊同时指出,伴随规模扩大与各地监管环境快速变化,合规是底线,电商平台需「符合社会需要、回归初心、固守本分、为社会做贡献」。
赵佳臻(花名「冬枣」)为拼多多创始团队成员,早期负责农产品运营与供应链搭建;2018 年起任高级副总裁,推动「多多买菜」样板城市落地,在社区团购内部竞争中排名第一,并拓展河南、江西、湖南等多省业务。
2022 年下半年带队推动供应链体系升级,同时参与海外电商布局,负责 Temu 美国市场招商,助力海外业务起步;2023 年 4 月获任执行董事与联席 CEO,分管供应链管理与中国业务运营。
陈磊 2015 年与黄峥等人共同创立拼多多,历任 CTO、CEO,并于 2021 年接任董事长,推动公司由社交裂变向科技驱动转型。此次陈磊与赵佳臻共同担任联席董事长兼联席 CEO,构建联席治理机制。
《科学》杂志评选 2025 年度突破:可再生能源登顶,中国引领全球转型

美国《科学》杂志于当地时间 18 日评选出「2025 年度十大科学突破」,其中「全球可再生能源增长势不可当」位列年度头号突破。
《科学》刊文称,2025 年可再生能源在多个领域超过传统能源,且这一转型由中国引领。
该刊文指出,今年全球可再生能源发电量首次超过煤炭;太阳能与风能的增长速度足以覆盖今年上半年全球新增用电需求。
《科学》进一步强调,中国强大的工业体系推动了此次能源版图重塑:全球约 80% 的太阳能电池、70% 的风力涡轮机及 70% 的锂电池由中国生产,且在成本上具备优势。
中国绿色技术出口正在改变欧洲及全球南方国家的能源结构,屋顶光伏在非洲与南亚加速普及,成为低成本、可立即改善用能体验的选择。
在减排层面,今年中国的可再生能源发展使本国温室气体增速几近停滞,并使全球碳排峰值更接近可及,但《科学》亦提示,要实现实质性减排,仍需将今年跨越的门槛视为起点。
除能源转型外,《科学》列出的其他九项年度突破涵盖生命健康与基础科学等领域,包括:
- 为超罕见病带来希望的定制基因编辑;
- 两种在大型临床试验中证实有效的淋病新药;
- 关于神经细胞通过传递线粒体助力癌细胞「超级充电」的发现;
- 异种器官移植的历史性进展;
- 智利山顶建成、被称为天空「全视之眼」的新型望远镜;
- 丹尼索瓦人研究新成果;
- 用于科学研究的大语言模型表现;
- 计算助力粒子物理的新进展;
- 耐热水稻研究(其中丹尼索瓦人与耐热水稻由中国团队主导)。
飞书在广州峰会发布「粤企一齐飞」计划,物理 AI 企业加速组织升级

日前,2025 飞书先进生产力峰会 · 广州站在小鹏汽车广州总部举行,主题为「AI 时代的先进组织力」,聚焦大湾区物理 AI 产业的组织升级。
本次峰会吸引数百位企业高层、政府代表与行业专家参与,包括小鹏汽车、小马智行、优必选、欣旺达动力、乐聚机器人等企业。
飞书制造行业总经理张棣表示,飞书希望通过「软件定义组织」的方式,让组织 AI 能够匹配物理 AI 的发展速度。
峰会现场,多家物理 AI 企业分享了其在飞书上的实践经验。小鹏汽车展示了其企业级 Agent「IRON」的应用成果。
小鹏汽车副总经理谭蔚华表示,IRON 上线后,智能问数功能每年可节省 100 万元成本、整体相当于每月新增 128 名 AI 员工投入工作。
峰会最后发布了「粤企一齐飞」效能加速计划,旨在通过标杆引领与 AI 普惠推动制造业的规模化智能化升级。
OPPO x 小红书发布 2026 影像趋势

昨天,OPPO 联合小红书发布 2026 年度影像趋势报告,双方基于小红书站内创作数据,总结出 9 大移动影像趋势,并以 OPPO Find X9 系列与 OPPO Reno15 系列为代表机型,试图回答「下一代手机影像应该长什么样」。
报告提出的核心命题是「所见即所得」,让每一帧都长出自然本色,强调手机影像不再创造风景,而是尽可能精确复刻用户置身其中的真实瞬间,每一次回看都能重温自然本真的画面。
主要趋势可归纳为以下几类:
- 人像风格演进:胶片人像、生活感人像、氛围感人像需求持续增长,对自然肤色、光影层次与情绪表达的关注显著提升;
- 社交记录方式变化:广角自拍、实况影像与多人群像成为主流,0.5 倍拍照、0.6x 前置大广角等功能使用快速上升;
- 动态内容兴起:live 照片与旅行 vlog 浏览量增长明显,用户更偏好可感知时间流动的记录方式;
- 城市与旅拍融合:城市街头成为新的旅拍场景,人景合一的构图需求推动自然色彩与影调算法升级;
- 色彩一致性需求增强:跨照片、视频与实况的统一色彩呈现成为创作重点。
XR 专利「第一案」宣判:XREAL 专利诉讼一审胜诉,VITURE Pro 欧盟九国禁售

据《科创板日报》、VR 陀螺及亿欧报道,德国慕尼黑第一地区法院已于昨日作出一审裁决,认定 VITURE 公司旗下 VITURE Pro 等产品侵犯闪耀现实(XREAL)持有的欧洲专利(专利号:EP3754409B1)。
法院批准了具强制执行力的临时禁令,要求 VITURE 在德国的销售枢纽 —— 香港经销商 Eden Future HK Limited 立即停止在德国境内提供、投放市场、使用或进口相关产品。
该裁决意味着 VITURE Pro 在德国市场已失去合法销售资格。目前,涉诉产品已在亚马逊德国、法国、意大利、西班牙、波兰、荷兰、爱尔兰、瑞典、比利时等 9 个欧盟站点下架。
值得注意的是,此案是 XR 行业首次因核心技术专利侵权而遭遇实质性「禁售」的案例。
追觅手机 E1 通过欧盟认证:1.08 亿主摄、还有 3.5 mm 耳机孔

科技媒体 MT.today 近日发文称,追觅首款智能手机 Dreame Smartphone E1(型号 W5110)已通过欧盟能效标签认证,用户手册同步流出。
- 采用 6.67 英寸 AMOLED 屏幕,支持屏下指纹识别;
- 后置 1.08 亿像素主摄、200 万像素景深镜头与 200 万像素微距镜头、前置 5000 万像素,说明书还提到一枚「装饰性镜头」;
- 内置 5000 mAh 电池,支持 33 W 有线充电;
- 支持 5G 与 NFC,采用「二选一」卡槽设计,可在双 Nano‑SIM 或「单 SIM 卡 + microSD 存储卡」之间选择;
- 机身支持 IP64 级防尘防水,并保留 3.5 mm 耳机孔。
该机向欧盟申报的维修性等级与抗跌落等级均为 B 级,能效等级为 A 级,标称续航时间为 54 小时 35 分钟。
值得注意的是,追觅在欧盟能效标签认证中将电池描述为「用户可自行更换」,但用户手册明确警示「请勿尝试自行取出电池」。
今年 9 月,追觅官宣首款智能手机 Dreame Space,预热其搭载「天文级」摄像系统,强调在光污染严重的城市环境中也能轻松拍摄星云、银河等深空天体,并表示将推出「人车家宇宙万物」互联生态。
男子一年退 12 部手机起诉被驳回,法院:违背诚信原则

据央视新闻报道,上海市松江区人民法院近日驳回一名消费者针对电商平台的退货诉讼,认定其长期以体验为目的反复购买并在「七天无理由退货」期限内退货,已构成民事权利滥用。
消费记录显示,该消费者在 2023 年 4 月至 2024 年 3 月期间通过 12 笔订单购买了 12 部手机,并均在 7 天内申请退货退款。
涉案手机为其第 4 次购买的同款机型,前三次均已成功退货。此次第 4 次以「太重、太厚」为由提出退货遭拒,继续使用约 1 个月后才起诉要求退款。
法院指出,该消费者作为数码产品爱好者,存在激活使用后以把玩、体验为目的多次网购并适用「七天无理由退货」的情形;其反复购买并退货的做法偏离该制度设立初衷,违反公平诚信原则,损害平台合法权益,不利于营造有序的网络购物环境,因而应予否定性评价,最终判决驳回诉求。
LinkedIn CEO:AI 时代「五年职业规划」已过时,短期学习更有效

据《财富》报道,LinkedIn CEO Ryan Roslansky 表示在职场变化加速的背景下,「五年职业规划」已不再适用。他指出,在技术与劳动力市场持续演变的环境里,以数月为周期设定学习与体验目标更加务实。
他自 2020 年起担任 LinkedIn CEO,长期观察到疫情、关税、通胀与裁员等因素令职业路径愈发非线性,并以播客 The Path 探讨多元化的成长轨迹。
Roslansky 强调,与其预设多年路线,不如聚焦近期要学习什么、获取哪些经验,靠累积的短步进打开更广的职业可能性。
他指出,很多人仍相信教育与职业是线性路径,但平台数据与访谈显示真实情况更复杂,个体需要主动抓住机遇并保持敏锐。
世界经济论坛预计,到 2030 年,约有 39% 的核心技能将被重塑或淘汰;职业与教育机构 TAFE Gippsland 报告称,人们一生平均经历 3–7 次职业转换与 16 次工作变动;招聘机构 Randstad 的最新报告显示,Gen Z 平均每 1.1 年换一次工作,其动因更多是「成长捕猎」而非传统意义的「频繁跳槽」。
尽管仍有专家认为中长期规划有助于系统化推进目标并保留调整空间,但 Roslansky 认为在 AI 驱动的快速变革期,短期学习与体验的迭代更符合现实。
没有人会替你规划道路,尽早建立以能力与经验为核心的自我驱动机制,才能在不确定性中提升职业韧性与机会。
字节 92% 工程师在用,TRAE CN 企业版正式推出

昨天,字节跳动旗下 AI 编程工具「TRAE CN 企业版」正式发布。官方强调其在企业研发中的规模化与深度化应用定位,并提供企业版与企业专属版两种部署模式,以满足不同安全与管理需求。
在核心能力上,TRAE CN 企业版针对超大仓库场景进行了优化:支持 10 万文件、1.5 亿行代码索引,配合超长上下文窗口与企业级 GPU 集群,实现高并发下的毫秒级响应。
通过接入企业知识库与规范、以及基于 MCP(模型上下文协议)的统一工具与数据源调用,使代码生成、审查与测试实现流程级闭环并符合团队「规矩」。
官方同时强调,数据不用于训练、代码全链路加密传输、云端零存储与用后即焚机制,提升企业代码资产的安全性与可控性。
在效能与管理方面,TRAE CN 企业版提供 AI 生成率、AI 代码量等指标看板,支持费用上限与实时用量监控,并可接入 SSO 实现统一鉴权与权限边界管理。
与火山引擎深度打通后,开发者可在 IDE 内一站式调用云端资源与服务,贯穿算力调度、运行环境与发布流水线,实现从「写代码」到「跑起来」的端到端闭环。
据介绍,字节内部已有 92% 的工程师将 TRAE 用于研发协作。在抖音生活服务等高并发业务中,官方案例显示 AI 代码贡献率超过 43%,测试用例生成每周节省 44.56 人/天,无人发布单次节省 25 分钟。
在工程质量方面,TRAE 支持单元测试自动生成与修复,单测生成时间压缩至 18 分钟以内,首编译通过率超过 70%。
相关阅读:字节 92% 工程师都在用的 TRAE,这次瞄准了企业级市场
Google 开源「小钢炮」端侧 Agent 模型

近日,Google 推出两款面向端侧与开发者的轻量模型:多模态、长上下文的编码器—解码器家族新作 T5Gemma 2,以及专为函数调用场景优化的 FunctionGemma。
两者均延续 Gemma 3 系列的技术路线,前者主打结构效率与多模态理解,后者聚焦把自然语言稳定映射为可执行的 API 动作,面向本地、低延迟的智能体应用。
T5Gemma 2 在架构层面采用「词向量共享」与「解码器自注意—交叉注意合并」以缩减参数与复杂度,提供 270M–270M(不含视觉编码器约总计 370M)、1B–1B(约 1.7B)与 4B–4B(约 7B)三种规模的预训练模型。
Google 表示,T5Gemma 2 在多模态与长上下文任务上相较 Gemma 3 显著提升,且预训练基座已开放在 Kaggle、Hugging Face 等平台供后续任务定制;同时提供通过 Vertex AI 推理的路径。
FunctionGemma 基于 Gemma 3 的 270M 模型专门微调为函数调用代理,目标是在本地设备上把用户指令稳定转译为结构化函数调用,再以自然语言总结执行结果。
模型体量与词表设计适配边缘设备,可在英伟达 Jetson Nano 与手机端运行,并可作为离线代理或大型系统的「智能路由」,把复杂请求转交至 Gemma 3 27B 等更强模型。
新智元认为,T5Gemma 2 以结构与能力升级为多模态、长上下文与多语言任务提供更高效的编码器—解码器选项,适合研究与下游应用的预训练基座;
FunctionGemma 则面向明确 API 面与本地优先的场景,通过微调获得确定性更强的函数调用可靠性,支撑「离线‑即时‑隐私」的端侧代理。二者共同指向开发与部署从云端「巨模型」向边缘「专精小模型」的落地路径。
- T5Gemma 2:
Hugging Face: https://huggingface.co/collections/google/t5gemma-2
Colab: https://colab.research.google.com/github/google-gemini/gemma-cookbook/blob/main/Research/[T5Gemma_2]Example.ipynb
- FunctionGemma:
Hugging Face: https://huggingface.co/google/functiongemma-270m-it
中国气象局推出气象 AI 科学模型「风源」
据央视新闻报道,昨天,中国气象局在河北雄安新区发布气象人工智能科学模型「风源」,定位为开源开放科创平台底座,旨在提升 AI 气象预报模型能力与相关科研水平。
「风源」标志着我国气象部门拥有自主知识产权的端到端科学模型底座,在关键环节实现技术自主可控,并具备持续迭代的工程基础。「风源 V1.0」包含数据同化与预报两大模块,可基于观测数据直接开展全球气象预报。
相比以往依赖数值预报模式分析数据的 AI 预报方法,「风源」可直接读取来自卫星、雷达、气象站等实时观测数据,独立分析后给出全球预报,预报效果处于国内外相关领域第一梯队。
未来规划方面,「风源」将重点提升对极端天气、尤其是短时临近天气的捕捉能力、围绕低空经济、能源保供、交通物流、健康气象等场景开发垂类 AI 模型,服务经济社会发展,同时拓展国际应用空间,推动成果在共建「一带一路」国家落地,并通过气象科教融合创新联盟加强重点团队协作。
中国气象局此前推出的气象 AI 模型也在今年完成升级:
- 全球短中期预报系统「风清」已实现业务应用并向全国推广,升级至「风清 v1.5」后预报更准、更远,服务更专业、更广泛;
- 强对流临灾预警降水模型「风雷 v1.1」显著提升极端暴雨预警能力,结果更直观、实用;
- 全球次季节—季节预测系统「风顺 v1.5」在区域刻画、与农业/新能源相关要素扩展以及 3 至 5 周长期预报可靠性方面均有增强,整体性能达国际先进水平并已稳定运行一年多。
雀巢评估出售蓝瓶咖啡实体业务,瑞幸被传参与竞购

据界面新闻报道,雀巢集团或考虑出售蓝瓶咖啡(Blue Bottle Coffee)的实体咖啡馆业务,潜在买家名单出现瑞幸咖啡及其支持者大钲资本(Centurium Capital)。
2017 年,雀巢以约 5 亿美元收购蓝瓶约 68% 股权;蓝瓶于 2022 年进入中国内地,目前在上海、深圳、杭州共开设 15 家门店,全球截至 2025 年 8 月在 6 个国家和地区拥有 140 家门店。
市场消息称,雀巢可能保留蓝瓶品牌的知识产权以继续销售产品,仅出售实体咖啡馆业务,此举被视为新任 CEO 菲利普・纳夫拉蒂尔推进业务精简、退出实体零售门店运营的战略评估的一部分。
除激进扩张的中国咖啡品牌外,潜在买家还包括 %Arabica 及其背后资本( PAG、General Atlantic 等),以及传统私募股权基金(如 KKR、凯雷)。
犯罪电影《96 分钟:列车爆炸案》定档 1 月 10 日

犯罪电影《96 分钟:列车爆炸案》昨日官宣将于 1 月 10 日内地上映,并同步发布「极限存活」版定档预告与「正义决策」版海报。
影片设定为双列车捆绑爆炸:两辆自台北开往高雄、行程 96 分钟的列车被安装特殊炸弹,任一列车停下,另一列即爆炸,数百名乘客被迫在限时内直面生死抉择。
故事围绕前拆弹专家宋康任(林柏宏 饰)与警员未婚妻黄欣(宋芸桦 饰)意外登上载有特殊炸弹的列车,展开 96 分钟极限拆弹与人性拷问。
《情圣 3》定档 12 月 27 日

电影《情圣 3》昨天发布新海报,确认将于 12 月 20 日起全国点映、12 月 27 日全国上映。影片延续系列 IP 并以「婚姻闹剧」为核心叙事,主创称将以反差关系与群像喜剧推进观感与话题度。
海报以巨型沙质「LOVE IS HARD」构图呈现人物关系与戏剧张力,围绕「夫妻互坑」的信任危机与「爱情三十六计」的试探磨合展开,强调群像「全员喜剧人」的互动与节奏,系列符号与情怀元素被保留并强化。
是周末啊!
One Fun Thing|阿里千问辟谣「干死豆包」:假的,图片系 AI 生成

昨天,网络流传一张所谓「阿里千问全员会」现场图片,称有人在广场上手举豆包并高喊「干死豆包」。阿里相关人士向财联社记者辟谣称该图为「假的」,并否认所谓全员大会及现场举豆包等情节。
据 21 世纪经济报道,阿里方面进一步指出该图中的千问 logo 均生成错误;多位网友也质疑该图疑似由生成式 AI 合成,场景更像线下晨会,与互联网研发或 AI 业务场景不符,从视觉要素到水印处理均存在明显破绽。
昨天下午,阿里千问在官方微信公众号发文《听说我被 AI 整了》正式回应,明确表示所谓「广场大会」纯属虚构,相关图片完全由 AI 生成,工牌与 logo 均为错误合成。

官方在文中以轻松语气调侃称「大家都是干 AI 的,相煎何太急」,并借机展示千问的 AI 生图功能,鼓励用户通过模板与指令生成趣味图片,甚至可以模拟「厨王争霸赛」「穿越到东汉」或「圣诞老人」等场景。
周末看什么|《阿凡达 3:火与烬》

《阿凡达3》作为詹姆斯 · 卡梅隆执导的《阿凡达》系列第三部作品,已于昨天上线全国院线。剧情延续前作余波,杰克 · 萨利与奈蒂莉一家在失去长子奈特言后陷入悲痛。
故事核心冲突来自新登场的「灰烬之民」部族,他们以掠夺和暴力为生,由女祭司瓦琅领导,成为推动剧情的关键反派势力。影片同时揭示了潘多拉新的族群「风之商人」,以游牧方式在部落间穿梭,形成与灰烬族截然不同的文明对照。
技术层面,卡梅隆团队继续突破:火山喷发、烟雾与微表情捕捉的精度显著提升,特效算法实现了火焰、灰烬与静电的复杂交互,演员面部捕捉精度提升至 6 万个微三角面片,每秒 1200 帧,使纳威人的细微表情更具真实感。
评价方面,影片在烂番茄获得 69% 的正面评价,在 Metacritic 上收获 61 分,属「普遍好评」区间。
豆瓣平台上,截至发稿有超过 2.3 万人打出 7.6 的平均分,其中 24.7% 打出五星,39.9% 打出四星,显示观众对视觉效果普遍认可,但对剧情评价分化明显。
相关阅读:《阿凡达 3》电影院选厅指南:别再无脑选 IMAX 了(附影院名单)
买书不读指南|《电影院精神》

《电影院精神》由电影学者王小鲁撰写,聚焦流媒体席卷与算法主导的当下,提出「电影完熟时代」「电影院精神」等概念,试图以电影院空间观照现实生活,通过行业疲软的脉象折射现代人的普遍困境与公共性再建的想象。
书中判断电影市场已趋饱和,并指出「最好的人文主义电影都已经拍出来了」,将技术对电影本体的冲击置于学院批评与符号游戏的坐标中,强调疫情后行业的迟暮心境与身体在场的召唤,呈现一部面向迷影群体的「心灵史」取向。
游戏推荐|《羊蹄山之魂》夺 PS Blog 2025 九项大奖

昨天,索尼 PlayStation 公布 PS Blog 2025 年度游戏大奖结果,共设 19 个类别,所有奖项完全由玩家选票产生,累计近 150 万张玩家投票。
其中,Sucker Punch Productions 的 PS5 独占新作《羊蹄山之魂》夺得 9 项大奖,成为本届最大赢家。
从具体奖项分布看,《羊蹄山之魂》拿下「最佳新角色」「最佳画面表现」「最佳美术指导」「最佳音效设计」「DualSense 手柄最佳应用」「最佳 PS5 游戏」等共 9 个关键类别白金奖。
《羊蹄山之魂》由 Sucker Punch Productions 开发、索尼互动娱乐发行,是《对马岛之魂》的续作,于 2025 年 10 月 2 日登陆 PS5。
游戏背景设定在 1603 年的日本北海道,主角为女性武者「笃」(Atsu),由 Erika Ishii 饰演;作品在美术、音效、DualSense 手柄运用等维度均获大量玩家投票肯定。
上市以来,「羊蹄山之魂」已售出 330 万份,IGN 评价为 10 分满分「大师之作」。
在本次大奖中,其他游戏/工作室的表现也同样亮眼:
- 《光与影:33 号远征队》获「最佳剧情」「最佳配乐」与「最佳独立游戏」白金奖;
- 《原神》拿下「最佳持续运营游戏」白金奖;
- 小岛工作室获「年度最佳工作室」白金奖;
- 《漫威金刚狼》摘得「最受期待」白金奖;
- 《死亡搁浅 2:冥滩之上》在多项技术类目居前。
#欢迎关注爱范儿官方微信公众号:爱范儿(微信号:ifanr),更多精彩内容第一时间为您奉上。
原生js实现高性能列表拖拽排序
效果图 支持电脑和手机移动端,纯基于transform的移动,无任务dom操作
在线体验
完整代码见下面的码上掘金,移动端点击查看详情预览
我是如何实现一个基于 Pointer Events 的可拖拽排序列表的
这篇文章记录了我在实现一个 不依赖任何第三方库 的拖拽排序列表时的完整思考过程与实现细节。与其说是代码讲解,不如说是一份 设计动机 + 踩坑记录 + 实现原理 的总结。该实现主要基于 Pointer Events、getBoundingClientRect 以及 translateY 位移动画,并解决了拖拽排序中常见的几个难点:
- 快速拖动时 pointer 事件丢失
- 元素跨越多个位置时的“漏位”问题
- 不直接操作 DOM 顺序,而是通过位移实现顺滑动画
如果你对 SortableJS、拖拽交互或底层实现原理感兴趣,这篇文章会非常适合你。
一、为什么我要自己实现一个拖拽排序
在一开始,其实我也考虑过直接使用 SortableJS 之类的成熟方案。但在实际需求和学习过程中,我发现几个问题:
- 我想完全掌控拖拽过程,而不是黑盒调用
- 我需要理解 快速拖动、跨多个位置时到底发生了什么
- 我之前实现的简单拖拽 demo,在快速滑动时经常出现 pointermove 丢失、元素顺序错乱 的问题
所以最终我决定:
自己从零实现一个拖拽排序,并把每一个细节都想清楚。
在这个过程中,我踩了不少坑,也逐渐总结出一套比较稳定的实现方式。
二、整体思路概览
这套拖拽排序的核心思想可以总结为一句话:
DOM 顺序保持不变,通过 translateY 模拟位置变化,并在拖拽过程中动态维护一个“逻辑顺序数组”。
具体拆解如下:
-
初始化阶段:
- 记录每个 item 的初始位置信息(bounding rect)
- 建立一个
listChildren数组,用来表示当前“逻辑顺序”
-
拖拽开始(pointerdown) :
- 记录拖拽起点
- 捕获 pointer,避免快速滑动导致事件丢失
-
拖拽中(pointermove) :
- 实时更新被拖拽元素的
translateY - 根据指针位置判断进入了哪个 item 区域
- 批量移动中间元素,制造自动让位效果
- 实时更新被拖拽元素的
-
拖拽结束(pointerup) :
- 将拖拽元素吸附到最终 slot
- 通过 transition 实现回弹动画
三、HTML 与 CSS:为拖拽打基础
1. HTML 结构
<div class="list">
<div class="item">0</div>
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
</div>
-
list:拖拽容器 -
item:可拖拽元素
2. 关键 CSS 点
.list {
touch-action: none;
}
.item {
transition: transform 0.3s ease-out;
user-select: none;
}
重点说明:
-
touch-action: none- 禁止浏览器默认的滚动、缩放等手势
- 否则 pointermove 在移动端会被系统劫持
-
transition: transform- 非拖拽元素产生“自动位移”动画
-
user-select: none- 防止拖拽时选中文本
四、初始化:建立位置信息模型
const listChildren = Array.from(list.children);
const rectInfo = [];
Array.from(list.children).forEach((item, index) => {
item.dataset.index = index;
const rect = item.getBoundingClientRect();
Object.assign(rect, {
id: index,
index,
located: {
x: rect.x,
y: rect.y,
},
});
rectInfo.push(rect);
});
这里做了三件事:
-
记录初始顺序:
-
dataset.index表示逻辑索引
-
-
缓存位置信息:
-
getBoundingClientRect()只在初始化时调用一次 - 避免拖拽过程中频繁触发回流
-
-
rectInfo 是“静态坐标系” :
- 所有位移计算都基于初始 top 值
五、pointerdown:拖拽的起点(第一个大坑)
list.addEventListener("pointerdown", (e) => {
if (e.target.classList.contains("list")) return;
isPointerDown = true;
e.target.setPointerCapture(e.pointerId);
e.target.style.zIndex = 1;
e.target.style.transition = "none";
slotIndex = dragIndex = Number(e.target.dataset.index);
dragPos.startY = e.clientY;
dragPos.startTranslateY = Number(e.target.dataset.translateY || 0);
});
核心点解析
1. setPointerCapture
这是我在实现过程中踩到的第一个大坑,也是这套方案里最关键的一点。
- 指针即使移动到元素外
- 事件依然会派发给当前元素
这在快速拖拽、多点触控场景中非常重要。
2. 禁用 transition
e.target.style.transition = "none";
- 拖拽元素需要 1:1 跟随手指
- 不能有动画延迟
六、pointermove:排序的核心逻辑(也是最复杂的部分)
1. 拖拽元素位移
dragPos.diffY = e.clientY - dragPos.startY + dragPos.y;
e.target.style.transform = `translateY(${dragPos.diffY}px)`;
-
diffY= 当前指针位置 - 起点 + 初始偏移 - 使用 transform 不会触发布局
2. 判断进入哪个 slot
if (
e.clientX > r.left &&
e.clientX < r.left + r.width &&
e.clientY > r.y &&
e.clientY < r.y + r.height
)
这是一个典型的指针命中检测(Hit Test) :
- 不依赖 DOM 顺序
- 只看指针是否进入某个 rect
3. 批量位移:解决“跨多个位置”问题
向下拖动(i > slotIndex)
for (let j = slotIndex + 1; j <= i; j++) {
listChildren[j].dataset.translateY =
rectInfo[j - 1].top - rectInfo[j].top +
Number(listChildren[j].dataset.translateY || 0);
}
- 中间所有元素依次向上让位
- 即使 pointermove 触发频率较低,也不会漏掉中间项
向上拖动同理
这正是很多“简单拖拽 demo”做不到的地方。
4. 逻辑顺序数组的维护
listChildren.splice(j - 1, 0, listChildren[j]);
listChildren.splice(j + 1, 1);
- 不操作 DOM
- 只维护一个 JS 数组
-
dataset.index永远和逻辑顺序保持一致
这也是后续回弹计算的关键。
七、pointerup:吸附与回弹
dragPos.y =
rectInfo[slotIndex].top -
rectInfo[dragIndex].top +
dragPos.startTranslateY;
e.target.style.transition = "transform .3s ease-out";
e.target.style.transform = `translateY(${dragPos.y}px)`;
这里发生了什么?
- 根据 最终 slot 与初始 slot 的 top 差值
- 计算拖拽元素应该落到的位置
- 重新启用 transition,形成回弹动画
整个排序过程在视觉上完成闭环。
八、核心流程示意图:逻辑顺序 vs DOM 顺序
这是我在实现过程中最重要的一个认知转变。
1️⃣ DOM 顺序(始终不变)
DOM:
[item0]
[item1]
[item2]
[item3]
[item4]
在整个拖拽过程中:
- DOM 节点从未被插入 / 删除
- 浏览器布局不会反复重排
2️⃣ 逻辑顺序(JS 数组维护)
拖拽 item1 向下移动:
逻辑数组 listChildren:
[item0] [item2] [item3] [item1] [item4]
-
listChildren才是真正的“当前顺序” -
dataset.index始终和逻辑顺序一致
3️⃣ 视觉位置(translateY)
视觉层:
item1 ─────────▶ translateY(+120px)
item2 ◀───────── translateY(-60px)
item3 ◀───────── translateY(-60px)
DOM 不动,数组变,transform 在动
理解了这一点,后面的所有位移、动画和回弹计算都会非常自然。
九、总结:这套方案解决了什么问题
这份代码的几个亮点:
- ✅ 使用 Pointer Events,统一鼠标 / 触摸
- ✅
setPointerCapture解决快速拖拽问题 - ✅ 不操作 DOM 顺序,动画性能极佳
- ✅ 支持跨多个位置的稳定排序
如果你理解了这套逻辑,再去看 SortableJS 的源码,会发现很多思想是相通的。
十、可以继续优化的方向
- 拖拽结束后真正更新 DOM 顺序
- 支持横向 / Grid 排序
- 增加 placeholder 占位元素
- 增加拖拽阈值、防抖处理