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

atk*_*yla 6 heroku node.js typescript

在本地测试我以前运行:

"build-live": "nodemon --exec ./node_modules/.bin/ts-node -r dotenv/config -- ./index.ts"
Run Code Online (Sandbox Code Playgroud)

然后我想我的Procfile应该是这样的:

web: ./node_modules/.bin/ts-node -- ./index.ts
Run Code Online (Sandbox Code Playgroud)

但它说模块'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
Run Code Online (Sandbox Code Playgroud)

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

小智 25

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

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

"scripts": {
  "start": "node build/index.js",
  "build": "tsc",
  "postinstall": "npm run build"
}
Run Code Online (Sandbox Code Playgroud)

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

web: npm start
Run Code Online (Sandbox Code Playgroud)

Heroku 在此记录了这种"基于部署的构建"方法.


Hor*_*man 7

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

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

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

更好的方法是使用与Heroku集成的构建服务器.在那里进行构建之后,将其配置为将构建结果发送到Heroku.特拉维斯有这样一个直截了当的设置.这样,您就不需要在存储库中包含构建输出,这被视为反模式.


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


小智 7

Fabian 说我们可以这样做:

"scripts": {
  "start": "node build/index.js",
  "build": "tsc",
  "postinstall": "npm run build"
}
Run Code Online (Sandbox Code Playgroud)

在我写这篇文章的时候,我测试了这个并且可以声明:postinstall不需要,因为构建脚本是由 Heroku 运行的。如果您想在没有构建脚本的情况下执行此操作,则可以使用 heroku-postbuild,它将在安装依赖项后运行tsc以进行编译。