我有一个库,其用途如下
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的建议,我看到以下错误:
3条答案
按热度按时间xxls0lw81#
当您使用ECMAScript模块时,请参考有关包入口点的node.js文档:
在包的package.json文件中,有两个字段可以定义包的入口点:“main”和“exports”。所有版本的Node.js都支持“main”字段,但其功能有限:它只定义包的主入口点。
“exports”字段提供了“main”的替代方法,其中可以定义包的主入口点,同时封装包,防止除“exports”中定义的入口点之外的任何其他入口点。这种封装允许模块作者为他们的包定义公共接口。
因此,在package.json中,可以如下定义
exports
:sxpgvts32#
使用
exports
字段是一种可接受的方法,但不是唯一的方法--正如您所发现的,Typescript目前不支持这种方法。看一下
@angular/material
包,它的工作原理与您所想的类似,在@angular/material/package.json
中,有一个module
字段指向一个空JS文件,还有一个typings
字段指向一个空的.d.ts
文件(间接地)到MatButton
的实现(和一堆其他东西)。当你import {MatButton} from "@angular/material/button"
时,它解析这个包文件,查看它的module
和typings
字段,并使用它们分别解析运行时代码和导出的类型。你也可以这么做:
@me/core/package.json
将具有指向空文件的module
和typings
字段;@me/core/node/package.json
将指向节点特定的Foo
类的代码,@me/core/web/package.json
将指向浏览器版本的Foo
的代码。7dl7o3gd3#
Try to add the following code to the
tsconfig.json
:And then you can import the module like this:
If you Don't Want to Touch the
tsconfig.json
you can use the following for the import:References