大家在使用nodejs的时候可能都有过不同的环境,设置的环境变量的值不一样的情况,比如开发模式我想设置NODE_ENV=development
,灰度测试设置NODE_ENV=gray
,生产环境设置NODE_ENV=production
这种需求,这时我们可以使用cross-env
,在package.json的scripts里面
{
"scripts": {
"development": "cross-env NODE_ENV=development node index.js",
"gray": "cross-env NODE_ENV=gray node index.js",
"production": "cross-env NODE_ENV=development node index.js",
}
}
这样process.env.NODE_ENV
这个值就可以根据你执行的不同指令而变化了。
然后pm2如何设置环境变量呢?
我是在根目录上建立了一个ecosystem.config.js
文件,里面的内容也比较简单,大概是这样的
module.exports = {
apps: [
{
name: 'XXX',
script: './index.js',
watch: true,
ignore_watch: [
'node_modules',
'logs'
],
env_dev: {
NODE_ENV: "development"
},
env_prod: {
NODE_ENV: 'production'
},
error_file: './logs/app-err.log',
out_file: './logs/app-out.log',
log_date_format: 'YYYY-MM-DD HH:mm:ss',
}
]
};
这里的env_dev和env_prod是pm2文档里面给的规范,执行的时候’env_'是省略的,比如执行pm2 start --env dev
,这里的dev就是env_dev,然后环境变量process.env.NODE_ENV
就被设置成了development
。文档在这里
基本使用就是这样,现在我想要在nuxt项目上使用pm2,遇到了一些坑,下面来总结一下。
- 如果使用
ecosystem.config.js
这种形式,那么script这项是一个可执行文件,但是nuxt在编译完毕之后,入口文件应该是在.nuxt文件夹里面,具体是哪个文件呢,这个我们可以在官网找到答案nuxt使用pm2。 - 第二个问题是,我执行
npm start
这个指令的时候,可能有两种情况,第一种是灰度测试,第二种是生产环境。我该怎么设置环境变量呢。
首先我们先要明确一个东西,不管是用在pm2配置文件,还是在package.json中配置的‘start’: cross-env NODE_ENV=prod nuxt start
,都是nodejs运行时的process.env
,是真正的process.env
!,注意是.
链接,这里是真正的process对象。
而无论是使用vue-cli创建的spa,还是在nuxt中执行npm run build构建的项目,process.env都是通过webpack里面的definePlugin实现的,也就是直接把类似process.env.NODE_ENV
这种变成一个常量,注入到项目里面,不然你想一想spa项目,渲染到客户端,怎么可能还有process呢。
所以nuxt的环境变量怎么配置,这里给出答案
package.json
{
"scripts": {
"dev": "cross-env NODE_ENV=development nuxt",
"build:prod": "cross-env NODE_ENV=production nuxt build",
"build:gray": "cross-env NODE_ENV=gray nuxt build",
"start": "nuxt start"
},
}
nuxt.config.js
export default {
env: {
NODE_ENV: process.env.NODE_ENV
}
}
注意:nuxt.config.js中拿到的process是真正的process
然后就是在项目里面使用process.env.NODE_ENV