Yos*_*shi 6 javascript npm typescript package.json
这是我第一次尝试使用 TypeScript 创建 npm 包,并且遇到了一些麻烦,可能是因为我误解了文档中的某些内容。\n在撰写本文时,我正在使用 Node 16.16.0 和 npm 8.13.2这。
\n首先,我的项目结构如下所示。
\nsrc/\n\xe2\x94\x9c\xe2\x94\x80 module1/\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80 index.ts\n\xe2\x94\x9c\xe2\x94\x80 module2/\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80 index.ts\npackage.json\ntsconfig.json\nRun Code Online (Sandbox Code Playgroud)\ntsconfig.json
\n{\n "compilerOptions": {\n "target": "es2017",\n "module": "commonjs",\n "esModuleInterop": true,\n "declaration": true,\n "outDir": "./lib",\n "strict": true\n },\n "include": ["src"],\n "exclude": ["node_modules", "**/__tests__/*"]\n}\nRun Code Online (Sandbox Code Playgroud)\n包.json
\n{\n "name": "@owner/mypackage",\n "version": "v1.0.0",\n ...\n "files": [\n "lib/**/*"\n ],\n "type": "module",\n "exports": {\n "./module1": "./lib/module1/index.js",\n "./module2": "./lib/module2/index.js",\n "./package.json": "./package.json"\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n问题是,当发布模块时,它会生成以下结构:
\nlib/\n\xe2\x94\x9c\xe2\x94\x80 module1/\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80 index.js\n\xe2\x94\x9c\xe2\x94\x80 module2/\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80 index.js\npackage.json\nRun Code Online (Sandbox Code Playgroud)\n留给我以下导入结构:
\nimport {Foo} from "@owner/mypackage/lib/module1";\nRun Code Online (Sandbox Code Playgroud)\n而不是所需的:
\nimport {Foo} from "@owner/mypackage/module1";\nRun Code Online (Sandbox Code Playgroud)\n我怎样才能实现这种模式?而且,如果有的话,我可以改进它或遵循更好的做法吗?
\n就我个人而言,在我运行Typescript 4.7+ 的项目中,以下内容有效:您需要的是typesVersionsin 的属性package.json。(参见https://www.typescriptlang.org/docs/handbook/declaration-files/publishing.html#version-selection-with-typesversions)
我将从上面的文档中引用这句话作为相关内容:
好吧,如果 typesVersions 中的任何字段均未匹配,则 TypeScript 会回退到types 字段,因此此处 TypeScript 3.0 及更早版本将被重定向到 [...]/node_modules/package-name/index.d.ts。
这本质上意味着,如果typesVersions中未定义该字段package.json,types则使用该字段,但是types当 . 具有多个导出路径时,该字段对我们没有帮助exports。
希望这可以帮助!
{
"exports": {
"./module1": "./lib/module1/index.js",
"./module2": "./lib/module2/index.js",
},
"typesVersions": {
"*": {
"module1": ["lib/module1/index.js"],
"module2": ["lib/module2/index.js"]
}
}
}
Run Code Online (Sandbox Code Playgroud)