【问题标题】:Can't import d3-geo package into Node.js TypeScript project无法将 d3-geo 包导入 Node.js TypeScript 项目
【发布时间】:2022-01-23 05:17:38
【问题描述】:

我正在尝试创建代码来测试是否可以在各种 GeoJSON 功能中找到特定的纬度/经度坐标。

如果我这样做:

import d3 from 'd3-geo'; // or: import * as d3 from 'd3-geo' // makes no difference

console.log(d3.geoContains);

...运行使用:node --require ts-node/register app.ts

...我收到此错误:

错误 [ERR_REQUIRE_ESM]:不支持来自 /Users/kshetline/temp/geo/app.ts 的 ES 模块 /Users/kshetline/temp/geo/node_modules/d3-geo/src/index.js 的 require()。 而是将 /Users/kshetline/temp/geo/app.ts 中 index.js 的 require 更改为在所有 CommonJS 模块中都可用的动态 import()。 在对象。 (/Users/kshetline/temp/geo/app.ts:6:34) 在 Module.m._compile (/Users/kshetline/temp/geo/node_modules/ts-node/dist/index.js:735:29) 在 Object.require.extensions。 [as .ts] (/Users/kshetline/temp/geo/node_modules/ts-node/dist/index.js:737:16) { 代码:'ERR_REQUIRE_ESM' }

所以我尝试按照错误消息的建议使用import()

import('d3-geo').then(d3 => console.log(d3.geoContains));

...这只是让我得到一个更短但类似的错误消息:

错误 [ERR_REQUIRE_ESM]:不支持来自 /Users/kshetline/temp/geo/app2.ts 的 ES 模块 /Users/kshetline/temp/geo/node_modules/d3-geo/src/index.js 的 require()。 而是将 /Users/kshetline/temp/geo/app2.ts 中 index.js 的 require 更改为在所有 CommonJS 模块中都可用的动态 import()。 在 /Users/kshetline/temp/geo/app2.ts:21:43 { 代码:'ERR_REQUIRE_ESM' }

我在tsconfig.json 中尝试了不同的模块类型和目标,但这并没有帮助。这是我为演示此问题而创建的精简测试项目中的tsconfig.json

{
  "compilerOptions": {
    "target": "es2021",
    "module": "commonjs",
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "strict": true,
    "skipLibCheck": true
  }
}

这是package.json

{
  "name": "geo",
  "version": "1.0.0",
  "description": "",
  "main": "app.js",
  "author": "",
  "license": "MIT",
  "dependencies": {
    "d3-geo": "^3.0.1"
  },
  "devDependencies": {
    "@types/d3-geo": "^3.0.2",
    "ts-node": "^10.4.0",
    "typescript": "^4.5.5"
  }
}

我从来没有遇到过让我在尝试进行简单导入时遇到这么麻烦的 npm 库。我可以让它在纯 JavaScript 中运行,但即便如此,它也必须是动态的 import(),这是一种不得不使用库的烦人方式。

任何想法如何使这项工作更好?

【问题讨论】:

    标签: javascript node.js typescript d3-geo


    【解决方案1】:

    我还没有一个令人满意的答案,但至少我有一个愚蠢的解决方法。我在我的tsconfig.json 文件中设置了"allowJs": true,添加了一个名为module-bridge.cjs 的JavaScript 文件,如下所示:

    module.exports = {
      d3_geo: async function () { return import('d3-geo'); }
    };
    

    然后我把它放在我的 TypeScript 代码中:

    import { d3_geo } from './module-bridge.cjs';
    
    // ...
    
    const geoContains = (await d3_geo()).geoContains;
    

    您可能认为我可以直接在我的 TypeScript 代码中使用 import('d3-geo'),但这会产生编译错误。

    【讨论】:

    • 这太可怕了,而且效果很好。谢谢。 ?
    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 2016-10-30
    • 1970-01-01
    • 2021-01-16
    • 2020-11-15
    • 1970-01-01
    • 2014-04-06
    • 2021-01-18
    相关资源
    最近更新 更多