Monorepo中Azure Functions编译的模块解析问题求助
Monorepo中Azure Functions TypeScript项目的模块解析问题修复
问题场景
在TypeScript Monorepo中开发Azure Functions时,运行pnpm start本地启动出现模块找不到错误:
Error [ERR_MODULE_NOT_FOUND]: Worker was unable to load entry point "dist/src/functions/example.js": Cannot find module '/workspace/depot/packages/prisma/node_modules/data/entity' imported from /workspace/depot/packages/prisma/task.js
核心问题:
- Azure Functions V4要求使用ES模块(
"type": "module"),但TypeScript编译后的JS文件导入路径仍为TS风格(无.js扩展名),导致Node.js无法解析。 apps/worker中导入prisma包模块时,必须写全prisma/dist/task.js,无法使用简洁的prisma/task路径。- Prisma自动生成的
client目录无需重新编译,需确认如何正确部署到dist目录。
解决方案
1. 修复ES模块导入路径缺失.js的问题
- 调整tsconfig配置:在根目录及所有子包的
tsconfig.json的compilerOptions中添加以下关键配置,让TypeScript编译时更贴近ES模块规范:"compilerOptions": { "module": "ESNext", "moduleResolution": "NodeNext", "target": "ES2022", // 强制生成符合ES模块的导入路径 "moduleSuffixes": [".js", ".ts"], "allowImportingTsExtensions": true, "forceConsistentCasingInFileNames": true } - 用
tsc-alias补全扩展名:TypeScript本身不会自动给导入路径添加.js,安装tsc-alias工具来补全:
修改pnpm add -D tsc-aliaspackages/prisma和packages/data的package.json中的build脚本:
编译后,"scripts": { "build": "tsc -b && tsc-alias" }task.js中的导入会自动变为import { Entity } from 'data/entity.js';,符合Node.js ES模块解析规则。
2. 简化apps/worker中的导入路径
通过配置包的导出映射实现简洁导入:
- 修改
packages/prisma/package.json:添加exports字段定义路径映射:{ "name": "prisma", "type": "module", "exports": { "./task": "./dist/task.js", ".": "./dist/index.js" }, "main": "./dist/index.js", "types": "./dist/index.d.ts" } - 修改
packages/data/package.json:同样添加导出映射:
配置完成后,{ "name": "data", "type": "module", "exports": { "./entity": "./dist/entity.js", ".": "./dist/index.js" }, "main": "./dist/index.js", "types": "./dist/index.d.ts" }apps/worker中即可直接使用import { getTask } from 'prisma/task';,TypeScript和Node.js都会自动解析到正确的文件。
3. 处理Prisma自动生成的client目录
Prisma生成的client已是编译好的JS文件,无需tsc编译,只需复制到dist目录:
- 使用
copyfiles工具(跨平台):
修改pnpm add -D copyfilespackages/prisma/package.json的build脚本:
或者用系统命令(仅Linux/macOS):"scripts": { "build": "tsc -b && tsc-alias && copyfiles -u 1 client/**/* dist/" }
编译后,"scripts": { "build": "tsc -b && tsc-alias && cp -r client dist/client" }dist/client会保留原始生成的内容,确保Azure Functions能正确加载Prisma客户端。
内容的提问来源于stack exchange,提问作者Palt Mp
相关产品推荐
相关产品推荐

