我最近在那里做了一个不使用ES6的工作。我有一个ES6背景,只是写了一个大文件,我无法弄清楚如何在不使用ES6的情况下进行测试。
基本上,我有一个主要组件,它有大约7个左右的私有组件,它们大多是作为可读性,测试和性能的独立组件构建的。 (能够对私有组件进行应用组件更新是一个巨大的推动力)
这是我的问题:
没有导出我的私有组件我找不到一种方法来编写测试它们。
因为我们没有使用ES6,所以我不能使用
export default MyComponent
export PrivateComponent1
export PrivateComponent2
语法,我知道从单个文件导出多个组件的唯一方法是使用
exports.MyComponent = MyComponent
exports.PrivateComponent1 = PrivateComponent1
exports.PrivateComponent2 = PrivateComponent2
然而这并不好,因为在require语句中我需要使用
const MyComponent = require('MyComponent').MyComponent
理想情况下,我想使用类似的东西:
module.exports = MyComponent
exports.PrivateComponent1 = PrivateComponent1
exports.PrivateComponent2 = PrivateComponent2
但这似乎没有效果。
此外,最好不要将其分解为单独的文件。
...这就是我没有做TDD的原因:(
答案 0 :(得分:1)
module.exports = MyComponent
exports.PrivateComponent1 = PrivateComponent1
exports.PrivateComponent2 = PrivateComponent2
这是不可能的,因为exports
是module.exports
的别名,设置module.exports
后,exports
中的属性将不会被导出。
发布者(Babel)做的是创建“默认”属性。
所以,ES2015中的以下代码:
import AnotherModule from './anotherModule';
export default class Foo {}
export class Bar {}
将被翻译成:
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Bar = undefined;
var _anotherModule = require('./anotherModule');
var _anotherModule2 = _interopRequireDefault(_anotherModule);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var Foo = function Foo() {
_classCallCheck(this, Foo);
};
exports.default = Foo;
var Bar = exports.Bar = function Bar() {
_classCallCheck(this, Bar);
};
注意第exports.default = Foo;
行和var Bar = exports.Bar = ...
行。
为了在不使用ES2015(既不是转换器)的情况下将该模块导入另一个文件,您使用var Foo = require('./myPreviousModule').default
。
Babel创建一个互操作函数(请参阅函数_interopRequireDefault
),以允许用户以相同的方式导入Node CommonJS模块和ES2015模块。