UNPKG

3.15 kBJavaScriptView Raw
1'use strict'
2
3const fs = require('fs')
4const paths = require('./paths')
5const defConf = require('./default')
6const maraConf = require(paths.marauder)
7
8const NODE_ENV = process.env.NODE_ENV
9
10if (!NODE_ENV) {
11 throw new Error(
12 'The NODE_ENV environment variable is required but was not specified.'
13 )
14}
15
16const browserslist = require('browserslist')
17
18// https://github.com/ai/browserslist/blob/master/node.js
19if (!browserslist.findConfig(paths.app)) {
20 // 默认浏览器配置,移动为先
21 // babel-preset-env,Autoprefixer 使用
22 process.env.BROWSERSLIST = defConf.browserslist
23}
24
25// 自定义环境变量前缀
26const MARA = /^MARA_/i
27
28// https://github.com/bkeepers/dotenv#what-other-env-files-can-i-use
29const dotenvFiles = [
30 `${paths.dotenv}.${NODE_ENV}.local`,
31 `${paths.dotenv}.${NODE_ENV}`,
32 // Don't include `.env.local` for `test` environment
33 // since normally you expect tests to produce the same
34 // results for everyone
35 NODE_ENV !== 'test' && `${paths.dotenv}.local`,
36 paths.dotenv
37].filter(Boolean)
38
39// merge .env* 文件中的环境变量
40// dotenv 永远不会覆盖已经存在的环境变量
41// 对于环境中已存在的同名变量,dotenv 会略过设置
42// https://github.com/motdotla/dotenv
43// https://github.com/motdotla/dotenv-expand
44dotenvFiles.forEach(dotenvFile => {
45 if (fs.existsSync(dotenvFile)) {
46 require('dotenv-expand')(
47 require('dotenv').config({
48 // 使用自定义路径
49 path: dotenvFile
50 })
51 )
52 }
53})
54
55// hybrid 两端统一用,特别优待 jsbridgeBuildType 装载到 node 环境
56function loadHybridEnv() {
57 const envField = 'jsbridgeBuildType'
58
59 // 确保通过命令参数 --app 或 --wap 设置的 env 优先级最高
60 if (process.env[envField] || !maraConf.globalEnv) return
61
62 if (envField in maraConf.globalEnv) {
63 const buildEnv = maraConf.globalEnv[envField]
64
65 process.env[envField] = buildEnv === 'wap' ? 'web' : buildEnv
66 }
67}
68
69function getEnv(publicUrl) {
70 // NODE_ENV,PUBLIC_URL 环境变量为脚手架运行依赖
71 // 这里放在 assign 尾部表示顶级含义,不可被覆盖
72 const baseEnv = Object.assign({}, maraConf.globalEnv, {
73 // 标识开发与生产环境
74 // React 内部依赖此变量
75 NODE_ENV: process.env.NODE_ENV || 'development',
76 // 方便使用公共资源路径
77 // 在 js 内,以 process.env.PUBLIC_URL 变量存在
78 // html 中可使用 %PUBLIC_URL% 占位符
79 // 例:<img src="%PUBLIC_URL%/img/logo.png">
80 PUBLIC_URL: publicUrl
81 })
82 const raw = Object.keys(process.env)
83 // 收集当前环境中的自定义环境变量
84 // 为防止环境变量混淆,自定义变量需以 MARA_ 作为前缀
85 .filter(key => MARA.test(key))
86 .reduce((env, key) => {
87 env[key] = process.env[key]
88 return env
89 }, baseEnv)
90
91 // DefinePlugin 需要传入序列化参数值
92 const stringified = {
93 'process.env': Object.keys(raw).reduce((env, key) => {
94 env[key] = JSON.stringify(raw[key])
95 return env
96 }, {})
97 }
98
99 loadHybridEnv()
100
101 // raw 给 InterpolateHtmlPlugin 插件使用
102 return { raw, stringified }
103}
104
105module.exports = getEnv