我有一个模块m1
需要初始化才能导入模块m2
:
import * as m1 from 'm1';
m1.init(...)
import * as m2 from 'm2';
我更新了browserify
并从6to5ify
转换为babelify
转换器。之后,我的捆绑中的require
次呼叫被移到了顶部:
...
var _m1 = require('./m1');
var m1 = _interopRequireWildcard(_m1);
var _m2 = require('./m2');
var m2 = _interopRequireWildcard(_m2);
m1.init('init value');
...
为什么require
来电被移到了顶部?调用m2
后,我可以使用ES6模块导入语法导入m1.init
吗?我可以直接使用require
import * as m1 from 'm1';
m1.init(...)
const m2 = require('m2');
我得到了
var _m1 = require('./m1');
var m1 = _interopRequireWildcard(_m1);
m1.init('init value');
var m2 = require('./m2');
但这对我来说似乎是个黑客。
答案 0 :(得分:2)
在调用
import
后,我可以使用ES6模块m2
语法导入m1.init
吗?
无论Babel如何转换此代码,答案是:否。规范要求在评估模块本身之前评估所有依赖项(§15.2.1.16.5)。
这意味着当引擎实际执行代码时,不会评估import
声明。对它们进行静态分析,并以某种方式将此信息添加到模块中,以便在评估模块本身之前评估依赖关系。
即使你发现了一个可以做你想做的事情的转换器,它也不符合规范,你的代码将来可能会破坏。
答案 1 :(得分:1)
进口应被视为ES6中的悬挂值。它们始终位于模块的顶部。您目前依赖于隐式依赖项。如果m2
依赖于m1
不仅被加载,而且还被初始化,那么你应该有一个显式返回m1
初始化版本的模块,那么它应该明确地依赖于它或者通过导入订购,如果您不能直接修改m2
,例如
import * as m1 from 'm1';
m1.init(...)
export default m1;
import m1 from './init-m1';
import * as m2 from 'm2';