发布带有子模块的 typescript NPM 包:找不到模块 'nizar-npm-publish-test/mult/multiply' 或其相应的类型声明

问题描述 投票:0回答:1

我正在尝试将包含 CommonJs 和 esm 的 TS 包发布到 NPM,但我遇到了 2 个问题。 1-我似乎无法将 esm 文件构建为 .mjs 文件,作为解决方法,我在将文件发布到 npm 之前手动编辑文件扩展名,但我不确定这是否是正确的做法,所以关于这个问题的所有见解都会很棒。 2-当尝试从该包导入任何内容时,我的主文件没有任何问题,但如果我尝试从任何其他文件导入,我会收到此错误:

Cannot find module 'nizar-npm-publish-test/mult/multiply' or its corresponding type declarations.ts(2307)

这是我的TS包的结构:

  • root/index.ts // 有默认导出的添加功能
  • root/substract.ts // 有默认导出的减法函数
  • 根/package.json
  • 根/tsconfig.json
  • root/tsconfig.types.prod.json
  • root/mult/multiply.ts // 具有默认导出的乘法函数
  • root/mult/divide.ts // 有默认导出的除法函数 这是我的构建结构:
  • build/@types/index.d.ts
  • build/@types/substract.d.ts
  • build/@types/mult/multiply.d.ts
  • build/@types/mult/divide.d.ts
  • 构建/cjs/index.js
  • build/cjs/substract.js
  • build/cjs/mult/multiply.js
  • build/cjs/mult/divide.js
  • 构建/esm/index.mjs
  • 构建/esm/substract.mjs
  • 构建/esm/mult/multiply.mjs
  • build/esm/mult/divide.mjs

这就是我用于构建的内容: 包.json:

 "main": "index.js",
  "files": [
    "build/cjs",
    "build/esm",
    "build/@types"
  ],
  "types": "build/@types",
  "exports": {
    ".": {
      "import": "./build/esm/index.mjs",
      "require": "./build/cjs/index.js"
    },
    "./*": {
      "import": "./build/esm/*.mjs",
      "require": "./build/cjs/*.js"
    },
    "./mult/*": {
      "import": "./build/esm/mult/*.mjs",
      "require": "./build/cjs/mult/*.js"
    },
    "./types":"./build/@types/index.d.ts",
    "./types/*": "./build/@types/*.d.ts",
    "./types/mult/*":"./build/@types/*.d.ts"
  },
  "scripts": {
    "clean": "rimraf build",
    "build": "yarn clean && yarn build:esm && yarn build:cjs && yarn build:types",
    "build:esm": "tsc -p tsconfig.prod.json --module ES2022 --outDir build/esm",
    "build:cjs": "tsc -p tsconfig.prod.json --module commonjs --outDir build/cjs",
    "build:types": "tsc --p tsconfig.types.prod.json -emitDeclarationOnly",
    "test": "echo \"Error: no test specified\" && exit 1",
    "launch": "npx ts-node src/index"
  },

tsconfig.json:

{
  "$schema": "https://json.schemastore.org/tsconfig",
  "display": "Default",
  "compilerOptions": {
    "allowJs": true,
    "skipLibCheck": true,
    "strict": true,
    "forceConsistentCasingInFileNames": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "resolveJsonModule": true,
    "isolatedModules": true,
    "incremental": true,
    "rootDir": ".",
    "outDir": "build",
    "sourceMap": false,
    "target": "ESNext",
    "noEmit": false,
    "module": "CommonJS",
    "moduleResolution": "node",
    "declaration": true
  },
  "ts-node": {
    "require": ["tsconfig-paths/register"]
  },
  "include": ["."],
  "exclude": ["build", "node_modules", ".turbo", "coverage", "dist"],
  "moduleResolution": ["node_modules", "node"]
}

还有 tsconfig.types.prod.json:

{
  "extends": "./tsconfig.json",
  "compilerOptions": {
    "composite": false,
    "outDir" : "build/@types"
  },
  "exclude": [
    "build",
    "coverage",
    "node_modules",
    ".turbo",
    "coverage",
    "dist",
    "**/__test__",
    "__test__",
    "__mocks__",
    "**/__mocks__",
    "*.config.js",
    "*.config.ts",
    ".env",
    "src/**/*.test.ts"
  ]
}

这是导入: imports

还有我一开始提到的 ts 错误: ts error on import

PS:它们(

add
multiply
功能)都可以工作,我只需要解决TS错误。

typescript package.json es6-modules tsconfig npm-publish
1个回答
0
投票

更新: 在我找到的解决方法中,我不再需要

.mjs
部分,但是,它对于解决方案来说非常丑陋,任何改进它的帮助都会很棒:

首先我将导出更新为:

"main": "build/cjs/index.js",
  "module": "build/esm/index.js",
  "types": "build/esm/index.d.ts",
  "files": [
    "build/cjs",
    "build/esm"
  ],
  "exports": {
    ".": {
      "import": "./build/esm/index.js",
      "require": "./build/cjs/index.js",
      "types": "./build/esm/index.d.ts"
    },
    "./*": {
      "import": "./build/esm/*.js",
      "require": "./build/cjs/*.js",
      "types": "./build/esm/*.d.ts"
    }

最终创建了这棵新树:

  • 减去/package.json
  • mult/multiply/package.json
  • 多/除/package.json

每个新的 package.json 文件现在都包含与此类似的对象。

{
  "name": "substract",
  "description": "This way it's recognizable by the TypeScript compiler",
  "main": "../build/cjs/substract.js",
  "module": "../build/esm/substract.js",
  "types": "../build/esm/substract.d.ts"
}

现在的问题是,如果我有很多稍后要导入的文件,这将导致我创建尽可能多的 package.json 文件。

© www.soinside.com 2019 - 2024. All rights reserved.