在javascript中可以部分导入“中间模块”吗?

时间:2019-08-11 07:39:26

标签: javascript ecmascript-6

我创建了一个包含许多Thing文件的Things文件夹,然后在Thing文件夹内创建了一个充当“中间模块”的索引。

喜欢这个...

// things/thing1.js
console.log('thing1 loaded');

const thing1 = () => {
  console.log('Hi from thing1!');
};

export default thing1;
// things/thing2.js
console.log('thing2 loaded');

const thing2 = () => {
  console.log('Hi from thing2!');
};

export default thing2;

// things/index.js
export { default as thing1 } from './thing1';
export { default as thing2 } from './thing2';

当我从中间模块导入任何文件时...

// anotherFile.js
import { thing1 } from '../things';

thing1();

...所有文件都已加载。

# console output
thing1 loaded
thing2 loaded # <-- don't want this to load.
Hi from thing1!

除了...

import thing1 from './things/thing1';
import thing2 from './things/thing2';

...是否可以构造中间模块或导入,以便仅加载要导入的文件?

1 个答案:

答案 0 :(得分:2)

设置当前代码的一般方法,不,不可能。每当导入模块时,导入的一切也将被导入(并且其顶层代码将运行)。

一种选择是更改thing1thing2模块,以便它们导出功能,这些功能在运行时会自动加载-这样,它们的初始化就可以在需求,而不是每当它们被导入时(仅通过导入而产生的副作用通常都不是一个好主意-如果入口点可以控制事情何时开始运行则更好):

// things/initThing1.js
export default () => {
  console.log('thing1 loaded');

  const thing1 = () => {
    console.log('Hi from thing1!');
  };

  return thing1;
};

// anotherFile.js
import { initThing1 } from '../things';

const thing1 = initThing1();
thing1();

(或者,如果其他模块从index.js导入,也可以在中间模块中初始化)