首页 > 解决方案 > 如何部署具有本地 npm 依赖项的 GAE 服务?

问题描述

我是 Google Cloud 的新手,似乎不知道如何部署具有同级本地依赖项的 Google App Engine 服务。我有一个这样的项目结构(我的堆栈是 TypeScript、nestJS、React):

-frontend
    app.yaml
    package.json
-backend
    app.yaml
    package.json
-common
    package.json
dispatch.yaml

包将frontend静态代码部署到default服务,backend包部署到api服务。该common包包含一些我想在前端和后端之间共享的代码。他们将其包含在他们的package.json文件中,如下所示:

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

这种结构在本地运行良好。问题是,当我部署后端时,npm install失败了,因为它找不到common包。这是有道理的,因为我知道它只会将内容上传backend到该服务。但是实现这一目标的正确方法是什么?

我想我可以只部署一个包含所有代码的服务,并让我的顶级package.json委托npm start到后端的package.json. 但这只是因为我的前端是完全静态的,所以我只有一个需要npm start调用的包。似乎应该有更好的方法来处理这个问题,因为如果我有两个单独的后端,每个后端都需要自己的npm start.

我猜我正在以一种根本错误的方式思考这方面的某些方面,但我需要帮助弄清楚那是什么。

标签: node.jsgoogle-app-enginenpmgoogle-cloud-platformgcloud

解决方案


我在使用 Firebase 时遇到了类似的情况,我想在前端和后端之间共享代码,而不必在两个地方维护更改。

由于您使用的是 Typescript,因此您可以简单地使用tscTypescript 编译器,通过在文件中配置输出,将您的公用文件输出到前端和后端文件夹tsconfig.jsonhttps://www.typescriptlang.org/docs/handbook/tsconfig-json.html

对于前面,您将其输出为.js文件,然后将其加载为<script src='myCommonFile.js>. 在后面,你会requireimport它。

然后诀窍是以这样的方式编写代码,它可以在浏览器和节点环境中使用。引用此 SO 帖子中的代码:

(function(exports){

    // Your code goes here. For example: 
   exports.test = function(){
        return 'hello world'
    };

})(typeof exports === 'undefined'? this.mymodule = {} : exports);

因此,如果exports未定义,则必须在浏览器中,在这种情况下mymodule,在window(ie, this) 上声明。或者,如果exports已定义,则它在node上下文中,在这种情况下,您只需var mymodule = require('mymodule'). 在任一环境中,您都可以将其用作mymodule.test(). 漂亮!


推荐阅读