node.js - TS'yi CJS'den ES modüllerine importlara izin verecek şekilde nasıl yapılandırılır (node-fetch & Express)?


Tek bir projede iki kütüphaneyi çalıştırmaya çalışıyorum: ES modülü olan fetch-node ve CommonJS olan Express. Sorun şu ki, fetch-node'u şu şekilde içe aktarmam gerekiyor:

import fetch from 'node-fetch';

ama Express bunu şu şekilde ithal etmemi gerektiriyor:

const express = require('express')

bu benim yapılandırmamla mümkün değil, package.json: "type": "module", ve tsconfig.json:

"target": "es2016",   
"lib": ["es2019"],    
"module": "Node16",    
"esModuleInterop": true,

Yani Express'i tarif edildiği gibi içe aktardığımda, bu hatayı alıyorum:

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.

Buradaki püf nokta nedir? Bu iki kütüphaneyi bir projede birlikte kullanamaz mıyım?

Cevap #1

Karşılaştığım sorun gerçekten tsconfig'den geliyordu. Şunu eklemem gerekiyordu:

"moduleResolution": "node", 

hem require() hem de import * from "asdf" gibi dinamik import kullanabilmek