你知道 JS 中的模塊導(dǎo)入有一個(gè)缺點(diǎn)嗎?
1. 命名導(dǎo)入和自動(dòng)完成
假設(shè)我編寫了一個(gè)簡(jiǎn)單的JavaScript模塊:
- // stringUtils.js
- export function equalsIgnoreCase(string1, string2) {
- return string1.toLowerCase() === string2.toLowerCase();
- }
模塊stringUtils具有導(dǎo)出了一個(gè)函數(shù)exequalsIgnoreCase,該函數(shù)比較兩個(gè)忽略大小寫的字符串。
看起來(lái)沒啥問(wèn)題,挺好的。
現(xiàn)在在 app.js 文件中導(dǎo)入函數(shù) exequalsIgnoreCase
- / app.js
- import { equalsIgnoreCase } from './stringUtils';
- equalsIgnoreCase('Hello', 'hello'); // => true
我們大多數(shù)會(huì)這樣來(lái)引入:
首先,您必須編寫導(dǎo)入名稱import {}。在此步驟中,IDE無(wú)法提供有關(guān)要導(dǎo)入的可用名稱的任何建議。
然后,繼續(xù)寫入 from './stringUtils',然后移回大括號(hào)并展開自動(dòng)完成以選擇要導(dǎo)入的名稱。
盡管 ES6 模塊優(yōu)點(diǎn)很多,但導(dǎo)入模塊語(yǔ)法使自動(dòng)完成功能難以使用。
2. Python 中的模塊
現(xiàn)在讓我們嘗試在 Python 中導(dǎo)入命名組件。它有同樣的問(wèn)題嗎?
下面用 Python 實(shí)現(xiàn)的相同模塊stringUtils和函數(shù)equalsIgnoreCase:
- # stringUtils.py
- def equalsIgnoreCase(string1, string2):
- return string1.lower() == string2.lower()
在 Python 中,不必顯式地指出要導(dǎo)出的函數(shù)。
現(xiàn)在,在另一個(gè)Python模塊app內(nèi)部,將stringUtils導(dǎo)入equalsIgnoreCase函數(shù):
在Python中,首先指出要從:from stringUtils哪里導(dǎo)入的模塊。
如果你想知道可以導(dǎo)入的函數(shù),編輯器已經(jīng)知道了模塊名并給出了必要的建議,這種方式會(huì)更加友好。
3. 解決方法
我能找到的在JavaScript中對(duì)命名導(dǎo)入啟用自動(dòng)完成的唯一解決方案是調(diào)用IDE以獲得幫助。
例如,在Visual Studio Code中, 可以安裝JavaScript (ES6) code snippets插件。
啟用插件后,通過(guò)使用imd代碼段并按tab鍵,光標(biāo)首先跳到編寫模塊路徑的位置。然后,在按下tab鍵后,光標(biāo)會(huì)跳轉(zhuǎn)回花括號(hào)內(nèi)的導(dǎo)入位置。它是這樣工作的:
總結(jié)
在JavaScript中,導(dǎo)入語(yǔ)法會(huì)強(qiáng)制我們先指出要導(dǎo)入的項(xiàng)目(函數(shù),類,變量),然后再指明模塊的路徑。這種方法不太友好。
相反,在Python中,首先指定模塊名稱,然后指定要導(dǎo)入的組件:from stringUtils import equalsIgnoreCase。使用此語(yǔ)法可以輕松自動(dòng)完成導(dǎo)入的項(xiàng)目。
通過(guò)使用IDE的擴(kuò)展插件,例如 ES6 code snippet 插件,可以減輕JavaScript中命名導(dǎo)入自動(dòng)完成的問(wèn)題, 總比沒有好。