“命名空间”是systemJS中的一个导入

时间:2016-07-22 20:00:25

标签: javascript systemjs jspm

我想在SystemJS中使用库ip-address(注意,this question可能看起来很相似,但是在尝试完成此任务时遇到了一个不同的问题。)

库ip-address依赖于util-deprecate。它按如下方式导入:

var util = require('util');

然后按如下方式使用它:

Address4.prototype.toV6Group =
  util.deprecate(Address4.prototype.toGroup6,
    'deprecated: `toV6Group` has been renamed to `toGroup6`');

当我在节点项目中导入ip-address为...

var ipAddress = require('ip-address');

...然后我没有遇到任何问题。

当我在SystemJS项目中导入ip-address时......

System.import('ip-address');

...然后我收到一个错误:

util.deprecate is not a function

如何配置SystemJS以执行此导入?目前我正在配置它......

const map: any = {
  'ip-address':'vendor/ip-address',
  'util':'vendor/util-deprecate'
}

const packages: any = {
  'ip-address': {main:'ip-address.js'},
  'util': {main: 'browser'}
};

为了保存查询,util-deprecate的browser.js文件为here,它直接导出弃用函数。

注意,如果我修改ip-address模块​​以便所有调用都采用以下形式,我可以使用它:

Address4.prototype.toV6Group =
  util(Address4.prototype.toGroup6,
    'deprecated: `toV6Group` has been renamed to `toGroup6`');

如果可以避免,我宁愿不修改第三方库。

2 个答案:

答案 0 :(得分:5)

好的,事实证明问题是我认为 ip-address模块正在使用util-deprecate。事实证明ip-address模块导入util的方式......

var util = require('util');

它不是导入util-deprecate,而是导入Node内置包util。因此,为了ip-address真正使用util-deprecate,必须对ip-address模块进行更改。

答案 1 :(得分:3)

由于您使用进行了标记,因此这是一个非常简单的解决方案。

使用jspm您可以直接从npm安装ip-address,使用:

jspm install npm:ip-address

将为您完成所有依赖管理。

我已经在浏览器中对此进行了测试,并使用示例代码ip-address提供了node.js:

import {Address6} from 'ip-address'

const address = new Address6('2001:0:ce49:7601:e866:efff:62c3:fffe');

console.log(address.isValid());  // true

const teredo = address.inspectTeredo();

console.log(teredo.client4);  // '157.60.0.1'

它完全正常。