为 ES 模块做 require.resolve

Dmi*_*kov 8 javascript es6-modules

我需要解析通过静态导入或类似函数的动态导入导入的ES 模块,其方式类似于node.js使用require.resolve()解析CJS 模块的方式。ES模块是否存在类似的东西?

例如,如果一个 Vue 包同时具有vue.runtime.common.jsvue.runtime.esm.js. 我需要获得vue.runtime.esm.js. 如果包裹没有,我想知道。

edw*_*win 17

您可以使用import.meta.resolve()

这是节点文档中的示例

(async () => {
  const dependencyAsset = await import.meta.resolve('component-lib/asset.js');
})();
Run Code Online (Sandbox Code Playgroud)

请注意,从节点开始,您需要传入--experimental-import-meta-resolve才能使其工作14.3.0

  • 今天仍然需要标志“--experimental-import-meta-resolve”(“v19.6.1”)。 (3认同)
  • 这需要一个带有 `{ "compilerOptions": { "module": "es2020" } }` 的 `tsconfig.json` ([via](/sf/ask/4930835381/ -meta-property-is-only-allowed-when-the-module-opti)) (2认同)

GOT*_*O 0 7

只要import.meta.resolve保持实验性,您就可以使用createRequire来取回require.resolveES 模块中的功能,例如

import { createRequire } from 'module';

const require = createRequire(import.meta.url);
const pathName = require.resolve('vue.runtime.esm.js');
Run Code Online (Sandbox Code Playgroud)

  • @MilaNautikus 这个答案实际上是针对 JavaScript 的,而不是针对 TypeScript 的。 (6认同)
  • 一个潜在的问题是它选择了 `package.json#exports["."].require` 而不是 `package.json#exports["."].import`,这可能是你想要的,也可能不是你想要的。 (2认同)