NodeJS Azure函数在本地解析npm包,但不在Azure中

w51jfk4q  于 2023-08-04  发布在  Node.js
关注(0)|答案(1)|浏览(124)

bounty还有4天到期。回答此问题可获得+100声望奖励。d512希望引起更多的注意这个问题。

我正在使用node编写一些azure函数。我有以下文件夹结构(注意,所有依赖项都在package.json中声明,该package.json位于azure函数所在的文件夹上方)。

|-- package.json
  |-- node_modules /* dependencies for all code in sub-folders lives here */
  |-- server/
      |-- src/
          |-- azf/
              |-- host.json
              |-- local.settings.json
              |-- tsconfig.json
              |-- package.json /* only npm scripts in this file, no dependencies */
              |-- FunctionOne/
                  |-- function.json
                  |-- index.ts
              |-- FunctionTwo/
                  |-- function.json
                  |-- index.ts

字符串
当我运行时,此设置在本地工作正常

func start


但是当我通过github操作将这些函数部署到azure时,函数中的代码会抛出找不到依赖项的错误。例如,它无法在运行时找到lodash
失败例外:Worker无法加载函数FunctionTwo:'Cannot find > module 'lodash'需要堆栈:-/home/site/wwwroot/dist/FunctionTwo/index.js
一般来说,在节点世界中,使用在父文件夹的node_modules中解析的依赖关系是可以的。节点运行时将在目录结构中遍历node_modules文件夹,直到找到它要查找的依赖项或到达文件系统的根。不过,这在Azure中显然行不通。
有没有可能在Azure中实现这个功能?

j5fpnvbx

j5fpnvbx1#

您可能压缩了azf文件夹并将其部署在azure上,因此node_modules文件夹不存在,导致找不到依赖项。
有两种方法可以解决这个问题

1.其package.json文件中的依赖重复

由于建议作为包运行以防止冷启动,因此Azure函数的package.json文件也应该具有运行函数所需的依赖项。此文件仅在部署期间作为GitHub Actions工作流的一部分使用,您将在压缩以发布函数应用程序之前安装依赖项。
这有复制依赖项的缺点,但在某种程度上是一种更简单的方法

2.捆绑你的功能

这有点微妙,因为没有现成的官方方法来做到这一点。这个想法是使用类似webpack的东西将您的函数捆绑到单个文件中,包括所有依赖项。
有一些实现(funcpackazure-functions-webpack-plugin)并没有真正维护,但可以给予您了解如何处理它们。
虽然我没有现成的webpack配置可供分享,但一个简单的方法是

  • 每个函数都有一个单独的入口点
  • 使用正确的scriptFile属性生成function.json文件(请参阅此处的TypeScript部分)
  • 包括typescript、babel等的加载器和插件。取决于您的使用情形

相关问题