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

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

核心问题:

  1. Azure Functions V4要求使用ES模块("type": "module"),但TypeScript编译后的JS文件导入路径仍为TS风格(无.js扩展名),导致Node.js无法解析。
  2. apps/worker中导入prisma包模块时,必须写全prisma/dist/task.js,无法使用简洁的prisma/task路径。
  3. 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-alias
    
    修改packages/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 copyfiles
    
    修改packages/prisma/package.json的build脚本:
    "scripts": {
      "build": "tsc -b && tsc-alias && copyfiles -u 1 client/**/* dist/"
    }
    
    或者用系统命令(仅Linux/macOS):
    "scripts": {
      "build": "tsc -b && tsc-alias && cp -r client dist/client"
    }
    
    编译后,dist/client会保留原始生成的内容,确保Azure Functions能正确加载Prisma客户端。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 08:15:23