npm软件包导出路径定义

时间:2019-03-08 20:28:57

标签: react-native npm import package export

我正在生成第一组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();

感谢您的协助。谢谢。

1 个答案:

答案 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();

不确定这是否是最好的解决方案,但它似乎对我有用,我希望它对某人有帮助,如果有更好或更干净的解决方案,请发布它,我将乐意接受更好的答案,或更新我自己的答案。