esbuild에서 CJS로 import을 하고 싶지만 ESM으로 import을 받을 때 플러그인입니다
6251 단어 JavaScriptesbuildtech
뭐랄까, import의 포장을 Condiional Exports로 이렇게 쓴 경우
./foo.mjs
에 묶는다.package.json
{
"exports": {
"import": "./foo.mjs",
"require": "./bar.js"
}
}
기본적으로 이상적인 행동이지만 상황에 따라 잘 묶이지 않을 수도 있다.예를 들어
foo.mjs
는 이런 느낌일 때다.실제 포장의 실상bar.js
은 있지만 사용createRequire
foo.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;
사실 이런 거 하기 싫어...
Reference
이 문제에 관하여(esbuild에서 CJS로 import을 하고 싶지만 ESM으로 import을 받을 때 플러그인입니다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/sosukesuzuki/articles/d8220ba2d869f0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)