推迟与巴贝尔import
我正在一个基于ReactJS的大型网站上工作,需要编写一些testing,我可以推迟加载各种模块,因为我需要先build立Sinon。
基本设置看起来像这样
const assert = require('chai').assert; const sinon = require('sinon'); const reducerUtils = require('../../app/utils/reducerUtils'); const connectToReducerStub = sinon.stub( reducerUtils, 'connectToReducer', (stateMap, actionMap) => { console.log(`Connecting to reducer`); } );
在这一点上,我只需要导入一个组件,试图使用reducerUtils.connectToReducer
我已经reducerUtils.connectToReducer
,但我的问题是,如果我喜欢在其他地方的代码库:
import MyComponent from '../../app/components/myComponent.jsx';
导入是作为第一件事(在所有其他事情之前)运行,使得导入和调用reducerUtils.connectToReducer
发生之前,我把它存根。
另一方面,试图通过使用require
来推迟它似乎不起作用:
const MyComponent = require('../../app/components/myComponent.jsx');
这里发生的是MyComponent
只是undefined
。
我正在使用ES6类来定义我的组件:
import react from 'react'; import connectToReducer from '../../utils/reducerUtils'; class MyComponent { ... } export connectToReducer(<stateMap>, <actionMap>)(MyComponent);
在尝试做必要的工作之后,我放弃了,尝试了将SystemJS作为另一个模块加载器,但是它不能像解决方法那样解决path问题,所以似乎大多数模块path必须由手。
正如你注意到的, import
语句在你的模块的其余部分之前被执行。 看到这个答案更多的信息。
它应该和require()
一起工作,但是因为ES6模块有一个“默认导入/导出” (你正在使用)的概念,而require()
没有,所以解决方法是默认导出可以通过default
属性。
换一种说法:
const MyComponent = require('../../app/components/myComponent.jsx').default;
问题是connectToReducerStub
必须返回原始组件或包含另一个组件的组件:
const connectToReducerStub = sinon.stub( reducerUtils, 'connectToReducer', (stateMap, actionMap) => { return component => { const props = ... const wrapper = <MyWrapper><component {...props} /></MyWrapper>; return wrapper; }; } );