как разделение кода работает с импортом / экспортом и babel и webpack? - PullRequest
0 голосов
/ 15 сентября 2018

Я пытаюсь ответить,

когда использовать import / export и когда использовать require () / module.exports ? Но, как я пытаюсь копать, это кажется сложным.

Вот мое понимание

  • require () / module.exports: это реализация nodejs системы модулей. Это загружает модули синхронно.
  • с es6, мы можем использовать импорт / экспорт. Документы говорит

Оператор import используется для импорта привязок, которые экспортируются другим модулем. Импортируемые модули находятся в строгом режиме независимо от того, объявляете ли вы их как таковые или нет. Оператор импорта не может использоваться во встроенных сценариях, если такой сценарий не имеет type = "module".

Ques1 : Как это работает с babel, webpack или браузерами в целом?

Во время изучения я столкнулся с такими вещами, как CommonJ, requireJs, Asynchronous Module Definition (AMD)

Ques2 : Меня больше интересует знание временной шкалы о том, как эти вещи развивались в javascript?

Ответы [ 3 ]

0 голосов
/ 15 сентября 2018

Веб-пакет, который делает упаковщик, выглядит следующим образом:

  1. Вы указываете входной файл в конфигурации
  2. Вы указываете выходной файл конфигурации

Webpack будет просматривать все файлы, которые входной файл requires (модульная система commomJS) или imports (модульная система ES6).Затем он направляет код на основе расширения имени файла через загрузчики. Загрузчики могут преобразовывать отдельные файлы в код, понятный браузеру.Пример загрузчика - babel или компилятор sass / scss.

После того, как различные файлы передаются с загрузчиками, плагины могут работать над преобразованием связки сгенерированного кода в нечто другое.Пакет представляет собой просто набор кода, который вместе образует часть функциональности

. Он не будет вдаваться в подробности во внутреннем веб-пакете, но самое важное, что нужно понять:

Вы используете веб-пакет, поэтому вы можете разделить код на несколько файлов, что делает их более удобными в обслуживании и облегчает работу с ними.Однако тогда запрос всех этих файлов клиентом был бы ужасен для производительности (много HTTP-запросов накладных расходов).Поэтому мы объединяем файлы в один файл или пару, чтобы уменьшить эти накладные расходы.

0 голосов
/ 28 декабря 2018

Как правило, вы должны писать весь современный код с синтаксисом импорта / экспорта, если вы используете такой пакет, как веб-пакет, или перевод с модулями Babel ... npm может предпочесть синтаксис require / module, но вы все равно можете их импортировать.

Также стоит отметить метод import(), который возвращает обещание, которое должно разрешиться для асинхронного импорта корневого модуля.Webpack может связывать их как асинхронные модули, если вы настроили это для этого.

На практике разрешение с помощью таких инструментов, как babel и webpack, откатится к поведению в стиле узла по сравнению с поиском node_modules, где стандарттранспортные пути, благоприятные относительные пути.Дополнительная поддержка для каждой среды.

Вы можете поэкспериментировать с поддержкой esm в современных браузерах и в текущем узле (за флагом на момент ответа).Поведение несколько противоречиво, но четко определено.Если сомневаетесь, поэкспериментируйте и попробуйте.

0 голосов
/ 15 сентября 2018

Как это работает с babel, webpack или браузерами в целом?

Babel и Webpack следуют спецификации ES и переносят оператор import / export в один файл. Поскольку они также поддерживают синтаксис require, они обычно переносят операторы import в вызовы require() и операторы export в module exports, а затем поставляются с пользовательским загрузчиком для модулей. Если вы получили, например, :

 // A.js
 export default function() { }

 // B.js
 import A from "./A";
 A();

Затем он преобразуется в следующий синтаксис require:

 //A.js
 exports.default = function() {};

 //B.js
 var A = require("./A").default;
 A();

Это может затем быть обернуто во что-то вроде:

 (function() { // prevent leaking to global scope
   // emulated loader:
   var modules = {};

   function require(name) { return modules[name]; }

   function define(name, fn) {
     var module = modules[name] = { exports: {} };
     fn(module, module.exports, require);
   }


  // The code:
  define("A", function(module, exports, require) {
      // A.js
     exports.default = function() { };
  });

  define("B", function(module, exports, require) { 
    // B.js
   var A = require("A").default;
    A();
  });
 })();

как эти вещи развивались в javascript?

Несколько лет назад написание JS было ограничено браузерами, и единственный способ загрузить несколько источников js - это использовать несколько тегов <script> и использовать глобальный объект для обмена функциями. Это было некрасиво.

Затем были изобретены Nodejs, и им нужен был лучший способ работы с модулями, и они изобрели вещь require().

Авторы спецификации увидели потребность в собственном синтаксисе для этого, поэтому было введено import / export.

Вавилон и другие тогда писали транспортеры.

...