package.json配置导致ts包无法识别

2022年7月15日 ... ☕️ 2 min read

最近在给monorepo的项目,添加typeScript支持,由于本地分了很多独立的pacakge,所以每个包都有独立的配置。今天遇到一个报错

Could not find a declaration file for module '@some-module'.

查了一下这个包是在本地的,有独立的tsconfig.jsonpackage.json配置。

tsconfig.json配置

{
  "extends": "../../tsconfig",
  "compilerOptions": {
    "outDir": "typings",
    "baseUrl": "./",
    "allowJs": true
  },
  "include": ["lib/**/*", "typings/**/*"]

package.json配置

{
  "name": "@some-module",
  "version": "0.1.1",
  "description": "some description",
  "author": "",
  "homepage": "",
  "license": "ISC",
  "main": "lib/index.js",
  "module": "dist/module.mjs",
  "source": "lib/index.js",
  "types": "typings/index.d.ts",
  "exports": {
    "node": "./dist/module.mjs",
    "default": "./lib/index.js"
  },
  "engines": {
    "node": ">=14"
  },
	"scripts": {},
	"dependencies": {},
	"devDependencies": {}
}

看起来并没有什么异常。但是在其他地方引入的时候就是找不到包,报开头的问题。通过警告一番查找(挨个注释),发现是package.jsonexports的问题,删掉就可以了。

下面是一些解释

"exports"字段和 "main" 类似,优先级更高,它既可以定义包的主入口,又封闭了包,防止其他未被定义的内容被访问。这种封闭允许模块作者为他们的包定义公共接口。

exports中使用“条件导出”可以为每个环境定义不同的入口,包括包是通过require或者import引用。

例如,一个项目如果之前导出了mainlibfeaturepackage.json,那么 package.exports 可以使用如下写法:

{
  "name": "my-mod",
  "exports": {
    ".": "./lib/index.js",
    "./lib": "./lib/index.js",
    "./lib/index": "./lib/index.js",
    "./lib/index.js": "./lib/index.js",
    "./feature": "./feature/index.js",
    "./feature/index.js": "./feature/index.js",
    "./package.json": "./package.json"
  }
}

另外,万不得已的时候,可以通过

"./*": "./*"

来导出整个包的内容,此时封闭就不起作用了。此时和直接删除exports也没啥区别。

参考:https://juejin.cn/post/6972006652631318564

#typescript

SideEffect is a blog for front-end web development.
Code by Axiu / rss