[英]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.