Вывод модуля ES с помощью webpack
с накопительным пакетом я могу вывести модуль ES, просто установив до 'es'
. Как я могу сделать то же самое с webpack? Если сейчас это невозможно, планирует ли webpack добавить его?
единственное, что я нашел в документация output.libraryTarget
, который упоминает модули ES, это:
libraryTarget: "commonjs-module"
- выставить его с помощью
2 ответов
Webpack2 еще не имеет соответствующего libraryTarget, он не выводит пакеты ES6. С другой стороны, если вы связываете свою библиотеку в CommonJS bundlers, вы не сможете запустить встряхивание дерева, не имея возможности устранить неиспользуемые модули. Это связано с тем, что модули ES все еще развиваются, поэтому никто не отправляет пакеты ES в браузер, а webpack используется в основном для создания пакетов с поддержкой браузера.
С другой стороны, если вы публикуете библиотеку, вы можете предоставить как CommonJS (umd), так и ES цели, благодаря ключ"модуля" в пакете. в JSON. На самом деле вам не нужен webpack для публикации цели ES, все, что вам нужно сделать, это запустить babel на каждом файле, чтобы получить его в стандарт es2015, например, если вы используете react, вы можете запустить babel с помощью предустановки "react". Если ваш источник уже ES 2015 без дополнительных функций, вы можете указать модуль прямо на ваш src / index.js:
//package.json
...
"module": "src/index.js"
"main": "dist/your/library/bundle.js
...
Я нашел удобным использовать babel для обработки export v from 'mod'
инструкции в моем основном индекс.js, поэтому у меня есть 1 файл модуля, экспортирующий все мои модули. Это достигается с помощью babel-plugin-transform-export-extensions (также входит в предустановку stage-1).
Я замечаю этот подход из библиотеки react-bootstrap, вы можете видеть скрипты в их github (они webpack1). Я немного улучшил свои скрипты в my react-sigma repo, Не стесняйтесь, чтобы скопировать следующие файлы, которые будут делать то, что вам нужно:
config/babel.config.js
scripts/buildBabel.js
scripts/es/build.js
scripts/build.js // this is command line controller, if you need just ES you don't need it
Также посмотрите на цель lib (скрипты / lib / build.Яш и.babelrc), я предоставляю lib транспилированные модули, поэтому пользователи библиотеки могут включать только модули, которые им нужны, даже без явного указания ES require("react-sigma/lib/Sigma/"), особенно полезно, если ваш lib тяжелый и модульный!
во-первых, я хотел бы подчеркнуть разницу между commonJS
и commonJS2
CommonJS
не поддерживает использование module.exports = function() {}
используется node.js
и многие другие commonJS
реализаций.
Webpack2
использует концепцию связывания кода библиотеки и для широкого его использования и для обеспечения совместимости работы в разных средах мы используем --libraryTarget опции
теперь часть здесь ответит на оба ваших вопроса
возможные параметры библиотеки, поддерживаемые в webpack2
are
libraryTarget: "umd", // enum
libraryTarget: "umd-module", // ES2015 module wrapped in UMD
libraryTarget: "commonjs-module", // ES2015 module wrapped in CommonJS
libraryTarget: "commonjs2", // exported with module.exports
libraryTarget: "commonjs", // exported as properties to exports
libraryTarget: "amd", // defined with AMD defined method
libraryTarget: "this", // property set on this
libraryTarget: "var", // variable defined in root scope
Interlop имеет следующее значение
для того чтобы ободрить пользу CommonJS и модули ES6, при экспорте
default export
другогоexports
module.exports
будет установлен в дополнение кexports["default"]
как показано в следующем примере
export default test;
exports["default"] = test;
module.exports = exports["default"];
так в основном это означает, что commonJS-module
можно использовать разоблачение это как module.exports
С помощью interloping
С модуль ES2015, завернутый в commonJS
подробнее о interloping
можно найти в этом blogpost и stackoverflow ссылке к нему.
основная идея в ES6
свойства экспорта и импорта среды выполнения не могут быть изменены а в commonJS
это хорошо как требовать изменений во время выполнения поэтому ES2015 и interloped С на CommonJS.
обновление
Webpack 2 дает возможность создания библиотеки, которая может быть в комплекте и включены.
если вы хотите, чтобы ваш модуль использовался в разных средах затем вы можете связать его как библиотеку, добавив параметры библиотеки и вывести его в конкретную среду. Процедура, упомянутая в docs.
еще один простой пример использования commonjs-module
важный момент, чтобы отметить здесь babel
добавляет exports.__esModule = true
для каждого es6 module
и при импорте он вызывает _interopRequire
чтобы проверить это свойство.
__esModule = true
необходимо установить только на экспортировать библиотека. Его нужно установить на exports
на модуль ввода. внутренние модули не нужно __esModule
, это просто Вавилон мотыга.
как указано в документации
__esModule
определено (оно продето нитку как ES2015 модуль взаимодействия режим)
использование, как указано в тесты
export * from "./a";
export default "default-value";
export var b = "b";
import d from "library";
import { a, b } from "library";