Heroku 使用 ts-node 部署

问题描述 投票:0回答:10

我正在尝试在 Heroku 中部署 Angular Universal Starter 的示例。

任务

npm start
失败,因为它无法识别 ts-node。

有没有办法使用 ts-node 在 Heroku 上进行部署?

angular heroku angular-universal ts-node
10个回答
18
投票

您可以使用

 创建 
Procfile

web: npm start

并让您的启动脚本运行 ts-node

"start": "ts-node src/index.ts",

并在您的依赖项上安装 typescript 和 ts-node

"ts-node": "^3.3.0",
"typescript": "^2.4.2"

3
投票

您无法直接将

ts-node
部署到 Heroku。要么构建自己的 buildpack 要么只是将 typescript 编译为 javascript。我推荐后者。只需在发布时运行命令
tsc -p .
即可。

编辑 您还可以创建一个名为

index.js
的文件并添加以下内容:

require('ts-node/register');
require('./server.ts');

然后它应该可以工作。不要忘记运行

npm install --save-dev ts-node

在生产环境中不建议这样做。仅在开发中使用它。


2
投票

package.json:

"start":"ts-node index.ts",
"dependencies": { "ts-node" : "~<version number>" }

为我工作:)


2
投票

要解决

heroku
中与缺失
ts-node
相关的问题,您需要在
tsc
中使用
package.json
命令构建 TypeScript 代码。

 "scripts": {
    ...
    "build": "tsc",
  }

然后在

Procfile
中,您可以使用
node
命令来运行 Heroku 通过在
build
中运行
package.json
命令来运行 Heroku 为您构建的文件。

web: node dist/src/server.js

就我个人而言,我认为这是将基于 TypeScript 的应用程序部署到 Heroku 的最佳解决方案,如果您还需要

tsconfig.json
,您可以看看我的。

{
  "extends": "@araclx/tsconfig",
  "compilerOptions": {
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "noUnusedParameters": false,
    "noUnusedLocals": false,
    "lib": ["ES2018"],
    "module": "commonjs",
    "target": "es6",
    "noImplicitAny": true,
    "moduleResolution": "node",
    "sourceMap": true,
    "outDir": "dist"
  }
}

2
投票

也许我迟到了,但本周我遇到了同样的问题,这就是我通过在网络上收集多个解决方案来解决该问题的方法。希望它对某人有帮助:

添加了节点和yarn或npm版本到

package.json

  "engines": {
    "node": "12.14.0",
    "yarn": "1.x"
  },

将 ts-node 和 typescript 添加到

package.json

上的项目依赖项
"ts-node": "^9.0.0",
"typescript": "^4.1.2"

添加了

postinstall
脚本,该脚本在 Heroku 调用的yarn或npm安装之后调用,这将在选定的目标文件夹(在本例中为dist)上构建您的应用程序

并更改了启动脚本以服务器编译的应用程序而不是 TS

  "scripts": {
    "postinstall": "tsc",
    "start": "cross-env NODE_ENV=production node dist/index.js"
  },

指向

PROCFILE

上的启动脚本
web: yarn start

最后,这是

tsconfig.json
,您可以在其中选择构建目的地
"outDir": "dist",

{
    "compilerOptions": {
        "experimentalDecorators": true,
        "emitDecoratorMetadata": true,
        "target": "es2018",
        "moduleResolution": "node",
        "module": "commonjs",
        "sourceMap": true,
        "rootDir": "src",
        "outDir": "dist",
        "lib": ["esnext", "dom", "es2018", "esnext.asynciterable"],
        "esModuleInterop": true
    },
    "exclude": ["node_modules"]
}

2
投票

出于未知原因,Heroku 会将 ts-node 修剪为开发依赖项,即使您将其列在 dependency 而不是 devDependency 中。你应该做的是指示 Heroku 不要使用以下命令修剪 devDependency:

  $ heroku config:set NPM_CONFIG_PRODUCTION=false YARN_PRODUCTION=false

2
投票

我最近在 2022 年遇到了这个问题,这是最佳答案,所以我添加了我的解决方案。

第一;为了消除您不应该在生产中使用 ts-node 的神话。 .

请参阅此处引用的@Benny Neugebauer这个答案

根据 ts-node 的作者 Blake Embrey 的说法,您可以在生产中使用它但是您应该将它与 `--transpile-only 标志一起使用。

示例:

ts-node --transpile-only ./src/start.ts

此外,您应该从

.ts
中的
"start": "src/start.ts"
中删除
package.json
并根据打字稿文档添加打字

...
    "start":   "ts-node --transpile-only ./src/start",
    "typings": "src/start",
...

您还可以按照说明让 tsconfig 文件包含以下内容:

    "compilerOptions": {
...
    /* Strict Type-Checking Options */
    "strict": false,                                 /* Enable all strict type-checking options. */
...
    },
  "exclude": ["node_modules"]

你仍然得到一个错误

真正的问题:

如果您使用

heroku-22
服务器、
free
hobby
的基本配置并从节点切换到 TS 构建,您可能会注意到部署和启动后的生产错误,如下所示:

TSError: ⨯ Unable to compile TypeScript:
 server.ts(1,29): error TS7016: Could not find a declaration file for module 'body-parser'. '/app/node_modules/body-parser/index.js' implicitly has an 'any' type.
Try `npm i --save-dev @types/body-parser` if it exists or add a new declaration (.d.ts) file containing `declare module 'body-parser';`
 src/app.ts(2,26): error TS7016: Could not find a declaration file for module 'express'. '/app/node_modules/express/index.js' implicitly has an 'any' type.
Try `npm i --save-dev @types/express` if it exists or add a new declaration (.d.ts) file containing `declare module 'express';`
...
diagnosticCodes: [ 7016, 7016, 2307, 7016 ]
Process exited with status 1
State changed from starting to crashed
...

问题是 Heroku Buildpack

heroku/nodejs
angular/universal-starter 使用的东西,没有能力在没有额外步骤的情况下运行
ts-node
...

heroku config:set NPM_CONFIG_PRODUCTION=false YARN_PRODUCTION=false --app <YOUR_APP_NAME>

@anynomius在他们的回答中提到这里最终帮助了我并解决了我遇到的问题。


1
投票

对于我们的项目,问题是,ts-node 仅位于

devDependencies
中的
package.json
中,但 Heroku 在运行时需要此依赖项,因此应将其添加到
dependencies
中。


0
投票

以下对我有用的解决方案

步骤:1 - 安装以下两个软件包

npm i ts-node typescript --save-prod

第 2 步:- 将以下脚本添加到脚本内的 package.json

"scripts": {
    "start": "npm index.js",
    "heroku-start": "ts-node \"./src/server.ts\"",
}

第 3 步:- 在您的 Procfile(存在于您的根级别)中添加以下命令

web: npm run heroku-start

第 4 步:提交更改并部署到 Heroku 上

enter image description here


0
投票

我将把这个留在这里,以防有人正在寻找解决方案,再次:我遇到了完全相同的问题,也有“tsc:未找到”。对我来说,没有任何其他更改的情况下,将其添加到“scripts”下的 package.json 中:

 "scripts": {
    "heroku-prebuild": "npm install typescript",
    ...
  },
© www.soinside.com 2019 - 2024. All rights reserved.