前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >让Node项目支持可扩展的环境配置

让Node项目支持可扩展的环境配置

作者头像
前端小鑫同学
发布2022-12-26 08:55:37
8860
发布2022-12-26 08:55:37
举报
文章被收录于专栏:小鑫同学编程历险记

因Node项目开发的较少没涉及到环境变量切换,但是经常做前端项目开发总是会遇到,比如在Vue的项目可以配置.env.xxx.xxx并要求环境变量的配置要以VUE_APP_开头,Why?,我们就一起来探索一下Vue项目的环境变量是怎么加载并解析的,我们再移植到Node项目中。

探索Vue中环境配置的加载:

先来看看Vue CLI关于模式和环境变量的说明,我们看到有这么一段话:想要了解解析环境文件规则的细节,请参考 dotenv。我们也使用 dotenv-expand 来实现变量扩展 (Vue CLI 3.5+ 支持)。我们先用Vue Cli来创建一个Vue项目。

探索第一步:

package.json中通过执行scripts的命令都使用到了@vue/cli-service

image.png
image.png

探索第二步:

@vue/cli-service包确实安装了官网提示的两个依赖包,并在bin目录下的vue-cli-service.js文件中找到了关键类Service

image.png
image.png

探索第三步:

  1. Service中我们找到了加载环境配置的关键函数,其中的两个path分别指:.env.mode.env.mode.local,也就是我们的环境变量文件可以支持带.local也可以不带。
  2. 思考load两次的作用?
image.png
image.png

探索第三步:

  1. 指定的前缀是怎么回事?我们在util目录下找到了答案:resolveClientEnv.js,最终是由DefinePlugin插件加载到了全局的配置中。
  2. 思考BASE_URL的设置?
image.png
image.png
image.png
image.png

为携带webpack的Node项目中增加环境配置

准备webpack项目环境

准备webpack.config.js

image.png
image.png

新增env-helper.js,我们一起来实现一下:

必备依赖装一下
代码语言:javascript
复制
npm install dotenv --save
npm install dotenv-expand --save
解析环境变量文件
代码语言:javascript
复制
/**
 * 解析环境变量文件
 * @param {*} mode
 */
const loadEnv = (mode) => {
  const basePath = path.resolve(__dirname, `.env${mode ? `.${mode}` : ``}`);
  const localPath = `${basePath}.local`;

  const load = (envPath) => {
    try {
      const env = dotenv.config({ path: envPath, debug: process.env.DEBUG });
      dotenvExpand(env);
    } catch (err) {
      if (err.toString().indexOf("ENOENT") < 0) {
        console.error(err);
      }
    }
  };

  load(localPath);
  load(basePath);
};
符合前缀的环境变量对象

将符合正则条件的和特殊的进行整合后返回,通过注入到DefinePlugin插件中。

代码语言:javascript
复制
/**
 * 获取符合前缀规则的环境变量对象
 */
const prefixRE = /^XXTX_APP_/;
const resolveClientEnv = () => {
  const env = {};
  Object.keys(process.env).forEach((key) => {
    if (prefixRE.test(key) || key === "NODE_ENV") {
      env[key] = process.env[key];
    }
  });
  return env;
};

升级webpack.config.js来演示环境变量读取

增加演示插件和NODE_ENV配置
代码语言:javascript
复制
const webpack = require("webpack");
const { loadEnv, resolveClientEnv } = require("./env-helper");
// 解析环境配置文件
// 通过cross-env 再scripts中配置NODE_ENV=development
loadEnv(process.env.NODE_ENV);
// 获取符合规则的环境配置对象
const env = resolveClientEnv();

const HelloWorldPlugin = require("./hello-world");

module.exports = {
  mode: "development",
  plugins: [
    new webpack.DefinePlugin(env),
    new HelloWorldPlugin({ options: true }),
  ],
};
在我们的webpack插件中使用环境变量
代码语言:javascript
复制
class HelloWorldPlugin {
  apply(compiler) {
    compiler.hooks.done.tap("HelloWorldPlugin", () => {
      console.log("Hello World!");
      console.log("[ XXTX_APP_NAME ] >", process.env.XXTX_APP_NAME);
      console.log("[ XXTX_APP_BASE_URL ] >", process.env.XXTX_APP_BASE_URL);
    });
  }
}

module.exports = HelloWorldPlugin;
查看输出结果
image.png
image.png

结尾说明:

  1. 我们可以将env-helper.js移植到其他的Node项目中只是挂载配置的方式更改即可。
  2. 此次的代码全靠CV大法,你学到了吗?
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-09-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 探索Vue中环境配置的加载:
    • 探索第一步:
      • 探索第二步:
        • 探索第三步:
          • 探索第三步:
          • 为携带webpack的Node项目中增加环境配置
            • 准备webpack.config.js
              • 新增env-helper.js,我们一起来实现一下:
                • 必备依赖装一下
                • 解析环境变量文件
                • 符合前缀的环境变量对象
              • 升级webpack.config.js来演示环境变量读取
                • 增加演示插件和NODE_ENV配置
                • 在我们的webpack插件中使用环境变量
                • 查看输出结果
            • 结尾说明:
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档