node.js - package.json არ ითვალისწინებს exports თვისებას esm და cjs npm პაკეტებისთვის


მე მექნება სირთულეები ჩემს npm ბიბლიოთეკაზე, რომ მხარდაჭერა ჰქონდეს წვდომის ქვეშ არსებულ იმპორტებს/მოთხოვნებს package.json-ის exports ველის მეშვეობით. კონტექსტისთვის, package.json მხარს უჭერს ველს „exports“, რომელიც საშუალებას აძლევს პირობითად გამოავლინოთ ფაილები დროის შესრულების მიხედვით (მაგალითად, commonjs ან ecmascript).

როდესაც ჩემს TypeScript პროექტში npm ბიბლიოთეკას ვიმპორტირებ, მივიღე შემდეგი შეცდომა:

// How I import
import logger from '@myorg/custom-logger/src/logger';

// The error I get in vscode
Cannot find module '@myorg/custom-logger/src/logger' or its corresponding type declarations.

tsc კომპილატორის შეცდომა:

TSError: ⨯ Unable to compile TypeScript:
src/config/winston.ts:1:20 - error TS2307: Cannot find module '@myorg/custom-logger/src/logger' or its corresponding type declarations.

custom-logger პაკეტი მოიცავს მხარდაჭერას commonjs და esm-ისათვის. ის შეიქმნა და განთავსდა npm-ზე შემდეგი სტრუქტურით:

esm/
--- src/
--- index.js
--- logger.js
--- index.d.ts
--- logger.d.ts
--- package.json which contains { "type": "module" } (also tried without this - same issue occurs) 
cjs/
--- src/
--- index.js
--- logger.js
--- index.d.ts
--- logger.d.ts
--- package.json which contains { "type": "commonjs" } (also tried without this - same issue occurs) 
package.json which contains (see below)

მთავარ package.json-ში @myorg/custom-logger პაკეტში შედის შემდეგი:

{
  "name": "@myorg/custom-logger",
  "version": "0.1.4",
  "dependencies": {
    "app-root-path": "^3.0.0",
    "winston": "^3.8.1"
  },
  "devDependencies": {
    "@types/app-root-path": "^1.2.4",
    "@types/winston": "^2.4.4"
  },
  "types": "./esm/src/index.d.ts",
  "typings": "./esm/src/index.d.ts",
  "module": "./esm/src/index.js",
  "main": "./cjs/src/index.js",
  "exports": {
    "./src/*": {
      "types": "./esm/src/*.d.ts",
      "import": "./esm/src/*.js",
      "require": "./cjs/src/*.js"
    },
    ".": {
      "types": "./esm/src/index.d.ts",
      "import": "./esm/src/index.js",
      "require": "./cjs/src/index.js"
    }
  }
}

საკითხები, რაც მე მაქვს, შემდეგია:

  • TypeScript და VSCode თითქოს არ პატივს სცემენ ექსპორტების ლოგიკას (ეს გამოიწვევს ზემოთ ნახულ შეცდომებს)

რაც მე ვცდილობ დავაღწიო, არის:

  • უძლევდეს ქვემინი გზებზე იმპორტის შესაძლებლობას, მაგალითად import mylib from '@myorg/custom-logger/src/logger'

მე ვიყენებ "typescript": "4.7.4", და ვიყენებ esm (ecmascript) ნატიურად node-ში.

პასუხი #1

სწორად რომ მუშაობდეს, მე მომიწია ჩემი tsconfig-ის „moduleResolution“ კონფიგურაციის განახლება.

აქ არის ჩემი ახალი კონფიგურაცია (შენიშნე, როგორ მაქვს დაწერილი "moduleResolution": "Node16"):

  • თქვენ ასევე შეგიძლიათ გამოიყენოთ NodeNext როგორც moduleResolution
{
  "compilerOptions": {
    "target": "ESNEXT",                  /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', or 'ESNEXT'. */
    "module": "ESNext",                /* Specify module code generation: 'none', commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
    "moduleResolution": "Node16",
    "outDir": "build/" /* Redirect output structure to the directory. */,
    /* Strict Type-Checking Options */
    "strict": true /* Enable all strict type-checking options. */,
    "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */,
    "rootDir": "./",
    "resolveJsonModule": true
  },
  "include": ["src/", "e2e"],
  "exclude": ["node_modules", "build", "logs", "db"],
  "resolveJsonModule": true,
  "esModuleInterop": true
}

მესმის, ადრე moduleResolution მნიშვნელობა იყო დაყენებული node-ზე. დამატებითი გამოძიების შემდეგ, node moduleResolution ვერ უჭერს მხარს package.json-ში მოცემულ "exports" ველს. აი შესანიშნავი პასუხი, რომელიც უფრო დეტალურად ხსნის ამას