מודולי ES6 - האם TypeScript יכול לייבא תלויות גם מ-ESM וגם מ-CJS?


אני כותב יישום TypeScript שמשתמש בתלויות מותקנות עם NPM:

  • חלק מהתלויות האלה מייצאות דרך CJS
  • חלק מהתלויות האלה מייצאות דרך ESM

האם יש קובץ קונפיגורציה tsconfig.json שיאפשר לי להשתמש בכל התלויות האלה בצורה שקופה?

תשובה #1

כן, זה יכול!

לדוגמה, זהו פרויקט ES Module חדש עם תלות ESM (chalk) ותלות common.js (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"
  }
}

הסבר: esModuleInterop הוא החבר שלך. זה מוודא ש-module.exports = יהפוך לייצוא ברירת מחדל (CommonJS -> ES6) ולהפך, ומוודא שייצואי ברירת המחדל זהים ל-module.exports = (ES6 -> CommonJS)