[英]Package.json with multiple entrypoints
我有一个使用如下的库
import { Foo } from '@me/core';
const foo = new Foo();
该库的package.json
看起来像
"name": "@me/core",
"version": "1.0.0",
"main": "dist/index.js",
"types": "dist/index.d.ts",
"license": "MIT",
...
使用dist/index.js
作为入口点。 但是,现在我将只为 NodeJs 项目提供一个导入,为 web 项目提供一个导入。 理想情况下,我会为 NodeJs 准备这样的东西
import { Foo } from '@me/core/nodejs';
如果你正在做一个网络项目,你可以做
import { Foo } from '@me/core/web';
我的理解是, @me/core/nodejs
和@me/core/web
这样都会有不同的 NPM 包,这不是我想要的。 我希望它在 1 npm package 中。
我试图改变图书馆的 index.ts 文件,从
export * from './foo';
进入
import * as nodejs from './nodejs';
import * as web from './web';
export { web, nodejs };
这确实有效,但我现在必须使用它(在 NODEJS 项目中),如下所示
import { nodejs } from '@me/core';
const foo = new nodejs.Foo();
有没有办法导入这个,这样我就不需要每次都需要nodejs
了?
如您所见,我不太确定我应该在这里做什么,所以我们将不胜感激!
更新:根据@Klaycon 的建议,我看到以下错误:
当您使用 ECMAScript 模块时,请参阅package 入口点上的 node.js 文档:
在包的 package.json 文件中,两个字段可以定义 package 的入口点:“main”和“exports”。 Node.js 的所有版本都支持“main”字段,但它的功能是有限的:它只定义了 package 的主入口点。
“exports”字段提供了“main”的替代方案,其中可以定义 package 主入口点,同时还封装 package,防止除“exports”中定义的入口点之外的任何其他入口点。 这种封装允许模块作者为其 package 定义一个公共接口。
因此,在您的 package.json 中,您可以像这样定义exports
:
"main": "dist/index.js",
"exports": {
".": "dist/index.js",
"./nodejs": "dist/nodejs",
"./web": "dist/web",
}
使用exports
字段的公认答案是一种方法,但不是唯一方法 - 正如您所发现的,Typescript 目前不支持。
查看@angular/material
package,它的工作原理与您的想法相似。 在@angular/material/package.json
中,您有一个指向空 JS 文件的module
字段和一个指向空typings
文件的.d.ts
字段。 但是你也有@angular/material/button/package.json
它(间接地)指向MatButton
的实现(以及一堆其他的东西)。 当您import {MatButton} from "@angular/material/button"
,它会解析此typings
文件,查看其module
和类型字段,并使用它们分别解析运行时代码和导出类型。
你可以做同样的事情: @me/core/package.json
会有指向空文件的module
和typings
字段; @me/core/node/package.json
将指向您的特定于节点的Foo
Foo
的代码, @me/core/web/package.json
将指向您的浏览器版本的代码。
尝试将以下代码添加到tsconfig.json
:
{
"compilerOptions": {
"moduleResolution": "NodeNext"
}
}
然后你可以像这样导入模块:
import { Foo } from '@me/core/nodejs';
如果您不想触摸tsconfig.json
,您可以使用以下内容进行导入:
import { Foo } from '@me/core/dist/nodejs';
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.