You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native跨平台适配:如何条件导入WatermelonDB适配器且导出不变?

解决方案

当然可以用条件判断替代手动注释,完全不需要修改export { database }的结构,以下是具体实现:

核心思路

利用运行环境的标识(React Native的Platform模块或Web环境的window对象)自动选择对应的适配器,通过同步的require导入对应模块,避免手动切换注释。

完整代码示例

import { Database } from '@nozbe/watermelondb';
import { Platform } from 'react-native';
import { DbModels, DbSchema } from './schema';

let mowebDb = 'moweb';
let adapter;

// 根据平台自动选择适配器
if (Platform.OS === 'web') {
  const LokiJSAdapter = require('@nozbe/watermelondb/adapters/lokijs').default;
  adapter = new LokiJSAdapter({
    schema: DbSchema,
    dbName: mowebDb,
    useWebWorker: false,
    useIncrementalIndexedDB: true,
  });
} else {
  const SQLiteAdapter = require('@nozbe/watermelondb/adapters/sqlite').default;
  adapter = new SQLiteAdapter({
    dbName: mowebDb,
    schema: DbSchema,
  });
}

const database = new Database({
  adapter,
  actionsEnabled: true,
  modelClasses: DbModels,
});

export { database }

适配纯Web环境的替代方案

如果你的Web端不是基于React Native Web构建的,可以用window对象判断环境,替换上述的Platform.OS判断逻辑:

if (typeof window !== 'undefined') {
  // Web环境加载LokiJSAdapter
  const LokiJSAdapter = require('@nozbe/watermelondb/adapters/lokijs').default;
  adapter = new LokiJSAdapter({
    schema: DbSchema,
    dbName: mowebDb,
    useWebWorker: false,
    useIncrementalIndexedDB: true,
  });
} else {
  // 移动端加载SQLiteAdapter
  const SQLiteAdapter = require('@nozbe/watermelondb/adapters/sqlite').default;
  adapter = new SQLiteAdapter({
    dbName: mowebDb,
    schema: DbSchema,
  });
}

效果说明

修改后代码会自动根据运行环境选择对应的适配器,导出的database对象和你手动注释切换的效果完全一致,不需要再手动修改导入语句。

内容的提问来源于stack exchange,提问作者Sami

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 01:35:15