Как правильно настроить экспериментальный модуль ECMAScript, чтобы импорт / экспорт можно было использовать в Node.js - PullRequest
0 голосов
/ 26 апреля 2018

Время летит, и теперь Node.js ver.10.0.0 для публики.Пока я работаю со своим стеком MERN, часто приходится переключаться между синтаксисом ES6 import/export для внешнего интерфейса (React.JS) и синтаксисом CommonJS module.exports/require на моей стороне сервера Node / Express.И мне бы очень хотелось, чтобы стиль письма мог быть унифицирован в import/export в ближайшее время без использования Babel и получения его от нативной поддержки.

Хорошая новость - с прошлого года, когда я прочитал сообщение Джеймсана Medium , что связано с трудностями реализации модульной системы ES6 в Node.js, экспериментальные модули ECMAScript в настоящее время стабильно работают некоторое время, что означает, что его можно включить с помощью флага --experimental-modules.

Однако, когда я пытаюсь использовать синтаксис import/export на узле, он никогда не работает.Например, я попробовал это:

import fs from 'fs';
console.log(typeof fs.readFile);

Приведенный выше код выдаст мне ошибку:

(function (exports, require, module, __filename, __dirname) { import fs from 'fs';
                                                                     ^^
SyntaxError: Unexpected identifier

Я действительно уверен, что включил экспериментальный флаг, называемый $node --experimental-modulesИтак, что мне действительно нужно сделать, чтобы запустить экспериментальный модуль ES6 import/export, работающий на моем локальном сервере Node?Что я пропустил?


Добавлено:

Причина, по которой я хочу попробовать эту экспериментальную функцию, состоит в том, чтобы иметь согласованный стиль кодирования как спереди, так и сзади.И поскольку он теперь доступен изначально, поэтому я хочу подготовиться к нему.Как только это будет достигнуто на этапе 2, я смогу быстро адаптироваться к import/export и испытывать меньше боли.

Но, очевидно, Google (ref) и AirBnb (ref) имеют разные точки зрения на то, следует ли нам использовать синтаксис import/export или нет в их руководстве по стилю кода.И, основываясь на Google, я все еще удивляюсь, что семантика импорта / экспорта ES6 еще не завершена, пока ECMA2019 находится в процессе.Мне просто интересно, когда я действительно смогу использовать import/export в своем проекте, или что действительно нужно завершить?


Обновлено:

Послеуказано Jaromanda X , если я изменил имя своего файла на .mjs, то это сработает.Первоначально я думал, что модуль для загрузки должен быть назван в расширении .mjs, но, похоже, я ошибся.Однако, если это так, это означает, что мне нужно будет переименовать все мои файлы проекта в .mjs ... и это не привлекательно.Интересно, есть ли способ использовать эту функцию в традиционном файле .js?Что я должен настроить?

1 Ответ

0 голосов
/ 28 апреля 2018

В этот момент Модуль ECMAScript еще не завершен в файле node.js v10, поэтому его не рекомендуется использовать в производственной среде.Поскольку использование import/export стандартизировано в спецификации ECMAScript, поэтому, независимо от того, каким образом, узлу важно обеспечить такую ​​поддержку для сообщества.

Основные различия между require() и ECMAScriptМодуль - это то, как узел будет обрабатывать свой кеш.В отличие от require(), пока Модуль ECMAScript не имеет такого API для манипулирования кешем модуля.Кроме того, неизвестно, будет ли он напрямую поддерживаться в обычных *.js файлах без загрузчика, так что следите за обновлениями.

В данный момент мы пытаемся ввести новый файл *.mjs для его явного отображения.использовался стандартный модуль JS (в соответствии с ES6), но если внимательно прочитать doc , вы действительно сможете увидеть, что также можно указать собственное соответствие расширений, включая использование более традиционного *.js,Однако для загрузки дополнительной конфигурации потребовалось больше конфигураций и использование флага --loader.

Поддерживается 6 различных форматов, включая один для модулей, написанных на C ++ (этотакже может быть загружен require()), что очень мощно.Короче говоря, для использования *.js расширения файла, настройка ключа в загрузчике должна иметь:

const JS_EXTENSIONS = new Set(['.js', '.mjs']);

И функция загрузчика должна будет проверить, как будто загружаемый файл находится в JS_EXTENSIONSнабор данных.Здесь ключом функции загрузчика является то, что он должен возвращать объект, который имеет два свойства: url и format, то есть:

return {
  url: (...),    // e.g. './x?n=1234'
  format: 'esm', // there are 5 + 1 dynamic formatting
};

. Рекомендуется назвать загрузчик * 1035.* и используйте его как $node --experimental-modules --loader ./custom-loader.mjs, так как он был продемонстрирован в официальном doc .После того, как вы правильно настроили загрузчик (в зависимости от того, что вам нужно), вы сможете использовать import/export, как если бы вы могли использовать приложение внешнего интерфейса в вашем проекте узла.

...