如何将我的Typescript Node.js应用程序部署到Heroku?

时间:2017-04-10 08:14:46

标签: node.js typescript heroku

在本地测试时我以前在运行:

"build-live": "nodemon --exec ./node_modules/.bin/ts-node -r dotenv/config -- ./index.ts"

然后我认为我的Procfile应该是这样的:

web: ./node_modules/.bin/ts-node -- ./index.ts

但它表示找不到模块'typescript',即使它在package.json中也是如此。我在一些地方读到ts-node不是部署到Heroku的方式,所以我不知道该怎么做。

更新:我想我应该编译它,所以我尝试了:

web: ./node_modules/.bin/tsc --module commonjs --allowJs --outDir build/ --sourceMap --target es6 index.ts && node build/index.js

这成功了,但是当实际运行它时,我正在使用的一堆lib得到“找不到模块'......'”。

6 个答案:

答案 0 :(得分:19)

或者,您可以将TypeScript编译为postinstall挂钩并运行node build/index.js作为唯一的Procfile命令:

您的package.json应包含在npm install之后和节点进程启动之前执行的postinstall提示:

"scripts": {
  "start": "node build/index.js",
  "build": "tsc",
  "postinstall": "npm run build"
}

然后您可以按原样保留Procfile:

web: npm start

这种“基于部署的构建”方法由Heroku here记录。

答案 1 :(得分:6)

您给Heroku的命令是通过在index.js编译index.ts和依赖起始节点来启动Web“进程”。根据事物的定时方式,index.js在节点启动时可能存在也可能不存在。

您需要在您想要启动应用程序时编译源代码。例如,网络应该只是web: node index.js或类似。

每个构建过程都不同,因此您需要为自己的设置找出答案。但是,假设你有一个经典的设置,你可以推送到git,然后Heroku接收到这个更改并使用新的slug更新应用程序。您可以在本地编译并在存储库中包含index.js和任何其他构建输出,以便在Heroku使用的slug中可用。

更好的方法是使用与Heroku集成的构建服务器。在那里进行构建之后,将其配置为将构建结果发送到Heroku。 Travis有这样简单的设置。这样,您就不需要在存储库中包含构建输出,这被视为反模式。

在sidenode上,尝试使用tsconfig.json来保持tsc配置。它将使您不必在整个地方编写如此长的命令行。

答案 2 :(得分:0)

Fabian说我们可以做类似的事情:

"scripts": {
  "start": "node build/index.js",
  "build": "tsc",
  "postinstall": "npm run build"
}

在撰写本文时,我对此进行了测试,并可以指出:postinstall不是必需的,因为构建脚本是由Heroku运行的。如果要在不使用构建脚本的情况下执行此操作,则可以使用heroku-postbuild,它将在安装依赖项之后运行,运行tsc进行编译。

答案 3 :(得分:0)

我的问题是关于缺少Typescript npm模块。将应用程序部署到Heroku时找不到Typescript编译器tsc

Heroku部署过程(正确地)没有安装开发依赖项,在我的情况下,Typescript模块是devDependencies的一部分,因此tsc命令未在Heroku平台上运行。

解决方案1 ​​

typescript添加到依赖项:npm i typescript -s

解决方案2

  • 打开Heroku控制台:

Heroku console

  • 选择控制台类型:

Select Heroku console type

  • 运行命令npm i typescript && npm run tsc

答案 4 :(得分:0)

您可以将打字稿从 devDependencies 移至依赖项。

答案 5 :(得分:-1)

在我的例子中,我从“devDependencies”删除了一些依赖到“dependencies”,所以它是这样的:

"dependencies": {
    // The other dependencies goes here, I don't touch them.
    // But all TS dependencies I remove to here. 
    "ts-node": "^9.1.1",
    "tsconfig-paths": "^3.9.0",
    "typescript": "^4.2.3",
    "ts-loader": "^8.0.18"
},