簡體   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