Firebase Realtime Database 官方公开 API 全解析:@firebase/database 模块从读写、查询到事务的完整指南
开发工具后端【免费下载链接】firebase-js-sdkFirebase Javascript SDK项目地址https://gitcode.com/gh_mirrors/fi/firebase-js-sdk点击查看免费下载本文以 firebase-js-sdk 仓库中firebase/database的官方 API 报告common/api-review/database.api.md为骨架结合 packages/database 的源码实现系统梳理 Realtime Database Web SDK 的全部公开导出数据库实例获取、数据读写、实时监听、查询过滤、事务、断线操作与模拟器连接。读完本文你将掌握模块化 Realtime Database API 的每个函数签名、参数约束与底层行为能够在真实项目中正确完成从初始化数据库到复杂查询 事务 离线能力的完整开发。一、这份 API 报告是什么common/api-review/database.api.md是 firebase-js-sdk 通过 API Extractor 自动生成的firebase/database包公开 API 快照它精确记录了该包对外导出的每一个函数、类、接口与类型。凡是带// public标记的声明都是 SDK 稳定公开、可放心使用的 API 表面API surface。在写作本文时仓库中firebase/database的版本为1.1.5见 packages/database/package.json包同时提供 Nodedist/index.node.cjs.js与浏览器dist/index.esm.js构建产物。从源码结构看这些公开 API 的实现集中在 packages/database/src/api 目录其中 api.standalone.ts 导出了不依赖firebase/app的核心 APIapi.ts 再叠加getDatabase等与 FirebaseApp 绑定的入口。数据库服务本身通过 register.ts 中的registerDatabase()以database组件注册进 Firebase 组件容器并允许setMultipleInstances(true)——这意味着同一个 app 可以持有多个数据库实例按 URL 区分。下文将按功能模块逐一拆解这份 API 报告。二、获取数据库实例getDatabase 与 getDatabaseEmulator 的默认连接逻辑2.1 getDatabase(app?, url?)export function getDatabase(app?: FirebaseApp, url?: string): Database;getDatabase返回与指定FirebaseApp关联的 Realtime Database 实例app省略时使用默认 appgetApp()。url用于指定要连接的数据库地址不传则连接该 app 配置的默认实例。从 packages/database/src/api/Database.ts 的实现可以看到两个关键细节它通过_getProvider(app, database).getImmediate({ identifier: url })从组件容器中取实例url正是组件的instanceIdentifier对应 register.ts 中的url参数因此不同的 url 会得到不同的 Database 实例如果实例尚未启动!_instanceStartedSDK 会自动读取getDefaultEmulatorHostnameAndPort(database)一旦检测到默认模拟器环境变量就自动执行connectDatabaseEmulator。2.2 connectDatabaseEmulator连接本地模拟器export function connectDatabaseEmulator( db: Database, host: string, port: number, options?: { mockUserToken?: EmulatorMockTokenOptions | string; } ): void;connectDatabaseEmulator将指定实例指向本地 Realtime Database Emulator常用于本地开发与单元测试。源码 Database.ts 对它有明确的约束必须在实例启动首次访问 ref 或建立监听之前调用。若实例已启动只有 host/port 与 mockUserToken 均与之前完全一致才会静默返回否则抛出connectDatabaseEmulator() cannot initialize or alter the emulator configuration after the database instance has started.options.mockUserToken用于在测试 Security Rules 时伪造用户令牌。传入字符串则直接作为 token传入EmulatorMockTokenOptions对象则由createMockUserToken(options, projectId)生成 token实现见 Database.ts若 host 是 Cloud WorkstationFirebase Studio 环境会额外pingServer(host)以获取 cookie底层通过repoManagerApplyEmulatorSettings把现有Repo的RepoInfo原地替换为模拟器地址并标记isUsingEmulatortrue。标准用法import { initializeApp } from firebase/app; import { getDatabase, connectDatabaseEmulator, ref } from firebase/database; const app initializeApp({ databaseURL: https://demo-default-rtdb.firebaseio.com }); const db getDatabase(app); // 必须在任何读写之前调用 connectDatabaseEmulator(db, localhost, 9000, { mockUserToken: { sub: test-user, aud: demo } }); const dbRef ref(db, users/test-user);2.3 Database 类的形态export class Database { readonly app: FirebaseApp; readonly type database; }Database实例本身暴露app关联的 FirebaseApp与固定的type标记它是_FirebaseService实现见 Database.ts。在组件容器中按database名称注册支持多实例register.ts。2.4 与初始化相关的环境变量源码 Database.ts 定义了FIREBASE_DATABASE_EMULATOR_HOST环境变量。当该变量存在时repoManagerDatabaseFromApp会直接以http://host?nsnamespace构造模拟器 URL 并自动切到模拟器Database.ts这是 Node 端尤其是 firebase-admin 场景免写connectDatabaseEmulator的快捷通道。另外若 app 未配置databaseURL但提供了projectIdSDK 会回退到projectId-default-rtdb.firebaseio.com作为默认地址Database.ts。三、定位数据位置ref、refFromURL 与 child3.1 ref(db, path?)export function ref(db: Database, path?: string): DatabaseReference;ref返回指向数据库某个位置的DatabaseReference。省略path时指向数据库根节点。实现Reference_impl.ts为path ! undefined ? child(db._root, path) : db._root。const rootRef ref(db); // 根节点 const userRef ref(db, users/ada); // 深层路径3.2 refFromURL(db, url)export function refFromURL(db: Database, url: string): DatabaseReference;refFromURL用完整 URL 定位节点。实现Reference_impl.ts会解析 URL 并做两项校验URL 非法则抛Invalid Firebase Database URL当当前数据库非自定义 host 时若 URL 的 host 与当前实例不一致抛Host name does not match the current database。注意URL 中的查询参数orderBy、limitToLast等会被忽略仅取路径部分。const refA refFromURL(db, https://demo-default-rtdb.firebaseio.com/users/ada);3.3 child(parent, path)export function child( parent: DatabaseReference, path: string ): DatabaseReference;child基于父引用拼接相对路径支持ada或ada/name/first实现位于 Reference_impl.ts它根据父路径是否为根执行不同的路径校验validateRootPathString/validatePathString随后pathChild(parent._path, path)生成子引用。const adaRef ref(db, users); const ada child(adaRef, ada); // 等价于 ref(db, users/ada)3.4 DatabaseReference 与 Query 的关系export interface DatabaseReference extends Query { readonly key: string | null; readonly parent: DatabaseReference | null; readonly root: DatabaseReference; }DatabaseReference继承Query额外提供三个只读属性定义见 Reference.tskey路径的最后一段根节点的 key 为nullparent父引用根节点的 parent 为nullroot所在数据库的根引用实现会沿 parent 链向上走到根见 Reference_impl.ts。Query接口Reference.ts则声明了三个方法export interface Query { isEqual(other: Query | null): boolean; readonly ref: DatabaseReference; toJSON(): string; toString(): string; }isEqual(other)判断两个查询是否位于相同位置、使用相同查询参数且来自同一 FirebaseApp 实例底层比较_repo、_path与_queryIdentifierReference_impl.tstoString()返回可直接放入浏览器或refFromURL()的 URL 编码地址追加.json即可在浏览器中下载 JSON 数据toJSON()与toString()等价。四、写入数据set、update、push、remove 与优先级所有写 API 都返回Promisevoid在本地立即生效触发本地事件并与服务器同步完成后 resolve。4.1 set(ref, value)export function set(ref: DatabaseReference, value: unknown): Promisevoid;set覆盖写入指定位置及其所有子节点的数据。实现Reference_impl.ts内部调用repoSetWithPriority(repo, path, value, null, ...)并显式把 priority 置为 null——因此set会清除该位置已存的 priority需要保留优先级时请用setWithPriority。传null等价于remove()。await set(ref(db, users/ada), { name: Ada Lovelace, age: 36, admin: true });4.2 update(ref, values)export function update(ref: DatabaseReference, values: object): Promisevoid;update只更新指定子键不覆盖整棵子树。values的键可以是简单属性也可以是相对路径如name/first。一次update无论修改多少子节点都只在该位置触发一次value事件。传null值表示删除该位置数据。它调用validateFirebaseMergeDataArg校验合并数据格式后执行repoUpdateReference_impl.ts。await update(ref(db, users/ada), { age: 37, address/city: London });4.3 push(parent, value?)export function push( parent: DatabaseReference, value?: unknown ): ThenableReference;push在父节点下生成唯一子键并返回ThenableReference——它既是引用又是 Promise.then/.catch可用。生成的键按时间排序由repoServerTime取服务器时间 nextPushId生成见 Reference_impl.ts因此列表天然按时间序包含 72 位随机熵不可猜测适合做聊天消息等并发追加场景。const newPostRef push(ref(db, posts), { title: Hello, author: ada }); // newPostRef 既是引用newPostRef.key 立即可用也可 await await newPostRef;ThenableReference的类型定义Reference.ts为DatabaseReference与PickPromiseDatabaseReference, then | catch的组合且key、parent为必填非空。4.4 remove(ref)export function remove(ref: DatabaseReference): Promisevoid;删除指定位置及其全部子节点。实现非常简单——return set(ref, null)Reference_impl.ts删除后该位置会触发一次值为null的value事件。4.5 setPriority 与 setWithPriorityexport function setPriority( ref: DatabaseReference, priority: string | number | null ): Promisevoid; export function setWithPriority( ref: DatabaseReference, value: unknown, priority: string | number | null ): Promisevoid;priority优先级是 Realtime Database 的遗留排序机制setPriority仅更新某位置的优先级实现上写入path/.priority见 Reference_impl.tssetWithPriority同时写入数据与优先级。官方建议现代应用优先用orderByChild按普通属性排序而 priority 仅作为兼容手段保留。4.6 serverTimestamp 与 increment服务端原子占位符export function serverTimestamp(): object; export function increment(delta: number): object;这两个函数返回服务端占位符而非真实值实现见 ServerValue.tsserverTimestamp()返回{ .sv: timestamp }写入时由服务器以 Unix 毫秒时间戳替换避免依赖客户端时钟increment(delta)返回{ .sv: { increment: delta } }由服务器对当前值做原子增减避免读-改-写竞态是实现计数器/点赞数的推荐方式。await update(ref(db, counters/votes), { count: increment(1), updatedAt: serverTimestamp() });五、读取数据实时监听、一次性读取与 DataSnapshot5.1 监听事件onValue 与 onChild*API 报告定义了五种事件类型export type EventType | value | child_added | child_changed | child_moved | child_removed;对应的监听函数每个都有三组重载基础回调 / options / cancelCallback options统一返回Unsubscribeexport type Unsubscribe () void;export function onValue( query: Query, callback: (snapshot: DataSnapshot) unknown, cancelCallback?: (error: Error) unknown ): Unsubscribe; // 另有 options 与 cancelCallbackoptions 两个重载 export function onChildAdded( query: Query, callback: (snapshot: DataSnapshot, previousChildName?: string | null) unknown, cancelCallback?: (error: Error) unknown ): Unsubscribe; // onChildChanged / onChildMoved / onChildRemoved 结构相同各事件的语义value位置数据整体变化时触发首次同步 每次变化回调只收到一个DataSnapshot位置无数据时收到val()为null的空快照child_added每个初始子节点触发一次之后每新增一个子节点触发一次第二参数previousChildName为排序意义上的前一个兄弟 key首位为nullchild_changed子节点或其子孙数据变化时触发一次事件可能代表多处变化child_moved子节点的排序发生变化如 priority 被改时触发child_removed子节点被删除时触发回调只收快照。onValue的实现统一委托给内部addEventListenerReference_impl.ts底层通过ValueEventRegistration/ChildEventRegistration注册到 SyncTree 并监听后端事件。5.2 ListenOptions一次性监听export interface ListenOptions { readonly onlyOnce?: boolean; }onValue(query, cb, { onlyOnce: true })会在第一次触发后自动移除监听等价于旧版once()的语义。5.3 取消监听offexport function off( query: Query, eventType?: EventType, callback?: (snapshot: DataSnapshot, previousChildName?: string | null) unknown ): void;off移除监听不带参数移除该 query 的全部监听指定eventType只移除该类事件再传callback则只移除该回调。实现见 Reference_impl.ts最终调用repoRemoveEventCallbackForQuery。5.4 一次性读取get(query)export function get(query: Query): PromiseDataSnapshot;get返回一次最新的数据快照。源码注释明确指出若服务器不可达且本地无缓存Promise 会被 rejectReference_impl.ts因此网络敏感场景下应配合 catch 处理。const snapshot await get(ref(db, users/ada)); if (snapshot.exists()) { console.log(snapshot.val()); }5.5 DataSnapshot不可变的只读快照export class DataSnapshot { child(path: string): DataSnapshot; exists(): boolean; exportVal(): any; forEach(action: (child: IteratedDataSnapshot) boolean | void): boolean; hasChild(path: string): boolean; hasChildren(): boolean; get key(): string | null; get priority(): string | number | null; readonly ref: DatabaseReference; get size(): number; toJSON(): object | null; val(): any; }DataSnapshot是高效生成、不可修改、永不变化的位置数据拷贝见 Reference_impl.ts 的类注释其成员行为均有源码佐证Reference_impl.ts成员行为val()提取 JS 值object/array/string/number/boolean/null空快照返回nullexportVal()类似val()但包含 priority 信息适合数据备份toJSON()等价于exportVal()exists()是否包含数据比val() ! null更高效child(path)取相对路径子快照无数据时返回空快照hasChild(path)指定子路径是否存在非 null 数据hasChildren()是否有非 null 子属性forEach(action)按查询顺序遍历子节点回调返回true可中止遍历返回值表示是否被中止。排序保证未指定orderBy*时按 key 排序有 priority 则按 prioritykey该快照位置 key根为nullpriority该位置 priority 值size子节点数量ref该快照对应的引用forEach回调接收的是IteratedDataSnapshotexport interface IteratedDataSnapshot extends DataSnapshot { key: string; // 遍历中子节点的 key 必为非空 }const posts await get(ref(db, posts)); posts.forEach(child { console.log(child.key, child.val()); // 返回 true 可提前终止遍历 });六、查询与过滤orderBy / limit / 范围约束6.1 query 与 QueryConstraintexport function query( query: Query, ...queryConstraints: QueryConstraint[] ): Query;query在现有 Query/Reference 基础上叠加若干约束返回新的Query实例。约束的基类与类型定义export abstract class QueryConstraint { abstract readonly type: QueryConstraintType; } export type QueryConstraintType | endAt | endBefore | startAt | startAfter | limitToFirst | limitToLast | orderByChild | orderByKey | orderByPriority | orderByValue | equalTo;每个约束类实现_apply(query)返回带新QueryParams的QueryImpl副本见 Reference_impl.ts并在应用时执行validateLimit与validateQueryEndpoints校验组合合法性。6.2 排序约束orderBy*export function orderByChild(path: string): QueryConstraint; export function orderByKey(): QueryConstraint; export function orderByPriority(): QueryConstraint; export function orderByValue(): QueryConstraint;一次查询只能使用一个 orderBy——源码在 Reference_impl.ts 通过validateNoPreviousOrderByCall强制orderByChild: $key is invalid. Use orderByKey() instead.且禁止组合多个 orderBy。底层对应四类索引KEY_INDEX、PRIORITY_INDEX、PATH_INDEX、VALUE_INDEX见 Reference_impl.ts 的索引导入。const byHeight query(ref(db, dinosaurs), orderByChild(height)); const byKey query(ref(db, users), orderByKey()); const byValue query(ref(db, scores), orderByValue());6.3 数量限制limitToFirst / limitToLastexport function limitToFirst(limit: number): QueryConstraint; export function limitToLast(limit: number): QueryConstraint;limit必须是正整数。源码校验typeof limit ! number || Math.floor(limit) ! limit || limit 0时抛First argument must be a positive integerReference_impl.ts。const top10 query(ref(db, scores), orderByValue(), limitToLast(10));6.4 范围约束startAt / startAfter / endAt / endBefore / equalToexport function startAt(value?: number | string | boolean | null, key?: string): QueryConstraint; export function startAfter(value: number | string | boolean | null, key?: string): QueryConstraint; export function endAt(value: number | string | boolean | null, key?: string): QueryConstraint; export function endBefore(value: number | string | boolean | null, key?: string): QueryConstraint; export function equalTo(value: number | string | boolean | null, key?: string): QueryConstraint;边界语义均可在 Reference_impl.ts 的约束类注释与文档注释中确认startAt(value, key?)包含value 起点给定key时值等于 value 的子节点还需 key ≥ 指定 keystartAfter(value, key?)排他起点只包含值大于 value或值等于 value 且 key 大于指定 key的节点endAt(value, key?)包含value 终点给定key时要求 key ≤ 指定 keyendBefore(value, key?)排他终点equalTo(value, key?)精确匹配等价于同时设置 start 与 end 于同一值。参数类型必须与orderBy*匹配源码validateQueryEndpointsReference_impl.ts给出三条硬性规则orderByKey()时startAt/endAt/equalTo只能传一个参数且必须是字符串否则抛When ordering by key, you may only pass one argument/the argument ... must be a stringorderByPriority()时值必须是合法 prioritynull、数字或字符串其他 orderBy 下值不能是对象。另外startAtendAtlimit三者的组合有专门限制源码validateLimitReference_impl.ts规定不能同时使用 start 与 end 再叠加limit旧式limit()已被废弃改用limitToFirst/limitToLast否则抛Cant combine startAt(), startAfter(), endAt(), endBefore(), and limit()。// 身高在 2 到 3 米之间、按身高排序的恐龙含 2 与 3 const midSized query( ref(db, dinosaurs), orderByChild(height), startAt(2), endAt(3) ); // 分页上一页最后一条为 (dino-20, 2.5) const nextPage query( ref(db, dinosaurs), orderByChild(height), startAfter(2.5, dino-20), limitToFirst(20) );七、原子事务runTransactionexport function runTransaction( ref: DatabaseReference, transactionUpdate: (currentData: any) unknown, options?: TransactionOptions ): PromiseTransactionResult; export interface TransactionOptions { readonly applyLocally?: boolean; } export class TransactionResult { readonly committed: boolean; readonly snapshot: DataSnapshot; toJSON(): object; }runTransaction用于基于当前值修改为新值的原子操作实现见 Transaction.tstransactionUpdate(currentData)接收当前位置当前值JS 对象返回新值返回undefined表示中止事务若写期间其他客户端抢先写入了该位置更新函数会以最新值重试直到无冲突成功或你主动中止options.applyLocally默认为true每次更新函数运行都会触发本地事件可能看到中间态设为false可抑制中间事件只在事务完成后触发一次返回的TransactionResult含committed是否成功提交与snapshot结果快照toJSON()返回{ committed, snapshot }两个注意事项源码注释明确与set()混用会取消该位置的挂起事务启用 Security Rules 时客户端除.write外还需.read权限因为事务需要先读后写源码还会对ref.key .length || .keys抛read-only object错误Transaction.ts。const likesRef ref(db, posts/abc/likes); const result await runTransaction(likesRef, current { return (current ?? 0) 1; }, { applyLocally: false }); if (result.committed) { console.log(提交成功最新值, result.snapshot.val()); }实现细节事务开始前会先onValue(ref, () {})挂一个静默 watcher 确保能收到服务器更新再调用repoStartTransaction进入核心事务循环Transaction.ts。八、断线能力OnDisconnect 与在线状态管理8.1 OnDisconnect客户端断线时自动写数据export function onDisconnect(ref: DatabaseReference): OnDisconnect; export class OnDisconnect { cancel(): Promisevoid; remove(): Promisevoid; set(value: unknown): Promisevoid; setWithPriority(value: unknown, priority: number | string | null): Promisevoid; update(values: object): Promisevoid; }OnDisconnect让客户端在断开连接关浏览器、跳页、断网、崩溃时自动执行预注册的写操作是实现在线状态/presence的核心机制。方法语义见 OnDisconnect.tsset(value)断线时写入指定值典型{ online: false }setWithPriority(value, priority)断线时写入值 优先级update(values)断线时只更新指定子键键支持相对路径remove()断线时删除该位置数据内部走repoOnDisconnectSet(..., null)cancel()取消该位置及所有子位置已排队的所有断线写操作。关键注意事项源码注释强调断线操作只触发一次每次重新连接后需要重新注册且为避免断线瞬间请求还没发出去这些函数应在写入任何数据之前调用。底层通过repoOnDisconnectSet/Update/Cancel下发到服务器。import { ref, onDisconnect, set, update } from firebase/database; const presenceRef ref(db, presence/ada); // 先注册断线操作再写在线状态 await onDisconnect(presenceRef).set({ online: false, lastSeen: serverTimestamp() }); await set(presenceRef, { online: true });8.2 goOffline / goOnline手动控制连接export function goOffline(db: Database): void; export function goOnline(db: Database): void;客户端默认保持与服务器的长连接并自动重连。goOffline(db)主动断开repoInterrupt断线期间不再接收远程更新但本地写操作照常立即触发事件并自动排队、重连后重放goOnline(db)恢复连接repoResume并自动与服务器同步补齐状态实现见 Database.ts。九、调试与传输控制enableLogging、forceWebSockets、forceLongPolling9.1 enableLoggingexport function enableLogging(enabled: boolean, persistent?: boolean): any; export function enableLogging(logger: (message: string) unknown): any;两个重载实现见 Database.tsenableLogging(true, persistent)开启调试日志输出到 consolepersistenttrue时通过持久化记住开关状态刷新页面后仍保持enableLogging(customLogger)传入自定义日志函数完全接管日志输出。9.2 forceWebSockets / forceLongPollingexport function forceWebSockets(): void; export function forceLongPolling(): void;强制客户端使用 WebSocket 或长轮询传输默认由 SDK 自动选择。实现Database.tsforceWebSockets()BrowserPollConnection.forceDisallow()禁用长轮询forceLongPolling()WebSocketConnection.forceDisallow()BrowserPollConnection.forceAllow()强制长轮询若 databaseURL 本身使用 wss 协议则忽略两者都必须在任何ref或监听建立之前调用否则输出警告Transport has already been initialized...。此外API 报告还包含一个内部测试钩子forceRestClient通过_TEST_ACCESS_forceRestClient暴露见 api.standalone.ts仅用于测试强制走只读 REST 客户端不属于稳定公开 API。十、API 报告中的其他类型汇总为了让你在阅读 common/api-review/database.api.md 时能快速对号入座这里把其余类型一并归类类型归属模块说明EmulatorMockTokenOptionsfirebase/util再导出模拟器 mock token 选项对象由 Database.ts 再导出ThenableReference写入push的返回值引用与 Promise 二合一Unsubscribe监听onValue/onChild*返回的移除函数ListenOptions监听{ onlyOnce?: boolean }一次性监听IteratedDataSnapshot读取forEach回调参数key非空TransactionOptions / TransactionResult事务见第七章QueryConstraintType查询11 种约束的字符串联合类型再补充一点 API 报告的产生机制方便你理解其权威性仓库通过api-report脚本见 packages/database/package.json先用prune-dts从编译产物提取公开 d.ts再用 API Extractor 生成temp目录中的报告database.api.md即该流程的固定快照。若你本地基于packages/database开发可用yarn build含api-report重新生成用yarn test含 lint 与模拟器集成测试验证改动。结语一条从 API 签名到源码行为的完整链路通过这份 API 报告与 packages/database/src 源码的对照你可以清晰地看到模块化 Realtime Database SDK 的完整公开表面getDatabase/ref/child定位数据set/update/push/remove/setPriority/setWithPriority写入数据serverTimestamp/increment提供服务端原子占位符onValue/onChild*/off/get读取数据query配合 11 种QueryConstraint完成排序、分页与范围过滤runTransaction保证并发安全OnDisconnect/goOffline/goOnline支撑离线场景connectDatabaseEmulator打通本地开发与规则测试enableLogging/forceWebSockets/forceLongPolling提供调试与传输控制。无论是阅读 common/api-review/database.api.md 确认 API 形态还是深入 packages/database/src/api 追查实现细节这份清单都能作为你的速查地图。赞分享开发工具后端【免费下载链接】firebase-js-sdkFirebase Javascript SDK项目地址https://gitcode.com/gh_mirrors/fi/firebase-js-sdk点击查看免费下载相关推荐Firebase JavaScript SDK 的 Realtime Database 模块完全指南从初始化到查询与事务的 API 全解析Firebase JavaScript SDK 的 Realtime Database 模块完全指南从初始化到查询与事务的 API 全解析 本篇技术指南以 f开发工具后端从 Firebase Realtime Database 加载数据到 LlamaIndexFirebaseRealtimeDatabaseReader 完整指南从 Firebase Realtime Database 加载数据到 LlamaIndexFirebaseRealtimeDatabaseReader 完整指人工智能大模型AI 应用RAGAI Agentreact-native-firebase Realtime Database 模块演进全解析从 V9 模块化、TypeScript 迁移到 TurboModules 的版本脉络react native firebase Realtime Database 模块演进全解析从 V9 模块化、TypeScript 迁移到 TurboMod移动开发后端上一篇ASP.NET Core Blazor托管模型详解交互式服务端与WebAssembly如何抉择下一篇终极指南3步掌握Grounded-SAM-2视频目标跟踪与分割技术创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

MCreator 旗帜图案(Banner Pattern)盾牌纹理制作指南:64×64 白色变体与 12×22×1 立方体模型详解

MCreator 旗帜图案(Banner Pattern)盾牌纹理制作指南:64×64 白色变体与 12×22×1 立方体模型详解

低代码代码生成桌面应用游戏开发 【免费下载链接】MCreator MCreator is an open-source software used to make Minecraft Java Edition mods, Minecraft Bedrock Edition Add-Ons, resource packs, and data packs using an intuitive easy-to-learn interface or with an in…

2026/10/16 3:02:59 阅读更多 →
ComfyUI负面提示词教程:国漫负面词库+权重语法+手指崩坏修复,附完整词表

ComfyUI负面提示词教程:国漫负面词库+权重语法+手指崩坏修复,附完整词表

你是不是已经能用国漫模型出图了,但每次出人物,手指不是多一根就是少一根,脸偶尔还歪得离谱? 别慌,我也被手指折磨了大半个月——明明正面提示词写得好好的,手就是画不对。 这篇不教新操作,就做一件事:给你一套国漫专用的负面提示词库,按类别整理好,手指、面部、画质…

2026/10/16 3:02:59 阅读更多 →
《Agentic Design Patterns》第 21 章导读:探索与发现

《Agentic Design Patterns》第 21 章导读:探索与发现

《Agentic Design Patterns》第 21 章导读:探索与发现本文是对开源书籍《Agentic Design Patterns》第 21 章的解读与导读,内容忠实呈现原文,并附个人思考。 原书在线阅读:https://adp.xindoo.xyz/ | 翻译项目代码仓库…

2026/10/16 3:02:59 阅读更多 →

最新新闻

移动端H5开发与PC端Web的核心差异及实战指南

移动端H5开发与PC端Web的核心差异及实战指南

移动端 H5 开发这个话题,我最早接触是在功能机向智能手机过渡那段时间。当时大家还在争论“移动端是不是要单独做一套网站”,后来从自适应到响应式再到各种混合开发方案,折腾了这么多年,我发现很多同学其实对“移动端 H5 开发和 P…

2026/10/16 3:53:10 阅读更多 →
C# Winform连接SQL Server:从环境配置到增删改查完整指南

C# Winform连接SQL Server:从环境配置到增删改查完整指南

简介:这是一套面向C#初学者的WinformSQL Server数据库增删改查入门资源,适合刚接触桌面数据库开发、希望掌握本地与网络连接方式的读者。资源以完整VS工程形式提供,包含CrudTest项目源码、SQLQuery1.sql数据库查询脚本、说明文档及编译生成的…

2026/10/16 3:53:10 阅读更多 →
Unity WebGL构建报错unityLinker与IL2CPP排查指南

Unity WebGL构建报错unityLinker与IL2CPP排查指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:53:10 阅读更多 →
Wireshark实战入门:从抓不到包到定位TCP窗口缩放故障

Wireshark实战入门:从抓不到包到定位TCP窗口缩放故障

1. 为什么今天还要学Wireshark?——从“看不见的网络”到“可触摸的数据流”很多人第一次听说Wireshark,是在某次服务突然卡顿、接口返回超时、或者App连不上服务器的时候。运维同事皱着眉头说:“得抓个包看看”,然后打开一个蓝白…

2026/10/16 3:53:10 阅读更多 →
SpringBoot家具销售管理系统实战:从CRUD到库存并发设计

SpringBoot家具销售管理系统实战:从CRUD到库存并发设计

花了整整两天时间把这类基于SpringBoot的家具销售管理系统从头到尾梳理了一遍。单看标题,很多人会觉得这又是一个普通的CRUD练习项目,但真正把业务模块拆开之后你会发现,家具销售里那些大件、低频、高客单价带来的逻辑细节,它其实…

2026/10/16 3:53:10 阅读更多 →
CTF音频隐写解题指南:从‘啊哒~’看振幅、频谱与相位三重分析

CTF音频隐写解题指南:从‘啊哒~’看振幅、频谱与相位三重分析

1. 从一道CTF杂项题名看起:为什么“啊哒~”不是卖萌,而是信号“BugkuCTF-Misc:啊哒~”——第一次在某高校CTF训练平台看到这个标题时,我下意识点开想看看是不是新出的搞笑彩蛋题。结果发现它被归在Misc(杂项&#xff0…

2026/10/16 3:52:10 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →