package.json配置导致ts包无法识别
2022年7月15日 • ... • ☕️ 2 min read
最近在给monorepo
的项目,添加typeScript支持,由于本地分了很多独立的pacakge,所以每个包都有独立的配置。今天遇到一个报错
Could not find a declaration file for module '@some-module'.
查了一下这个包是在本地的,有独立的tsconfig.json
和package.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.json
里exports
的问题,删掉就可以了。
下面是一些解释
"exports"
字段和"main"
类似,优先级更高,它既可以定义包的主入口,又封闭了包,防止其他未被定义的内容被访问。这种封闭允许模块作者为他们的包定义公共接口。
exports中使用“条件导出”可以为每个环境定义不同的入口,包括包是通过require或者import引用。
例如,一个项目如果之前导出了main
、lib
、feature
和 package.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也没啥区别。