esbuild에서 CJS로 import을 하고 싶지만 ESM으로 import을 받을 때 플러그인입니다

6251 단어 JavaScriptesbuildtech
import 글을 쓰면 esbuild는 ESM으로 해당 포장을 읽는다.
뭐랄까, import의 포장을 Condiional Exports로 이렇게 쓴 경우./foo.mjs에 묶는다.
package.json
{
  "exports": {
    "import": "./foo.mjs",
    "require": "./bar.js"
  }
}
기본적으로 이상적인 행동이지만 상황에 따라 잘 묶이지 않을 수도 있다.
예를 들어 foo.mjs는 이런 느낌일 때다.실제 포장의 실상bar.js은 있지만 사용createRequirefoo.mjs이 ESM의 입처럼 느껴진다.
foo.mjs
imprt module from "node:module";

const require = module.createRequire(import.meta.url);

const bar = require("./bar.js");

export { bar };
esbuild로 묶으면 imoport.meta.url가 빈 대상이 되고, 그것createRequire을 해결해도 읽은 모듈은 묶이지 않는다.
따라서 지정된 모듈을 ESM 대신 CJS로 읽는 플러그인이 있으면 편리할 수 있습니다.require의 모듈 해결 알고리즘을 곱하기 때문에 CJS를 읽으러 간다.
import path from 'node:path';
import module from 'node:module';

const require = module.createRequire(import.meta.url);

/**
 * @param {Array<string>} specifiers
 * @returns {import('esbuild').Plugin}
 */
function resolveCjsPlugin(specifiers) {
  const filter = new RegExp(specifiers.join('|'));
  return {
    name: 'resolveCjs',
    setup(build) {
      build.onResolve({ filter }, (args) => {
        return {
          path: path.join(require.resolve(args.path)),
        };
      });
    },
  };
}

export default resolveCjsPlugin;
사실 이런 거 하기 싫어...

좋은 웹페이지 즐겨찾기