typescript Firebase部署-找不到本地依赖项的模块

e5nqia27  于 2023-06-07  发布在  TypeScript
关注(0)|答案(3)|浏览(220)

我有一个名为shared的子模块,它位于backend文件夹(云函数文件夹)旁边:

我在backend/package.json中添加了本地依赖项shared,如下所示:

"dependencies": {
    ...
    "shared": "file:../shared"
}

我运行了npm install并确保node_modules/shared存在。虽然,当我运行以下代码:

firebase deploy --only functions

我得到以下错误(通过Firebase):

Error: Error parsing triggers: Cannot find module 'shared/common'

Try running "npm install" in your functions directory before deploying.

此错误是由于这一行:

import { currentWeek } from 'shared/common';

如果我将目录更改为../../../shared/common,firebase将编译而没有任何错误。

shared/common/index.ts:

export { currentWeek } from './current-week';

shared/tsconfig.json:

{
  "compilerOptions": {
    "baseUrl": ".",
    "target": "es5",
    "module": "commonjs",
    "declaration": true,
    "strict": true,
    "removeComments": true
  }
}

backend/tsconfig.json:

{
  "compilerOptions": {
    "baseUrl": ".",
    "declaration": true,
    "outDir": "./dist",
    "module": "commonjs",
    "noImplicitAny": false,
    "removeComments": true,
    "noLib": false,
    "allowSyntheticDefaultImports": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "resolveJsonModule": true,
    "target": "es6",
    "moduleResolution": "node",
    "typeRoots": [
      "node_modules/@types"
    ],
    "lib": [
      "es2015",
      "dom"
    ]
  },
  "include": [
    "./src/**/*",
    "../shared/**/*"
  ]
}

如果我有这个模块,为什么我会得到这个错误?我是不是漏掉了什么?

b1payxdu

b1payxdu1#

我认为,你必须配置module-resolution为typescript编译器。
对于您的案例:

{
  "compilerOptions": {
    "baseUrl": ".", // This must be specified if "paths" is.
    "paths": {
      "shared/*": ["../shared/*"] // This mapping is relative to "baseUrl".
    }
  }
}

你可以用另一个名字来命名shared

{
      "compilerOptions": {
        "baseUrl": ".", // This must be specified if "paths" is.
        "paths": {
          "myLib/*": ["../shared/*"] // This mapping is relative to "baseUrl".
        }
      }
    }

用途:

import { currentWeek } from "myLib/common";
zzlelutf

zzlelutf2#

简而言之:
1.默认情况下,node_modules被忽略,而backend/dist被上传。

  1. npm run build发生在本地,npm install发生在云中。
  2. npm install在云中可能会失败,因为缺少shared文件夹或由于云环境中不同的目录结构和/或不同的“根”目录而导致的错误路径问题。
    或者,更详细地:
    Functions有一个predeploy步骤,在本地 * 构建 *(npm run build => tsc)typescript项目,然后将输出推送到云,在那里安装依赖项 *(npm install)。
    如果通过相对路径(../../shared)包含shared,编译后的代码将在项目 * 构建 *(本地)后输出到backend/dist文件夹,从而上传。
    当您通过本地节点模块依赖项包含shared时,输出在依赖项 * 安装 * 后位于backend/node_modules文件夹中,因此不会上传,因为默认情况下会忽略node_modules
    您看到的另一个问题是为什么npm install不能在云中安装本地依赖项。这可能是由于(1)没有将sharedbackend一起上传,和/或云环境中的目录和相对路径结构与本地不同。
    firebase.json
{
  "functions": {
    "predeploy": ["npm --prefix \"$RESOURCE_DIR\" run lint", "npm --prefix \"$RESOURCE_DIR\" run build"],
    "source": "functions",
    "ignore": ["**/.env", "**/.runtimeconfig.js", "**/.log", "**/node_modules/**"]
  },
  ...
}
gj3fmq9x

gj3fmq9x3#

虽然@jrasm91的答案很好地解释了这个错误的原因,但我有点怀念这里问题的解决方案。
让我们假设你有下面的monorepo结构

- common
- firebase
  - functions

其中common是一个包含公共代码的NodeJS模块,firebase是Firebase项目的根文件夹,firebase/functions是函数的NodeJS项目。
firebase/functions/package.json中,不能包含common模块,如

"dependencies": {
    "common": "file:../../common"
}

因为正如@jrasm91所解释的,文件夹common位于functions文件夹之外,因此在运行firebase deploy --only functions时不会打包和上传,这也在这里解释。
我的解决方案是将common文件夹附加符号链接到functions文件夹

cd firebase/functions
ln -s ../../common common

然后更新package.json

"dependencies": {
    "common": "file:common"
}

相关问题