В чем разница между квалифицированным и неквалифицированным импортом в новом жаргоне модуля JavaScript ES6?

Я столкнулся с этим различием, которое не было хорошо объяснено в ExploringJS.

Квалифицированный и неквалифицированный импорт работают одинаково (оба являются косвенными).

В чем различие и, следовательно, что означает это утверждение?


person Arijit Bhattacharya    schedule 22.01.2016    source источник
comment
См. этот ответ, в котором объясняется концепция квалифицированного и неквалифицированного импорта в Haskell (эта концепция перенесена в ES6). TL;DR, квалифицированный импорт требует, чтобы вы указывали имя модуля, содержащего функцию, при вызове импортируемой функции.   -  person Jules    schedule 22.01.2016
comment
Я искал Stack Overflow с неквалифицированным javascript из-за точно такого же предложения в той же книге, которое, как утверждает Ариджит, не очень хорошо объяснено. Я ценю комментарий @Jules, который перенаправляет на другой ответ, но я не хочу мысленно анализировать Haskell или любой другой язык, чтобы понять эти концепции в JavaScript. Прочитав этот другой ответ, я думаю, что это как-то связано с именованным экспортом по сравнению с экспортом по умолчанию, что приводит к квалифицированному и неквалифицированному импорту, но любое разъяснение/исправление/расширение было бы полезно.   -  person Andrew Willems    schedule 24.05.2016


Ответы (1)


Строго говоря, в JavaScrpit нет такой вещи, как квалифицированный/неквалифицированный импорт. Эти термины использовались в книге доктора Акселя Раушмайера «Изучение ES6» в контексте циклических зависимостей и примерно означают:

Неквалифицированный импорт (прямой импорт части модуля):

CommonJS

var foo = require('a').foo // doesn't work with cyclic dependencies

ES2015

import {foo} from 'a' // can work with cyclic dependencies*

Квалифицированный импорт (импорт всего модуля как пространства имен):

CommonJS

var a = require('a')
function bar() {
  a.foo() // can work with cyclic dependencies*
}
exports.bar = bar

ES2015

import * as a from 'a'
export function bar() {
  a.foo() // can work with cyclic dependencies*
}

В ES2015 импорт по умолчанию также может быть квалифицированным импортом (хотя некоторые люди не согласны), если они служат пространством имен:

export default {
  fn1,
  fn2
}

* с циклическими зависимостями вы не можете получить доступ к импорту в теле модуля:

import {foo} from 'a' // 'a' is a cyclic dependency
foo() // doesn't work
person marzelin    schedule 09.09.2016
comment
Нет, объект, экспортируемый по умолчанию, не квалифицирован. - person Bergi; 09.09.2016