每次导入时执行的 ES6 模块代码

ES6 module code executed every time it is imported

ES6模块中的代码是不是每次import一个模块都会执行?我正在使用 webpack,它似乎正是这样做的。

// FormStore.js
import sessionActions from "../../session/actions/session";

// session.spec.js
import sessionActions from "../../../src/session/actions/session";

This causes the code in the session module to be executed twice

我不知道确切的答案,但我怀疑这与业力有关。我认为这是由于有两个不同的捆绑包。

karma.config

preprocessors: {
    "client/specs/index.ts": ["webpack"],
    "client/specs/**/*spec.ts": ["webpack"]
},

webpack: {
    entry: {
        index: "./client/src/index.tsx",
        vendor: []
    }
},

基本上,我真的不需要添加 index 入口点,因为这可能会创建一个额外的包。

  1. 您希望您的代码在导入时执行吗?如果在您的 /session/actions/session 文件中有一个函数调用被导出而不是函数声明,那么它会在您创建的任何包中导入时被调用。您可以在不同的文件中导入不同的模块。

  2. 如果您正在使用 karma-webpack usage

告诉你

webpack: {
        // karma watches the test entry points
        // (you don't need to specify the entry option)
        // webpack watches dependencies

        // webpack configuration
    },

一位同事今天遇到了同样的问题 - 这个问题似乎是由两次导入一个包引起的,但每次导入都使用不同的路径引用该包。您似乎在做同样的事情:

// FormStore.js
import sessionActions from "../../session/actions/session"; // note first path

// session.spec.js
import sessionActions from "../../../src/session/actions/session"; // note second path, which is different from first

session.spec.js中的导入是否可以使用相同的路径导入?如果由于文件的相对位置这不是一个选项,你可以配置你的模块加载器,以便 sessionActions 是别名(使用 mappath,例如)。但是,我不确定这是否适合您的环境。

参见: https://github.com/systemjs/systemjs/blob/master/docs/config-api.md#map 了解如何使用 system.js

执行此操作