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

Posted

技术标签:

【中文标题】Firebase 部署 - 找不到本地依赖项的模块【英文标题】:Firebase deploy - Cannot find module of a local dependency 【发布时间】:2019-07-15 22:49:00 【问题描述】:

我有一个名为 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
  

后端/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/**/*"
  ]


如果我有这个模块,为什么会出现这个错误?我有什么遗漏吗?

【问题讨论】:

你有没有想过解决这个问题?遇到同样的问题 @Jonovono 不,我必须相对导入它(../../) 【参考方案1】:

简而言之:

    node_modules 默认被忽略,backend/dist 被上传。 npm run build 发生在本地,npm install 发生在云端。 npm install 可能在云中失败,因为缺少 shared 文件夹或由于云环境中不同的目录结构和/或不同的“根”目录导致的路径错误。

或者,更详细地说:

Functions 有一个预部署步骤,在本地构建 (npm run build => tsc) typescript 项目,然后将输出推送到安装了依赖项的云端 (npm install)。

当您通过相对路径 (../../shared) 包含 shared 时,编译后的代码会在项目构建(本地)后输出到 backend/dist 文件夹并因此被上传。

当您通过本地节点模块依赖项包含shared 时,输出在依赖项安装后位于backend/node_modules 文件夹中安装,因此它不会上传,因为node_modules 会被忽略默认。

您看到的另一个问题是为什么npm install 无法在云中安装本地依赖项。这可能是由于 (1) 没有在 backend 旁边上传 shared 和/或云环境中的目录和相对路径结构与本地不同。

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/**"]
  ,
  ...

【讨论】:

【参考方案2】:

我认为,您必须为 typescript 编译器配置 module-resolution

对于您的情况:


  "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";

【讨论】:

如果我将shared 文件夹添加到paths,那么我也必须将它添加到include,这会导致同样的错误。唯一的区别是shared 不会出现在node_modules 中(这又引出了一个问题——为什么firebase 找不到它?我假设它在外部运行npm install 会导致404。

以上是关于Firebase 部署 - 找不到本地依赖项的模块的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 部署错误 - 找不到模块“firebase”

部署 firebase 项目时错误显示“找不到模块 firebase-functions”

损坏的序列化解析结果。使用firebase ui依赖项时找不到选定的模块

颤振:致命错误:找不到模块“firebase_analytics”

Google App Engine - 节点:找不到模块“firebase-admin”

关于IDEA使用Maven工具打包带有本地依赖包的项目 在部署时 仍然找不到本地依赖包中某个类,发生ClassNotFoundException的异常