import.meta.esbuild로 URL을 CJS로 변환하기

8411 단어 JavaScriptesbuildtech
메모지
ES2020의 기능은 import.meta입니다.import.meta는 모듈의 메타데이터 데이터를 포함하는 대상이다.브라우저와 노드.jsimport.meta.url의 속성에서 자란다.
이것은 평가된 모듈을 나타내는 파일의 URL 속성입니다.
Node.js에서는 ESM 환경import.meta.url이나 createRequire에 해당하는 물건을 얻는 데 자주 사용된다.
import module from "node:module";
const require = module.createRequire(import.meta.url);
import path from "node:path";
import url from "node:url";

const __filename = url.fileURLToPath(import.meta.url);
const __dirname = path.dir(__filename);
이런 느낌__filename의 프로그램을 사용해서 esbuild를 사용하여 CJS로 전환하면 사실상 빈 대상이다.
변환 전 코드는 여기 있습니다.만__dirname.
console.log(import.meta.url)
변환된 코드는 여기에 있습니다.import.meta.urlimport.meta.url,console.logimport.meta이다.
var import_meta = {};
console.log(import_meta.url);
이러면 곤란하니까 어떻게 좀 해봐.
해결 방법 중 하나로는 {}{}가 있다.
이런 느낌으로 CJS 환경에서 재현url 코드를 준비했다.
import-meta-url.js
export var import_meta_url = require("url").pathToFileURL(__filename);
에서 esbuildconsole.log에서 defineinject로 바꾸고, import.meta.url에서 읽기define를 읽으며, 변수import.meta.urlimport_meta_url에 해당하는 변수로 바꾸었다.
import { build } from "esbuild";
import path from "path";

/** @type {import('esbuild').BuildOptions} */
const options = {
  entryPoints: ["./src/index.js"],
  minify: true,
  bundle: true,
  outfile: "./dist/index.cjs",
  format: "cjs",
  define: {
    "import.meta.url": "import_meta_url",
  },
  inject: [
    // このへんのパスは各々いい感じで
    path.join(process.cwd(), "import-meta-url.js"),
  ],
};

build(options).catch((err) => {
  process.stderr.write(err.stderr);
  process.exit(1);
});
이러면 괜찮은 것 같아.

좋은 웹페이지 즐겨찾기