es6-modules - Kan TypeScript zowel ESM- als CJS-afhankelijkheden importeren?
Ik schrijf een TypeScript-toepassing die afhankelijkheden gebruikt die met NPM zijn geïnstalleerd:
- sommige van deze afhankelijkheden exporteren via CJS
- sommige van deze afhankelijkheden exporteren via ESM
Is er een tsconfig.json-configuratie die me zou laten alle deze afhankelijkheden transparant te gebruiken?
Antwoord #1
Ja, dat kan!
Bijvoorbeeld, dit is een nieuw ES Module-project met een ESM-afhankelijkheid (chalk) en een common.js-afhankelijkheid (aes-js):
package.json:
{
"type": "module",
"private": true,
"scripts": {
"build": "tsc",
"start": "yarn build && node dist/index.js"
},
"license": "ISC",
"devDependencies": {
"@types/aes-js": "^3.1.1",
"typescript": "^4.8.4"
},
"dependencies": {
"aes-js": "^3.1.2",
"chalk": "^5.1.2"
}
}
index.ts:
import chalk from "chalk"
import aesjs from "aes-js"
console.log(chalk.blue(aesjs.utils.utf8.toBytes("this is a string")))
tsconfig.json
{
"compilerOptions": {
"target": "es2022",
"module": "es2022",
"esModuleInterop": true,
"moduleResolution": "node",
"forceConsistentCasingInFileNames": true,
"strict": true,
"skipLibCheck": true,
"outDir": "dist"
}
}
Uitleg: esModuleInterop is je vriend. Het zorgt ervoor dat module.exports = wordt omgezet in een standaardexport (CommonJS -> ES6) en omgekeerd, waardoor standaardexports hetzelfde zijn als module.exports = (ES6 -> CommonJS)
