# js-native
**Repository Path**: mirrors_ecomfe/js-native
## Basic Information
- **Project Name**: js-native
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-08-08
- **Last Updated**: 2026-01-24
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
jsNative
---------
[](https://www.npmjs.com/package/js-native)
[](https://github.com/ecomfe/js-native/blob/master/LICENSE)
[](https://codecov.io/gh/ecomfe/js-native)
[](https://circleci.com/gh/ecomfe/js-native)
jsNative 是一个 JavaScript 与 Native 通信管理的库。其基于 [通信接口描述](doc/description.md),生成可调用 API。
- [了解为什么设计成这样](doc/design.md)
- [实现的一些约束](doc/spec.md)
- [通信接口描述](doc/description.md)
## 引入
### 下载
`NPM:`
```
$ npm i js-native --save
```
`保存:`
[请点击右键另存为](https://unpkg.com/js-native@latest)
### 引用
```html
```
## 使用
通过接口描述可以直接调用。
```js
let apiList = jsNative.invokeAPI({
"invoke": "method.json",
"name": "na.getAPIs",
"method": "_na.getAPIs"
});
```
jsNative 是一个默认的 api 容器对象,通过 `add` 方法可以添加接口描述。
```js
jsNative.add({
"invoke": "method.json",
"name": "net.request",
"method": "_naNet.request",
"args": [
{"name": "url", "value": "string"},
{"name": "method", "value": "string"},
{"name": "onsuccess", "value": "function"}
]
});
```
api 容器对象上,可以使用 `invoke` 方法调用 api。
```js
jsNative.invoke('net.request', ['my-url', 'GET', data => {}]);
```
api 容器对象上,通过 `map` 方法可以生成一个对象,对象上包含接口直接调用的方法。
```js
let mod = jsNative
.add({
"invoke": "method.json",
"name": "net.request",
"method": "_naNet.request",
"args": [
{"name": "url", "value": "string"},
{"name": "method", "value": "string"},
{"name": "onsuccess", "value": "function"}
]
})
.map({
'net.request': 'fetch'
});
mod.fetch('my-url', 'GET', data => {});
```
api 容器对象上,可以使用 `fromNative` 方法直接从一个 **返回所有接口描述信息的接口** 获取接口并添加。
```js
let mod = jsNative
.fromNative({
"invoke": "method",
"name": "na.getAPIs",
"method": "_na.getAPIs"
})
.map(name => name.slice(name.indexOf('.') + 1));
```
当你不想使用默认的 api 容器对象,或者需要多个 api 容器对象时,可以使用 `createContainer` 方法创建新的 api 容器对象。
```js
let apiContainer = jsNative.createContainer();
```
新的 api 容器对象上拥有 `add` 、`fromNative`、`invoke`、`map` 方法,你可以正常使用它。
```js
let mod = jsNative
.createContainer()
.add({
"invoke": "method.json",
"name": "net.request",
"method": "_naNet.request",
"args": [
{"name": "url", "value": "string"},
{"name": "method", "value": "string"},
{"name": "onsuccess", "value": "function"}
]
})
.map({
'net.request': 'fetch'
});
mod.fetch('my-url', 'GET', data => {});
```
## API
### jsNative
通常,对于一个应用场景,我们倾向于在一个地方管理所有的 Native 通信接口 。所以 jsNative 是 [APIContainer](#apicontainer) 的一个实例,在这个实例上额外提供了:
- [createContainer](#jsnativecreatecontainer) 方法。在不想用默认 [APIContainer](#apicontainer) 实例时,可以创建自己的 [APIContainer](#apicontainer) 实例
- [invokeAPI](#jsnativeinvokeapi) 方法。可以直接调用 Native 通信接口
jsNative 上的其他属性和方法请参考 [APIContainer](#apicontainer) 的文档。
#### jsNative.createContainer
`说明`
创建 [APIContainer](#apicontainer) 实例。
`参数`
- `{Object}` options 参数对象
- `{string=}` options.errorTitle 显示报错信息的标题
- `{string=}` options.namingConflict 名字冲突时的处理策略
详细请参考 [config](#config) 方法
`返回`
[APIContainer](#apicontainer) 实例。
`示例`
```js
let apiContainer = jsNative.createContainer();
```
#### jsNative.invokeAPI
`说明`
通过[通信接口描述](doc/description.md),直接调用。
`参数`
- `{Object} description` [通信接口描述](doc/description.md)对象
- `{Array=} args` 调用参数
`返回`
`{*}` 调用结果
`示例`
```js
let apiList = jsNative.invokeAPI(
{
"invoke": "method.json",
"name": "net.request",
"method": "_naNet.request",
"args": [
{"name": "url", "value": "string"},
{"name": "method", "value": "string"},
{"name": "onsuccess", "value": "function"}
]
},
[
'https://yourdomain.com/path',
'get',
content => {
console.log(content);
}
]
);
```
### APIContainer
通信接口容器类。用于通信接口的管理功能,包括多种注册方式、调用、编译出可被直接调用函数组成的对象等。
#### add
`说明`
添加 Native 通信接口描述
`参数`
- `{Object|Array}` description [通信接口描述](doc/description.md)对象,或多个对象组成的数组
`返回`
`{APIContainer}` this
`示例`
```js
apiContainer.add({
"invoke": "method.json",
"name": "net.request",
"method": "_naNet.request",
"args": [
{"name": "url", "value": "string"},
{"name": "method", "value": "string"},
{"name": "onsuccess", "value": "function"}
]
});
```
#### addProcessorCreator
`说明`
新增 processorCreator ,新增的 processorCreator 可以在描述的 invoke 中进行调用(但不可以冲掉内置的 processorCreator )
`参数`
- `{string}` name 注册的 processorCreator 名称
- `{Function}` processorCreator 的创建函数,需要返回真正的processor
其中 processorCreator 接受三个参数:
- description: 当前调用能力的description
- option: 调用能力时,invoke配置的参数(如:ReturnDecode:JSON 中的JSON)
- apiContainer: 调用能力发生的container对象
processorCreator 的返回值接受调用能力时真正传入的参数
`返回`
`{APIContainer}` this
`示例`
```js
apis.addProcessorCreator(
'ArgAddToken',
function (description, option, apiContainer) {
return function (args) {
return true;
}
}
);
```
#### config
`说明`
配置参数,设置的参数将被合并到现有参数中
`参数`
- `{Object}` options 参数对象
- `{string=}` options.errorTitle 显示报错信息的标题
- `{string=}` options.namingConflict 名字冲突时的处理策略
namingConflict 的取值可以是:
- error: 抛出错误
- ignore: 保留现有api
- override: 覆盖现有api
`返回`
`{APIContainer}` this
`示例`
```js
apiContainer.config({
namingConflict: 'ignore'
});
```
#### fromNative
`说明`
从 `返回所有接口描述信息的接口` 调用的结果,添加调用API。该接口 Native 上的实现必须遵循[如下约束](doc/spec.md#强制-返回所有接口描述信息的接口必须是同步的并遵循如下定义)。
`参数`
- `{Object}` description 要调用的[通信接口描述](doc/description.md)对象
`返回`
`{APIContainer}` this
`示例`
```js
apiContainer.fromNative({
"invoke": "method",
"name": "na.getAPIs",
"method": "_na.getAPIs"
});
```
#### invoke
`说明`
通过描述对象的 name 属性进行调用。
`参数`
- `{string} name` 调用描述对象的 name
- `{Array=} args` 调用参数
`返回`
`{*}` 调用结果
`示例`
```js
apiContainer
.add({
"invoke": "method.json",
"name": "net.request",
"method": "_naNet.request",
"args": [
{"name": "url", "value": "string"},
{"name": "method", "value": "string"},
{"name": "onsuccess", "value": "function"}
]
})
.invoke(
"net.request",
[
'https://yourdomain.com/path',
'get',
content => {
console.log(content);
}
]
);
```
#### map
`说明`
生成一个对象,其上的方法是 API 容器对象中调用描述对象编译成的,可被直接调用的函数
`参数`
- `{Object|Function}` mapAPI 调用描述对象名称的映射表或映射函数
`返回`
`{Object}` 生成的对象
`示例`
```js
apiContainer.add({
"invoke": "method.json",
"name": "net.request",
"method": "_naNet.request",
"args": [
{"name": "url", "value": "string"},
{"name": "method", "value": "string"},
{"name": "onsuccess", "value": "function"}
]
});
// 通过 Object map。mod 对象上包含 fetch 方法,可直接调用
let mod = apiContainer.map({
'net.request': 'fetch'
});
mod.fetch('https://yourdomain.com/path', 'GET', data => {});
// 通过 function map。mod2 对象上包含 request 方法,可直接调用
let mod2 = apiContainer.map(name => name.slice(name.indexOf('.') + 1));
mod2.request('https://yourdomain.com/path', 'GET', data => {});
```
#### setExternalDescriptionProps
`说明`
设置额外的 description 属性列表。
若设置了额外的 description 属性列表,不在列表中的属性将被忽略。该接口应仅用于性能优化,不应改变默认行为。
`参数`
- `{Array}` props 额外的description属性列表
`返回`
无
`示例`
```js
apis.setExternalDescriptionProps(['myProp']);
apis.addProcessorCreator(
'ReadMyProp',
function (description) {
return function () {
return description.myProp;
}
}
);
```
## License
jsNative is [MIT licensed](./LICENSE).