javascript - 在javascript中是否可以部分导入“中间模块”?
问题描述
我创建了一个包含许多事物文件的事物文件夹,然后在事物文件夹中创建一个充当“中间模块”的索引。
像这样...
// 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';
...是否可以构建中间模块或导入,以便只加载正在导入的文件?
解决方案
您当前代码的一般设置方式,不,这是不可能的。每当导入一个模块时,它导入的所有内容也将被导入(并且它们的顶级代码将运行)。
一种选择是更改thing1
andthing2
模块,以便它们导出函数,这些函数在运行时会自行加载——这样,它们的初始化可以按需运行,而不是在导入时运行(通常只导入导致的副作用是无论如何都不是一个好主意 - 如果入口点单独可以控制事情何时开始运行,那就更好了):
// 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
)
推荐阅读
- karate - 如果 json 字段具有特殊字符作为点,则访问 json 字段值
- c++ - 集合 vs 无序集合!哪个更好用?
- php - Mysql 没有返回任何行
- node.js - 使用带有反应的 Node.js Npm 包
- php - PHP 正则表达式在最后一次检查中部分失败
- python - 关于一个具体例子的for循环的一个简单问题
- sql-server - 错误:启用历史记录表时“无法继续执行,因为会话处于终止状态”
- java - 在 Android 上不使用 Dropbox API 从 Dropbox 下载 APK
- 3dsmax - 关于使用 maxscript 将法线从一个网格复制到另一个网格
- ansible - Ansible:计算元素并用于条件检查