我正在尝试在 Heroku 中部署 Angular Universal Starter 的示例。
任务
npm start
失败,因为它无法识别 ts-node。
有没有办法使用 ts-node 在 Heroku 上进行部署?
您可以使用
创建
Procfile
web: npm start
并让您的启动脚本运行 ts-node
"start": "ts-node src/index.ts",
并在您的依赖项上安装 typescript 和 ts-node
"ts-node": "^3.3.0",
"typescript": "^2.4.2"
您无法直接将
ts-node
部署到 Heroku。要么构建自己的 buildpack 要么只是将 typescript 编译为 javascript。我推荐后者。只需在发布时运行命令 tsc -p .
即可。
编辑 您还可以创建一个名为
index.js
的文件并添加以下内容:
require('ts-node/register');
require('./server.ts');
然后它应该可以工作。不要忘记运行
npm install --save-dev ts-node
。
在生产环境中不建议这样做。仅在开发中使用它。
package.json:
"start":"ts-node index.ts",
"dependencies": { "ts-node" : "~<version number>" }
为我工作:)
要解决
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"
}
}
也许我迟到了,但本周我遇到了同样的问题,这就是我通过在网络上收集多个解决方案来解决该问题的方法。希望它对某人有帮助:
添加了节点和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"]
}
出于未知原因,Heroku 会将 ts-node 修剪为开发依赖项,即使您将其列在 dependency 而不是 devDependency 中。你应该做的是指示 Heroku 不要使用以下命令修剪 devDependency:
$ heroku config:set NPM_CONFIG_PRODUCTION=false YARN_PRODUCTION=false
我最近在 2022 年遇到了这个问题,这是最佳答案,所以我添加了我的解决方案。
请参阅此处引用的@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在他们的回答中提到这里最终帮助了我并解决了我遇到的问题。
对于我们的项目,问题是,ts-node 仅位于
devDependencies
中的 package.json
中,但 Heroku 在运行时需要此依赖项,因此应将其添加到 dependencies
中。
我将把这个留在这里,以防有人正在寻找解决方案,再次:我遇到了完全相同的问题,也有“tsc:未找到”。对我来说,没有任何其他更改的情况下,将其添加到“scripts”下的 package.json 中:
"scripts": {
"heroku-prebuild": "npm install typescript",
...
},