>  기사  >  웹 프론트엔드  >  확장성을 지원하도록 Node 프로젝트 환경을 구성하는 방법은 무엇입니까?

확장성을 지원하도록 Node 프로젝트 환경을 구성하는 방법은 무엇입니까?

青灯夜游
青灯夜游앞으로
2021-09-29 10:05:032801검색

이 글에서는 Node 프로젝트가 확장 가능한 방법을 지원하도록 구성 환경을 소개하겠습니다. 모든 분들께 도움이 되길 바랍니다!

확장성을 지원하도록 Node 프로젝트 환경을 구성하는 방법은 무엇입니까?

환경 변수 전환을 포함하지 않는 Node 프로젝트 개발이 거의 없기 때문에 프런트 엔드 프로젝트 개발을 할 때 항상 직면하게 됩니다. 예를 들어 Vue 프로젝트에서는 .env.xxx.xxx를 구성하고 환경 변수 구성이 필요합니다. VUE_APP_로 시작해야 합니다. 이유는 무엇입니까? , Vue 프로젝트의 환경 변수가 어떻게 로드되고 파싱되는지 함께 살펴보고 이를 Node 프로젝트에 이식하겠습니다. [추천학습: "nodejs tutorialVUE_APP_开头,Why?,我们就一起来探索一下Vue项目的环境变量是怎么加载并解析的,我们再移植到Node项目中。【推荐学习:《nodejs 教程》】

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

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

探索第一步:

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

확장성을 지원하도록 Node 프로젝트 환경을 구성하는 방법은 무엇입니까?

探索第二步:

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

확장성을 지원하도록 Node 프로젝트 환경을 구성하는 방법은 무엇입니까?

探索第三步:

  • Service中我们找到了加载环境配置的关键函数,其中的两个path分别指:.env.mode.env.mode.local,也就是我们的环境变量文件可以支持带.local也可以不带。

  • 思考load两次的作用?

확장성을 지원하도록 Node 프로젝트 환경을 구성하는 방법은 무엇입니까?

探索第三步:

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

  • 思考BASE_URL的设置?

확장성을 지원하도록 Node 프로젝트 환경을 구성하는 방법은 무엇입니까?

확장성을 지원하도록 Node 프로젝트 환경을 구성하는 방법은 무엇입니까?

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

准备webpack项目环境

准备webpack.config.js

확장성을 지원하도록 Node 프로젝트 환경을 구성하는 방법은 무엇입니까?

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

必备依赖装一下

npm install dotenv --save
npm install dotenv-expand --save

解析环境变量文件

/**
 * 解析环境变量文件
 * @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插件中。

/**
 * 获取符合前缀规则的环境变量对象
 */
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配置

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插件中使用环境变量

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;

查看输出结果

확장성을 지원하도록 Node 프로젝트 환경을 구성하는 방법은 무엇입니까?

结尾说明:

위 내용은 확장성을 지원하도록 Node 프로젝트 환경을 구성하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.cn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제