NodeJS 具有多个入口点的Package.json

bqujaahr  于 2022-12-03  发布在  Node.js
关注(0)|答案(3)|浏览(433)

我有一个库,其用途如下

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项目提供一个import,而为web项目提供一个import。

import { Foo } from '@me/core/nodejs';

如果你在做一个网络项目

import { Foo } from '@me/core/web';

我的理解是,@me/core/nodejs@me/core/web都将是不同的NPM包,这不是我想要的,我希望它是在1 NPM包。
我尝试将库的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的建议,我看到以下错误:

xxls0lw8

xxls0lw81#

当您使用ECMAScript模块时,请参考有关包入口点的node.js文档:
在包的package.json文件中,有两个字段可以定义包的入口点:“main”和“exports”。所有版本的Node.js都支持“main”字段,但其功能有限:它只定义包的主入口点。
“exports”字段提供了“main”的替代方法,其中可以定义包的主入口点,同时封装包,防止除“exports”中定义的入口点之外的任何其他入口点。这种封装允许模块作者为他们的包定义公共接口。
因此,在package.json中,可以如下定义exports

"main": "dist/index.js",
  "exports": {
    ".": "dist/index.js",
    "./nodejs": "dist/nodejs",
    "./web": "dist/web",
  }
sxpgvts3

sxpgvts32#

使用exports字段是一种可接受的方法,但不是唯一的方法--正如您所发现的,Typescript目前不支持这种方法。
看一下@angular/material包,它的工作原理与您所想的类似,在@angular/material/package.json中,有一个module字段指向一个空JS文件,还有一个typings字段指向一个空的.d.ts文件(间接地)到MatButton的实现(和一堆其他东西)。当你import {MatButton} from "@angular/material/button"时,它解析这个包文件,查看它的moduletypings字段,并使用它们分别解析运行时代码和导出的类型。
你也可以这么做:@me/core/package.json将具有指向空文件的moduletypings字段; @me/core/node/package.json将指向节点特定的Foo类的代码,@me/core/web/package.json将指向浏览器版本的Foo的代码。

7dl7o3gd

7dl7o3gd3#

Try to add the following code to the tsconfig.json :

{
  "compilerOptions": {
    "moduleResolution": "NodeNext"
  }
}

And then you can import the module like this:

import { Foo } from '@me/core/nodejs';

If you Don't Want to Touch the tsconfig.json you can use the following for the import:

import { Foo } from '@me/core/dist/nodejs';

References

相关问题