Почему ES6 импортирует все функции из модуля, а не только запрашиваемую? - PullRequest
0 голосов
/ 01 июля 2019

При импорте функции из модуля все экспортируемые функции импортируются, хотя в main.js была импортирована только одна:

someModule.js:

export let print_a = (function(){
    console.log('Hello from a')
})();

export let print_b = (function(){
    console.log('Hello from b')
})();

main.js:

import { print_a  } from './someModule.js';

index.html:

...
<body>
<script type="module" src="main.js"></script>
</body>
</html>

Поскольку я импортировал только print_a из someModule.js, я ожидал получить вывод:

"Hello from a"

Вместо этого я получил вывод:

"Hello from a"

"Hello from b"

Почему вызывается print_b, хотя он не был импортирован в main.js?

Ответы [ 2 ]

1 голос
/ 01 июля 2019

То, что сказал Чаксмаш, правда.Это IIFEs.Рассматривали ли вы использование функциональных объявлений и затем экспорт с использованием синтаксиса 'require', например, так:

module.exports = function print_a(){
  console.log('Hello from a')
});


module.exports = function print_b(){
   console.log('Hello from b')
});

В качестве альтернативы, вы можете определить функции, а затем просто экспортировать их явно в одном выражении, например, так (вместо назначения каждогофункция для module.exports индивидуально):

module.exports = { print_a, print_b }

И я бы использовал синтаксис require для импорта модуля в файл JS, который будет вызывать следующие функции:

const { printA, printB } = require('./someModule.js')

MajorРазница между require и import заключается в том, что require автоматически сканирует node_modules для поиска модулей, но импорт из ES6 не будет.Большинство людей используют babel для компиляции импорта и экспорта, что делает импорт таким же, как требуется

0 голосов
/ 01 июля 2019

Это оба IIFE , немедленно вызываемые функциональные выражения.Вы выполнили IIFE и присвоили его значение print_b, но не импортировали print_b.Вы можете проверить это, пытаясь сделать console.log(print_b).

...