현재 상황

// packages/shared/utils/getUser.ts
export const getUser = async () => {
  console.log(process.env.TEST_VARIABLE)
  const cookie = await chrome.cookies.get({
    name: authToken,
    url: process.env.WEB_URL!,
  });
  if (!cookie) return;

  return JSON.parse(cookie.value) as UserResponse;
};

위와 같은 전역에서 공통으로 사용할 유틸 함수가 있다. 이 유틸함수는 localhost:3000같이 환경에 따라 다르게 설정해야하는 ‘환경변수’가 존재한다.

빌드 후 파일은 다음과 같다.

// packages/shared/dist/utils/getUser.js
export const getUser = () => __async(void 0, null, function* () {
  const cookie = yield chrome.cookies.get({
    name: authToken,
    url: process.env.WEB_URL!,
  });
  if (!cookie) return;
  return JSON.parse(cookie.value);
});

환경 변수가 그대로 값이 들어간 것이다.

콘솔에 출력하면 물론 undefined가 출력이 된다.

image.png

현재 빌드 방식 분석

  1. pnpm run dev입력 시, package.json의 script가 실행된다.

    // package.json
    "dev": "turbo ready && turbo watch dev --concurrency 20",
    
  2. 모노레포 내 ready스크립트가 실행된다.

    // packages/shared/package.json
    "ready": "node build.mjs",
    
  3. build.mjs가 실행된다.

    // packages/shared/build.mjs
    const buildOptions = {
      entryPoints: ['./index.ts', './lib/**/*.ts', './lib/**/*.tsx'],
      tsconfig: './tsconfig.json',
      bundle: false,
      target: 'es6',
      outdir: './dist',
      sourcemap: true,
    };
    
    await esbuild.build(buildOptions);
    

해결 방법 강구

  1. dotenv를 통해 빌드 과정에서 .env를 주입해주는 방법은 어떨까?

    import dotenv from 'dotenv';
    dotenv.config();
    
    export const getUser = async () => {
      console.log(process.env.TEST_VARIABLE);
      const cookie = await chrome.cookies.get({
        name: authToken,
        url: process.env.WEB_URL!,
      });
      if (!cookie) return;
    
      return JSON.parse(cookie.value) as UserResponse;
    };
    
    

    여전히 나오지 않는다.

    esbuild의 build과정에서 제거가 된 것인 듯하다.

  2. 구글링. keyword : esbuild + environment variable