【问题标题】:require is called earlier as import statementrequire 之前被称为 import 语句
【发布时间】:2015-07-22 16:11:04
【问题描述】:

我有一个模块 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 呼叫被移到顶部?我可以在调用m1.init 之后使用ES6 模块导入语法导入m2 吗?我可以直接使用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');

但这对我来说似乎是一种黑客行为。

【问题讨论】:

    标签: browserify ecmascript-6 babeljs


    【解决方案1】:

    在 ES6 中,导入应该被认为是提升的值。它们始终位于模块的顶部。您当前依赖于隐式依赖。如果m2 依赖于m1 不仅被加载,而且还被初始化,那么你应该有一个显式返回m1 的初始化版本的模块,那么它应该取决于显式或通过导入排序如果你不能直接修改m2,例如

    init-m1.js

    import * as m1 from 'm1';
    m1.init(...)
    export default m1;
    

    init-m2.js

    import m1 from './init-m1';
    import * as m2 from 'm2';
    

    【讨论】:

      【解决方案2】:

      我可以在调用m1.init 后使用ES6 模块import 语法导入m2 吗?

      无论 Babel 如何编译这段代码,答案都是:。规范规定所有依赖项都在评估之前评估模块本身 (§15.2.1.16.5)。

      这意味着当引擎实际执行代码时,不会评估 import 声明。它们被静态分析,并以某种方式将这些信息添加到模块中,以便可以在评估模块本身之前评估依赖关系。


      即使您找到了一个可以做您想做的事情的转译器,它也不符合规范,并且您的代码将来可能会中断。

      【讨论】:

        猜你喜欢
        • 2017-06-07
        • 1970-01-01
        • 2020-04-12
        • 2021-06-05
        • 2019-09-23
        • 2012-12-16
        • 1970-01-01
        • 2018-04-15
        • 2013-10-07
        相关资源
        最近更新 更多