繁体   English   中英

Package.json 具有多个入口点

[英]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会有指向空文件的moduletypings字段; @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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM