部署Express+React项目到Heroku时tsc命令未找到的问题咨询
解决Heroku部署时
tsc: not found的问题 我来帮你拆解这个问题,一步步理清原因和解决方案:
为什么会出现tsc: not found?
这个错误的核心原因其实很直白:
- 我们通常会把
typescript包安装在devDependencies里(毕竟生产环境不需要编译器),但Heroku在默认的生产环境部署流程中,会执行yarn install --production,直接跳过devDependencies的安装。这就导致你的服务器上根本没有tsc这个命令可用。 - 再看你服务端的
start脚本:tsc & node .,你试图在启动服务时实时编译TypeScript代码,但生产环境下既没有全局安装的tsc,本地node_modules里也没有(因为dev依赖没装),自然会报错找不到命令。
postinstall应该配置在哪个package.json?
最佳实践是配置在服务端的package.json中,因为编译服务端的TypeScript代码是服务端项目自身的责任,这样结构更清晰。当然也可以在根目录的package.json里统一处理,但需要确保脚本能正确进入服务端目录执行编译。
方案1:服务端package.json配置postinstall
修改服务端的package.json脚本,让它先在postinstall阶段完成编译,启动时直接运行编译好的文件:
"scripts": { "build": "tsc", "start": "node dist/index.js", // 直接运行编译后的产物,不要再实时编译 "dev": "tsc -w & nodemon .", "postinstall": "yarn build" }
然后需要告诉Heroku安装dev依赖(因为tsc在devDependencies里),设置环境变量:
heroku config:set YARN_PRODUCTION=false
这样Heroku会安装所有依赖,包括TypeScript,postinstall就能顺利执行编译。
方案2:根目录package.json配置postinstall
如果想在根目录统一管理构建流程,修改根目录的package.json:
"scripts": { "startClient": "react-scripts start", "buildClient": "react-scripts build", "build": "react-scripts build", "start": "cd server && yarn start", "devServer": "cd server && yarn dev", "postinstall": "cd server && yarn install && yarn build" }
同样需要设置YARN_PRODUCTION=false,确保服务端的devDependencies被安装。
可以直接使用npx tsc吗?推荐吗?
可以用,但有几个注意点:
- 如果
typescript是服务端的devDependencies,那必须让Heroku安装dev依赖(也就是上面提到的设置YARN_PRODUCTION=false),否则npx也找不到tsc的包(因为node_modules里没有)。 - 如果把
typescript装到服务端的dependencies里,npx能直接找到,但这样会把编译器打包到生产环境,增加部署包的体积,不是最佳实践。
不推荐在生产环境的start脚本里用npx tsc & node .这种实时编译的方式:生产环境应该预编译代码,而不是每次启动服务都重新编译,既浪费启动时间,也容易因为编译过程出现意外导致服务启动失败。更好的方式是在postinstall阶段完成编译,启动时直接运行编译好的JS文件。
额外的优化方案
如果你不想让Heroku安装dev依赖,还可以:
- 本地提前编译服务端代码,把
server/dist目录提交到Git仓库,这样Heroku部署时直接运行dist里的文件就行,不需要编译。 - 使用Heroku的Node.js buildpack,它能自动识别TypeScript项目并完成编译,不过需要确保你的项目结构符合它的预期。
内容的提问来源于stack exchange,提问作者pg07
相关产品推荐
相关产品推荐

