JavaScript中的模块导入弊端介绍

795 阅读2分钟

1.命名的导入和自动完成

假设你写了一个简单的JavaScript模块。

// stringUtils.js
export function equalsIgnoreCase(string1, string2) {
  return string1.toLowerCase() === string2.toLowerCase();
}

这是一个模块stringUtils 。该模块有一个命名的出口equalsIgnoreCase ,这是一个比较2个字符串的函数,忽略了大小写。

到目前为止,一切看起来都很好。

现在,让我们尝试在另一个JavaScript模块app 中从stringUtils 模块导入equalsIgnoreCase 函数。

// app.js
import { equalsIgnoreCase } from './stringUtils';
equalsIgnoreCase('Hello', 'hello'); // => true

最有可能的是,你会用下面的方式写代码:

JavaScript Import Module Difficult Autocomplete

首先,你必须写出导入的名字import { } 。在这一步,IDE不能给出任何关于可用的导入名称的建议。

然后你继续写from './stringUtils' 。然后移回大括号,展开自动完成,选择要导入的名字。

尽管ES2015模块有很多优点,但导入模块的语法让人很难使用自动完成。

2.Python中的模块

现在让我们尝试在Python中导入命名的组件。它有同样的问题吗?

下面是在Python中实现的同样的模块stringUtils 和函数equalsIgnoreCase

python

# stringUtils.py
def equalsIgnoreCase(string1, string2):
  return string1.lower() == string2.lower()

在Python中,你不需要明确指出要导出的函数。

现在,在另一个 Python 模块app 内,让我们尝试从stringUtils 中导入函数equalsIgnoreCase

python

# app.py
from stringUtils import equalsIgnoreCase
equalsIgnoreCase('Hello', 'hello') # => true

最有可能的是,你会以下面的方式写app 模块:

Python Import Module Good Autocomplete

在 Python 中,首先指出你要从哪个模块导入:from stringUtils 。然后你写出要导入的内容import ...

如果你想知道可供导入的函数,编辑器已经知道了模块的名称并给出了必要的建议。好多了!

3.解决方案

我能够找到的唯一解决方案是,在JavaScript中对命名的导入启用自动完成功能,这需要向IDE寻求帮助。

例如,在Visual Studio Code中,你可以安装JavaScript(ES6)代码片段插件。

启用该插件后,通过使用imd 代码片断并按下tab 键,光标首先跳到你写模块路径的位置。然后,在按下tab 键后,光标会跳回大括号内的导入位置。下面是它的工作原理。

JavaScript Import Module Autocomplete With Plugin

4.总结

在JavaScript中,导入语法迫使你首先指出你想导入的项目(函数、类、变量),然后指出模块的路径。这种方法对自动完成并不友好。

在 Python 中,恰恰相反,你首先指出模块的名称,然后是你想导入的组件:from stringUtils import equalsIgnoreCase 。这种语法使导入的项目容易自动完成。

通过使用IDE的可能性,比如ES6代码片段插件,你可以缓解JavaScript中命名导入自动完成的问题。还是聊胜于无。

你觉得使用ES模块的自动完成功能有困难吗?如果是的话,你知道什么解决方案?