pm2 部署 nuxt.js 总结

3,142 阅读3分钟

一、背景

作为一个不到一年的前端小菜鸟,项目从开发到部署都让你做是什么样的感受?我最大的感受就是:真TM蛋疼,锅都让我背完了。

虽然有背不完的锅,但是学到的东西是真的多,今天我就讲一讲 nuxt.js 开发和用 pm2 部署 nuxt.js 过程中遇到的那些坑。

二、nuxt.js 中的 process.env

1、在 js 环境中可以使用 env 变量

env.png

值得注意的是,我们不能直接把 env 变量写在视图中,那会导致解析失败(应该不会有人这么做吧!)

image.png

2、打包后的的 env 变量将会化作静态数据

为什么要专门强调这一点呢?

一个项目是通过一个个小版本迭代逐步完善的,那么在这个过程中一定会区分开发部署生产部署。既然我们使用了 env 这个东西,肯定是希望能动态的去设置一些东西,比如我们希望动态的显示当前是那种部署环境:

image.png

文章之初我们有讲到使用 pm2 去部署 nuxt.jspm2 是支持 env 注入的。那么你可能会疑问为什么不直接在 pm2 中去配置呢?标题已经告诉你答案了。

打包后的 env 变量化作静态数据后,最直接的结果就是无论你在 pm2 中如何配置,nuxt.js 中使用的都是默认配置,我想这应该不是各位想看到的画面吧!

pm2 env:pm2.keymetrics.io/docs/usage/…

那么该怎么来验证上述内容呢?请看下图:

image.png

pm2 部署

1、简单的 nuxt.js 部署

image.png

image.png

本次部署的预期结果应该是“8001生产服”,然而实际情况与预期完全不符。从这次部署也能验证前面所讲到的“打包后的的 env 变量将会化作静态数据”。

2、nuxt.js 在不同环境中的打包和部署(动态部署)

为了解决上面的问题,目前我想到的是在打包的上面做功夫,我们只需要在打包命令中把 env 参数传进去即可。

image.png

然后我们按照图示分别进行打包部署并访问,以下是访问结果:

image.png

image.png

3、在动态部署中配置 axios 跨域代理

菜鸟前端(比如我)在遇到跨域问题时,就只能去“求”后端大神了。然而大神却说这不是他的问题,没办法只能硬着头皮上了,然后一阵百度猛如虎,一看战绩:0-5。有没有很强的既视感。

其实在 nuxt.js 中没必要这么麻烦,nuxt.js 有配套的 axios@nuxtjs/axios,我们只需要在 nuxt.config.js 进行简单配置即可,如下图:

image.png

补充说明

1、使用 Nginx 反向代理 pm2 服务

即使我们使用 pm2 部署了 nuxt.js 程序,我们在公网上也是无法访问到的,那该怎么办呢?请百度“Nginx反向代理pm2”,由于作者对 Nginx 连简单的会用都算不上,就不在这里献丑了。

2、nuxt.js 官方的 pm2 和 Nginx 使用文档

3、pm2 还可以这样配置

在上面的示例中,我们对 pm2 的配置是统一放在 ecosystem.config.js 文件中的。如果你想通过指定配置文件的形式启动 pm2 服务,你会发现执行 pm2 start ecosystem.*.js 与你预期的效果完全不一样。

针对这种需求,我们就不能把配置写在 .js 文件中了,而是写在 .json 文件中,比如:

image.png