我正在生成第一组npm软件包以支持本机环境。我希望以这样一种方式来配置软件包:内容是内在组织的,并且可以通过客户端上的import语句轻松区分。
给出npm包中定义的4个函数定义(包名称:super-cool-animals):
snakes.ts
export function Boa() {}
export function Anaconda() {}
birds.ts
export function Pigeon() {}
export function Hawk() {}
我希望该库的使用者能够安装该库:
npm install --save super-cool-animals
然后将其导入为这样:
import { Boa, Anaconda } from 'super-cool-animals/snakes'
import { Pigeon, Hawk } from 'super-cool-animals/birds'
Pigeon(); // direct access to the function!
我很难确定实现此目标的合适机制,并且我相信我已经在某些环境(例如角度)中看到了这种机制
我已经看到一些建议,例如,通过使用 index.ts 文件,您可以将它们组合为一个变量:
snakes / index.ts
export * from './snakes.ts'
birds / index.ts
export * from './birds.ts
./ index.ts
import * as Birds from './birds'
import * as Snakes from './snakes'
export { Birds, Snakes}
但是最终结果很难看,现在您必须引用容器才能使用该功能:
该库的使用者:
import { Birds } from 'super-cool-animals';
Birds.Pigeon();
感谢您的协助。谢谢。
答案 0 :(得分:2)
结果很简单,以我们的示例假设为例,您希望按动物类型划分每个类别,但只希望安装一个软件包。
> super-cool-animals
> snakes
anaconda.js
boa.js
package.json
index.js
> birds
hawk.js
pigeon.js
package.json
index.js
package.json
readme.md
index.js
每个索引文件仅在该级别导出感兴趣的文件或功能
index.js
import * as Birds from './birds'
import * as Snakes from './snakes'
export { Birds, Snakes}
snakes / index.js
export * from './anaconda.js'
export * from './boa.js'
birds / index.js
export * from './hawk.js'
export * from './pigeon.js'
现在进入 package.json 文件:顶级软件包文件描述了任何依赖关系,作者,要在导入中使用的库的名称等。特定于动物的 package.json 文件仅描述要导入的库的名称。
package.json
{
"name": "super-cool-animals",
"version": "1.0.0",
"description": "Super cool animal library",
"main": "index.js",
"author": "Kevin Quinn <glorifundel@gmail.com>",
"license": "MIT",
"dependencies": {},
"peerDependencies": {},
"devDependencies": {}
}
在较低级别(birds and snakes文件夹)中找到的软件包文件只是在描述可用的相对路径。
snakes / package.json
{
"name": "super-cool-animals/snakes",
"main": "index.js"
}
birds / package.json
{
"name": "super-cool-animals/birds",
"main": "index.js"
}
已定义了所有内容,现在您可以安装npm软件包,并且客户端可以很好地定义其导入:
import { Hawk } from 'super-cool-animals/birds';
const SomeBird = Hawk();
不确定这是否是最好的解决方案,但它似乎对我有用,我希望它对某人有帮助,如果有更好或更干净的解决方案,请发布它,我将乐意接受更好的答案,或更新我自己的答案。