node 项目环境变量兼容及入口分离

对于跨平台来说,环境变量设置是个大坑,这篇文章来讲讲如何剥离环境变量依赖以及入口文件分离问题。

一切从应用的入口开始

1
2
3
4
5
6
7
{
"name": "demo",
"scripts": {
"dev": "NODE_ENV=development node bin/www",
"start": "NODE_ENV=production node bin/www",
}
}

假设我们有一个 express 项目,这是我们的开发和启动配置。
在 linux/mac 下妥妥的,可 win 下就挂了,因为 win 的环境变量不是这样设置的。
于是乎我们引入一个 cross-env 模块,然后配置如下。

1
2
3
4
5
6
7
{
"name": "demo",
"scripts": {
"dev": "cross-env NODE_ENV=development node bin/www",
"start": "cross-env NODE_ENV=production node bin/www",
}
}

问题解决了,皆大欢喜,文章结束。。

咳咳,,等等,这不是我要说的东西。

入口分离

我比较喜欢用入口分离来处理跨平台问题,简单的兼容性基本都可以靠编程来解决。

1
2
3
4
5
6
7
8
{
"name": "demo",
"scripts": {
"dev": "node bin/dev",
"other": "node bin/other", // 其他脚本,如编译,清理,同步等
"start": "node bin/www",
}
}

这样不是更好么,然后在对应的入口脚本里写环境变量即可,而且可以针对开发,发布环境,加入不同的初始化代码。

例如: bin/dev 文件:

1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/env node

// 开发环境变量
process.env.NODE_ENV = 'development';

// mock api接口
process.env.WEB_API_STATE = 'mock';

// 调试/报错 支持map
require('source-map-support/register');

// 剩下其他代码一样

在保证启动代码一致的情况下,可以做很多开发环境优化,再也不用在入口文件加入各种判断处理,何乐而不为呢?

小结

手头一堆老项目,各种蛋疼的初始化,各种判断,各种繁琐的处理,所以自己摸索了这个方式方便分离各种环境。
说不定大神们早就这么用了,只是我们这些渣渣不知道而已。