Mar*_*pes 16 production node.js typescript nestjs
我正在生成我使用 NESTJS 框架制作的 API 的生产版本,并想知道我应该将哪些文件上传到服务器。当我运行“npm run start: prod”编译时,它会生成“dist”文件夹,但我试图只用它运行,但它不足以运行我的应用程序。我需要将所有文件上传到服务器吗?我做了几个测试,删除了我在开发过程中使用的文件夹,但只有当我在开发模式下都一样时才设法在生产模式下运行。
我在文档中查找了有关此内容的信息,但一无所获。有谁能够帮助我?
谢谢
sou*_*rri 12
老实说,你应该只需要 dist 文件夹,因为那是 JS 'complied' 文件。要运行您的应用程序,您通常会使用此命令node dist/main.js。至于你上传什么文件,这取决于你。就我个人而言,我使用了很多持续集成,因此我只需将其克隆到我的容器/服务器中并使用yarn start:prod. 每次部署时,我都会生成在生产环境中运行所需的文件。
就像@Kim Kern 提到的那样,一些节点模块是使用 node-gyro 本地构建的;所以在部署时最好在服务器/容器上构建你的 node_modules。您的部署脚本应如下所示
git clone git@github.com:myuser/myrepo.git /var/www/
cd /var/www/
node -v && \
yarn && \
yarn build && \
yarn start:prod
上面的脚本应该
1) 将所需的 repo 拉入“托管”目录
2) 检查节点版本
3) 安装 node_modules 并构建本机脚本等
4) 构建生产发行版
5) 运行生产 JS 脚本
如果您查看 package.json 文件,您会注意到使用yarn start,yarn start:dev和时运行的不同脚本yarn start:prod。在开发中时,您会注意到ts-nodewhich的使用是 typescript node runner 类型的东西(不记得正确的短语)。该start:dev脚本还使用 nodemode 重新启动ts-node脚本。您还将看到start:prod脚本的使用node dist/main.js和prestart:prod脚本运行rm -rf dist && tsc,它删除了 dist 文件夹并“编译”了生产环境所需的 javascript。
但是,没有持续集成的服务器上的打字稿应用程序的缺点是可能会出现打字稿编译错误,直到运行 prod 脚本您才会看到或知道这些错误。我建议在进行部署之前放置一个程序来从 typescript 编译 javascipt,因为您不想在知道下一个版本将构建和运行之前删除当前的 dist 构建!
@编辑当我回到这个答案时,我脑海中浮现出一条简短的评论:通常,您会在生产中使用 PM2 作为 NodeJS 应用程序的流程管理器。然后,您只需创建一个 Ecosystem.config.json 文件并使用它来启动所有进程。很快就会有一个例子!
只需使用 Nest-CLI 并使用
nest build
然后你会得到一个包含编译后的代码的 dist 文件夹。然后,您可以将其放置在服务器上并使用 PM2 进程管理器运行:
production=true pm2 start dist/main.js
在前面的命令中,环境变量production设置为true。例如,当通过 HTTPS 运行 Nest.js 服务器时,这可能很有用。
如果您想运行 HTTPS 安全服务器,您还必须在服务器的启动过程中包含证书。当环境变量 production 设置为 true 时,证书将包含在 main.ts 中 Nest.js 应用程序的启动过程中,如下所示:
async function bootstrap() {
let appConfig = {}
if (process.env.production) {
    console.log('process env production: ', process.env.production)
    const httpsOptions = {
        key: fs.readFileSync('/etc/certs/letsencrypt/live/testtest.de/privkey.pem'),
        cert: fs.readFileSync('/etc/certs/letsencrypt/live/testtest.de/fullchain.pem'),
    }
    
    // prod config
    appConfig = {
        httpsOptions,
    }
}
const app = await NestFactory.create<NestExpressApplication>(
    AppModule,
    appConfig,
)
app.enableCors()
app.setGlobalPrefix('v1')
await app.listen(3300)
}
bootstrap()
对我来说,这种方法有效,你需要的只是这个dist文件夹:
npm run start:prod,这将dist在您的应用程序源中创建一个文件夹dist文件夹复制到您的服务器。node_modules服务器上的所有依赖项,只需将package.json文件dist复制到文件夹(已复制到服务器上),然后npm install从那里运行。pm2用于运行节点应用程序,则只需pm2 start main.js从dist文件夹内运行大多数情况下,您只需要node_modules. 不过,您应该在服务器上构建库,而不是从开发计算机复制它们。库bcrypt具有特定于机器的代码,并且可能无法在不同的机器上运行。(30% 的 npm 库具有本机绑定。)
因此,对于您的部署,我建议您检查服务器上的 git 存储库,然后直接npm run start:prod在那里运行(每次都会构建项目)。
| 归档时间: | 
 | 
| 查看次数: | 27663 次 | 
| 最近记录: |