当前位置: 首页 > 知识库问答 >
问题:

如何有条件地导入ES6模块?

邓欣德
2023-03-14

我需要做一些事情,比如:

if (condition) {
    import something from 'something';
}
// ...
if (something) {
    something.doStuff();
}

上面的代码无法编译;它抛出语法错误:...“导入”和“导出”只能显示在顶层。

我尝试使用System.import,如下所示,但我不知道系统来自哪里。这是一个最终没有被接受的ES6提案吗?该文章中指向“编程 API”的链接将我转储到一个已弃用的文档页面。

共有3个答案

狄宗清
2023-03-14

您不能有条件地导入,但可以做相反的事情:有条件地导出某些内容。这取决于您的用例,因此这种解决方法可能不适合您。

你可以做:

应用程序.js

import mockAPI from './mockAPI'
import realAPI from './realAPI'

const exportedAPI = shouldUseMock ? mockAPI : realAPI
export default exportedAPI

apiConsumer.js

import API from './api'
...

我用它来模拟mixpanel等分析库,因为我目前不能有多个构建或我们的前端。不是最优雅的,但很有效。根据环境的不同,我只是在这里和那里有几个“如果”,因为在mixpanel的情况下,它需要初始化。

霍伟彦
2023-03-14

如果你愿意,你可以使用require。这是一种拥有条件要求语句的方法。

let something = null;
let other = null;

if (condition) {
    something = require('something');
    other = require('something').other;
}
if (something && other) {
    something.doStuff();
    other.doOtherStuff();
}
令狐珂
2023-03-14

我们现在确实有ECMA的动态进口提案。这是在第 3 阶段。这也可以作为 babel 预设使用。

以下是根据您的情况进行条件渲染的方法。

if (condition) {
    import('something')
    .then((something) => {
       console.log(something.something);
    });
}

这基本上是一个promise。promise的解决方案预计将包含该模块。该提案还具有其他功能,如多个动态导入、默认导入、js文件导入等。您可以在此处找到有关动态导入的更多信息。

 类似资料:
  • 问题内容: 我需要做类似的事情: 上面的代码无法编译;它抛出。 我尝试使用此处所示的方法,但是我不知道从哪里来。这是没有最终被接受的ES6提案吗?该文章中指向“编程API”的链接将我转至不推荐使用的docs页面。 问题答案: 现在,ECMA确实有动态进口建议。这是在第3阶段。这也可以作为babel-preset使用。 以下是根据您的情况进行条件渲染的方法。 这基本上返回了一个承诺。承诺解决方案有望

  • 问题内容: 我开始认为这是不可能的,但是无论如何我都想问。 我想测试我的一个ES6模块以特定方式调用另一个ES6模块。有了茉莉花,这非常容易- 应用程式码: 和测试代码: 笑话相当于什么?我觉得这是一件很想做的简单的事,但是我一直在努力尝试弄清头发。 我最接近的是将s 替换为s,并将其移入测试/函数中。都不是我想做的事情。 为了获得加分,我希望在其中的功能为默认导出时使整个工作正常进行。但是,我知

  • 用例很简单:我只想导出一个名称与导入时相同的对象。 例如: 但这并不起作用。我必须写: 但这很奇怪。正确的方法是什么? 更新: 感谢帮助和参考。我用许多线索解决了我的问题。下面给大家分享一些我常见的案例和解决方法。

  • 问题内容: 我想基于从客户端传递的String参数注入一个bean。 我希望基于传递的参数注入报表实例。任何帮助将不胜感激。提前致谢 问题答案: 使用工厂方法模式: 当您使用以下命令调用控制器时,Spring可以创建报告类型: 但是,它非常笨拙,并且每次添加新报告类型时都需要进行修改。如果报告类型列表已修复,则可以。但是,如果您计划添加越来越多的类型,这将是一个更可靠的实现: 通过此实现,添加新的

  • 问题内容: 我在玩和使用和。我想在不同的文件中构建多个组件,将其导入单个文件并将其捆绑在一起 假设我有几个这样的组件: my-navbar.jsx main-page.jsx 使用webpack并按照其教程进行操作,我有: 构建项目并运行它之后,在浏览器控制台中出现以下错误: 我究竟做错了什么?如何正确导入和导出组件? 问题答案: 尝试 默认设置 组件中的导出: 通过使用默认值,您表示将成为该模块

  • 问题内容: 我的目录结构如下: 从导入模块。我尝试结合使用with ,但是使用该方法,我只能在using下直接导入所有子模块。我想让他们全都陷入困境。导入的所有子模块的最干净的方法是什么,以便可以从中访问? 编辑:对不起,我有点含糊。我想在运行时导入子模块,而不在中明确指定它们。我可以用来获取子模块名称(除非有人知道更好的方法),但是我不确定使用这些名称(或者返回的ImpImporters ?)导