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

为何Expo的tsconfig.base使用moduleResolution: node而非node16?

Expo Monorepo 共享API库模块导出问题解决方案

方案1:调整模块解析策略兼容exports配置

不需要放弃分模块导出,你可以在共享库的tsconfig.json中单独设置更现代的模块解析规则,同时确保Expo项目能兼容:

// 共享库的tsconfig.json
{
  "compilerOptions": {
    "moduleResolution": "bundler", // 或 "nodenext",两者都支持package.json exports
    "module": "ESNext",
    "target": "ESNext"
  }
}

同时在Expo项目的tsconfig.json中,也将moduleResolution改为bundler——这是Expo最新版本推荐的配置,既能支持exports,也不会影响原有项目的构建。

方案2:添加Legacy兼容字段,让exports和Node解析共存

如果必须保留Expo的moduleResolution: node,可以在共享库的package.json中添加条件导出和兼容字段,同时生成编译后的产物:

// 共享库package.json
"name": "@foo/api",
"exports": {
  "./auth": {
    "import": "./src/auth.ts",
    "require": "./dist/auth.js"
  },
  "./config": {
    "import": "./src/config.ts",
    "require": "./dist/config.js"
  },
  "./user": {
    "import": "./src/user/index.ts",
    "require": "./dist/user/index.js"
  }
},
"main": "./dist/index.js",
"typesVersions": {
  "*": {
    "auth": ["./dist/auth.d.ts"],
    "config": ["./dist/config.d.ts"],
    "user": ["./dist/user/index.d.ts"]
  }
}

这样Node解析时会使用require对应的编译后路径,而现代工具也能识别exports的配置。需要注意先通过tsc将源码编译到dist目录。

方案3:用路径映射绕过Node解析限制

在Expo项目的tsconfig.json中添加paths配置,直接映射子模块的路径:

// Expo项目的tsconfig.json
{
  "compilerOptions": {
    "paths": {
      "@foo/api/auth": ["../path-to-your-api-library/src/auth.ts"],
      "@foo/api/config": ["../path-to-your-api-library/src/config.ts"],
      "@foo/api/user": ["../path-to-your-api-library/src/user/index.ts"]
    }
  }
}

这种方式不需要修改共享库的配置,直接让Expo项目通过路径映射找到对应的模块文件。

备选:单文件导出+main配置

如果上述方案都嫌麻烦,改成单文件导出也可行——在共享库根目录创建一个index.ts,导出所有子模块的内容:

// src/index.ts
export * from './auth';
export * from './config';
export * from './user';

然后在package.json中设置:

"main": "./src/index.ts",
"types": "./src/index.ts"

但这种方式会丢失按需导入的能力,可能导致打包体积增大,适合模块数量少、体积小的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 09:52:53