Я пытаюсь запустить две библиотеки в одном проекте: fetch-node, который является модулем ES, и Express, который представляет собой CommonJS. Проблема в том, что я должен импортировать fetch-node вот так:
import fetch from 'node-fetch';
Но Express требует, чтобы я импортировал его так:
const express = require('express')
Что невозможно с моей конфигурацией, package.json: "type": "module", и tsconfig.json:
"target": "es2016",
"lib": ["es2019"],
"module": "Node16",
"esModuleInterop": true,
Поэтому, когда я импортирую Express, как описано, я получаю эту ошибку:
const express = require('express');
^
ReferenceError: require is not defined in ES module scope, you can use import instead
This file is being treated as an ES module because it has a '.js' file extension and '/mnt/c/Users/Johannes/citygmlToGltf/package.json' contains "type": "module". To treat it as a CommonJS script, rename it to use the '.cjs' file extension.
at file:///mnt/c/Users/Johannes/citygmlToGltf/bin/app.js:15:17
at ModuleJob.run (node:internal/modules/esm/module_job:194:25)
Node.js v19.1.0
error Command failed with exit code 1.
В чем здесь хитрость? Могу ли я не использовать эти две библиотеки вместе в одном проекте?
Хм очень интересно! это правда - теперь это работает. странный. мне пришлось установить типизацию, хотя npm i --save-dev @types/express. Спасибо! но есть ли более общий ответ на мой вопрос - у меня проблема не только с экспрессом;)
Тогда не могли бы вы привести минимально воспроизводимый пример проблемы, которая у вас есть?
Проблема, с которой я столкнулся, возникла из файла tsconfig. Я должен был добавить:
"moduleResolution": "node",
Чтобы иметь возможность использовать как require(), так и динамический импорт, например import * from "asdf"
Express не требует использования require, если вы используете модули ES, вы можете import express from "express".